1、什么是生产端的可靠性投递?

  • 保证消息的成功发出
  • 保障MQ节点的成功接收
  • 发送端收到MQ节点(Broker)确认应答
  • 完善的消息进行补偿机制

2、BAT/TMD互联网大厂的解决方案

  • 方案一:消息落库,对消息状态进行打标
  • 方案二:消息的延迟投递,做二次确认,回调检查

3、方案一架构图

8TMNAs.png

==注意:实际应用中很少使用事务,一般都是使用补偿操作。==

  • I/O操作太多,在高并发环境下不适合,应该减少IO操作
  • 所以出现第二种方案

4、方案二架构图

8Tl3wQ.png

  • Step1注意:数据入库之后在进行消息发送
  • 消息在消费成功后生成一条新的消息发送到Confirm队列,有一个单独的服务(Callback service)监测这个下游服务的处理结果,发现消息消费成功了,就进行持久化存储。
  • 二次投递的队列和第一次投递的队列不是一个队列。Callback service监听这个队列,然后进行检查(数据库<—>消息),成功就什么都不做。失败的话返回一个重发命令,带有一些标志性ID,然后发送端去BIZ DB中查找该消息并重发。