最大努力通知概念
最大努力通知是分布式事务中一种常见的解决方案,事务发起方会通过一定的机制下将业务处理的结果尽可能的通知下游业务接收方
类似常见的充值系统
- 用户充值完成之后,充值中心需要回调业务系统告知用户充值的结果
- 若当次通知失败或未收到业务系统的正常响应的时候应该继续通知
- 业务系统在未接受到通知的时候,充值系统也应该提供查询接口供业务主动查询
核心逻辑
- 消息重复通知的机制: 对方无应答需要重试机制重复通知
- 消息校对机制: 最大努力通知不是无限次的一直通知,当通知次数达到阈值之后将不会再继续通知,此时需要上游服务提供一个能力供下游业务系统查询消息
最大努力通知和可靠性消息的区别
- 解决方案思想不同
- 可靠性消息: 保证是发起通知方一定会将消息发送出去,并且消息会被接收方消费.消息的可靠性关键由发起通知方保证
- 最大努力通知: 发起通知方尽最大可能将业务处理结果通知下游接收方,但是消息可能会接收不到,此时需要接收方主动调用发起方的业务查询接口获取业务处理结果,通知的可靠性关键在于接收方
- 应用场景不同
- 可靠性消息: 关注是交易过程中的事务一致性,以异步方式完成交易
- 最大努力通知: 关注交易后的通知事务
- 技术解决方向不同
- 可靠性消息: 解决的是消息从发出到接受的一致性
- 最大努力通知: 无法保证消息从发出到接受的一致性,只提供消息接受的可靠性机制.将尽最大努力通知接收方,在消息无法被接收方接收时,由接收方主动查询消息结果
实现方案
方案一
- 利用MQ的ACK机制由MQ向接收方发送通知
- 发起方交消息发送给MQ(普通消息)
- 接收方监听MQ
- 接收方接收到消息之后,业务处理完成回复ACK
- 接收方若没有回复ACK,MQ则会重复通知
- 以RocketMQ为例会按照间隔1min 5min 10min 30min 1h 2h 5h 10h的方式逐步拉大通知间隙(可在broker中配置),直到达到通知通知时间窗口上线
- 接收方可以通过调用发起方的接口来对消息进行一致性校验
- 该方案要求业务发起方和业务接收方在一个内部系统中,依赖同一个MQ服务
方案二
- 业务发起方处理完业务之后发送处理结果到MQ
- 专门一个服务通知的微服务接受消息 若通知微服务或者程序没有返回ACK则MQ重复通知
- 服务通知的微服务通过网络协议(http webservice等)调用接收方的接口完成通知
- 若接收方正常响应服务通知微服务表示消息达到,此时消息通知微服务回应MQ ACK,此时MQ将不在继续投递消息
- 接收方也可以通过业务发起方提供的查询接口进行消息一致性校验
- 该方案适合业务发起方和处理结果接收方分布在不同的环境/公司/项目中
总结
- 最大努力通知是分布式事务中对一致性要求最低的一种,适用于一些最终一致性时间敏感度较低的业务
- 最大努力通知主要需要实现功能 1. 消息重复通知机制 2.消息校对机制