什么是生产端的可靠性投递?
- 保障消息的成功发出
- 保障MQ节点的成功接收
- 发送端收到MQ节点(Brker)确认应答
- 完善的消息进行补偿机制
互联网大厂的解决方案:
1.消息落库,对消息状态进行打标
第一步,将业务、消息入库,如果第一步失败直接快速失败
第二步,将消息发送出去
第三步,将收到消息的应答(confirm)返回给生产端
第四步,将消息状态从0->更新成1(表示发送成功)
第五步,分布式定时任务获取消息状态为0的消息
第六步,重新投递回到第二步
第七步,如果重试次数大于3,那么将消息状态从0->更新成2(表示失败)
缺点
:在高并发场景下数据库IO太频繁。
2.消息的延迟投递,做二次确认,回调检查
第一步,业务入库,第一次消息的发送
第二步,延迟消息投递检查
第三步,消费端监听处理消息
第四步,返回confirm确认消息
第五步,监听确认消息,Callback服务接收到则存储到数据库
第六步,Check Detail接收到延迟消息投递,Callback服务检查数据库是否存储了该消息,没有则重发消息,回到第一步