1. 前言
在与不同业务系统之间进行交互时,怎么保证发送的消息对方一定能收到,可能有人说RocketMQ就能做到,如果贵公司用到的消息队列是kafka、rabbitmq、activemq怎么保证不丢?
这里分享一下基于消息的分布式事务解决方案,此种方案是最终一致性的解决方案,不挑MQ,但是前提MQ本身要支持接收到的消息不能丢失。
2. MQ的配置建议
如果要保证MQ接收到的消息不丢,就要配置相关的同步策略或者刷盘策略
主从同步策略
建议主从同步建议设置为主从同步策略为主从同步完再响应,这样单个节点如果挂了,另一个节点的数据还会存在
刷盘策略
消息中间件为了提高效率,默认接收到消息不会立即刷盘,如果要主从同步策略是主节点接收到消息以后立即响应,这会正好主节点宕机,就会导致消息丢失,所以要特别注意下,虽然可以设置成同步刷盘,但是效率就会降低,所以还是建议设置主从同步策略
3. 生产方设计
生产者的职责是必须要保证本地事务提交成功消息一定要发送出去,或者业务处理失败就不发送。
3.1 消息持久化
生产方方案如下,首先需要在业务库中创建一张表,字段大致为:
- 消息id
- 业务id
- 业务