Rabbitmq 1.消息如何保障 100%投递成功?
什么是生产端的可靠性投递?
- 保障消息的成功发出
- 保障MQ节点的成功接收
- 发送端收到MQ节点(Broker)确认应答
- 完善的消息进行补偿机制
补偿机制的时机:网络抖动
1,注意点:落库前是否加事务?
第一步:消息入库,持久化,快速失败
第二步:发消息
第三步:broker确认,生产端确认监听,confirm Listener
注意: 第三步失败,网络失败,分布式定时任务
第四步: 修改状态(发送中 --》 发送成功)
第五步: get status == 0
分布式定时任务:隔了几分钟才重发
第六步: Retry Send (重发逻辑,还要设计一下,避免正常业务也重发了)
第七步: Retry Count > 3 ,status : 2
人工问题,也要解决:注意一定要解决
(上面第一种适合小系统)下面介绍第二种方案,高并发
高并发:减少数据库持久化操作,毫秒级别
方案如下:
注意点:1.一定要等到数据库入库完之后,再去发消息
2.高并发不用事务
3.一次性生成两条消息,第二条是延迟消息(N分钟后发送),投递的队列不一致,消息一样
4.检查消息是否已经成功
第二种方案补偿机制:
1.RPC Resend Command ,MSG DB找不到,要让上游重新再发
2.异步补偿 Callback service, 补偿服务
3.减少DB