最大努力通知
用途:对接不可控的外部系统(银行、支付、第三方回调)时查阅
定义
「定义」小节链接最大努力通知(Best-Effort Notification)是面向外部系统的弱一致方案:服务方按逐渐稀疏的时间序列反复通知同一事件(如 1min、5min、10min、30min、2h、6h、24h),达到次数上限后停止;接收方必须主动查询接口作为兜底,双方再通过对账收敛。
三个组成部分:
- 通知重试:有限次、退避间隔、可查询的投递记录。
- 主动查询接口:接收方可随时以业务号查询权威状态。
- 定期对账:比对双方流水,发现漏通知与状态偏差并修复。
与其他方案的边界
「与其他方案的边界」小节链接| 方案 | 双方是否可控 | 一致性强度 | 典型场景 |
|---|---|---|---|
| 2PC/XA | 完全可控、同机房 | 强 | 同企业内多库 |
| TCC | 可控 | 接近强 | 资金/资源预留 |
| Saga | 可控 | 最终 | 长流程 |
| 本地消息表/事务消息 | 自己可控 | 最终 | 内部服务与中间件 |
| 最大努力通知 | 对方不可控 | 弱、靠对账收敛 | 支付回调、外部开户、跨企业对接 |
关键区别:外部系统的可用性、延迟与实现细节都不由自己决定,因此不能假设“通知一定会被处理”。
实现要点
「实现要点」小节链接- 业务幂等键:通知与查询共用同一业务号,接收方重复处理无副作用。
- 签名与防篡改:外部通道必须验签,且明确重放防护(时间戳 + 随机串)。
- 投递记录可查:每次通知结果落库,便于回答“到底通知过没有”。
- 接收方要有终态保护:已终态的单据不接受旧通知回退(用版本号或状态机守卫)。
- 对账文件/接口:日终比对,差异生成待处理任务,而不是只报警。
常见误区
「常见误区」小节链接| 误区 | 修正 |
|---|---|
| 只做通知,不做查询接口 | 通知丢失时对方无自救手段,问题全部升级成人工 |
| 通知次数无限重试 | 无上限重试会放大故障,必须有上限 + 对账兜底 |
| 接收方不校验状态顺序 | 迟到通知把已完成单据改回中间态 |
| 把对账当报表 | 对账必须产出可执行的差异修复任务 |
| 只监控成功率不监控延迟 | 延迟突增是通道故障的前兆 |
延伸阅读
「延伸阅读」小节链接- 支付宝/微信支付等公开对接文档中的异步通知 + 主动查询 + 对账范式
- Chris Richardson《微服务架构设计模式》第 9 章(与不可控服务集成的模式)