可靠消息的最终一致性
2020-07-10 本文已影响0人
MisAutumn
事务发起方执行完事务后发送一条消息,事务的参与方一定能够接收到消息并处理事务成功。强调最终一致。
- 本地事务和消息发送的原子性
事务发起方在本地事务执行成功后消息必须发出,要不就都失败。 - 事务参与方接受消息的可靠性
事务参与方必须能接收到消息,接收失败消息要被重复发送 - 消息重复消费问题
要实现事务参与方的方法幂等性
解决方案:
- 本地消息表+定时任务 (交易)
通过本地事务保证数据操作和消息的一致性,然后通过定时任务将消息发送给消息中间件,确认消息发送成功后删除消息。
a.数据操作和写入消息日志表在本地事务中具有一致性(业务+日志)
b.启动独立线程,定时任务扫描日志并发送给消息中间件,收到成功反馈后删除日志
c.消费消息可使用MQ的ack机制,消费方接收到消息并处理完成后发送确认,否则MQ将不断重复发送消息
- RocketMQ事务消息方案
- 最大努力通知 (交易后的通知)
目标:发起通知方尽最大努力将业务结果发给接收通知方。
具体:
a.有消息重发机制
b.有校对机制:如果尽最大努力也没通知到,或者接收方消费后要重复消费,此时可由接收方主动向通知方查询,通知方需要提供查询接口。