欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

RabbitMQ 消息的可靠投递

程序员文章站 2022-07-11 08:20:53
mq 提供了两种方式确认消息的可靠投递 confirmCallback 确认模式 returnCallback 未投递到 queue 退回模式 在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ 为我们提供了两个选项用来控制消息的投递可靠性模式。 ......

mq 提供了两种方式确认消息的可靠投递

  • confirmcallback 确认模式
  • returncallback 未投递到 queue 退回模式

 

在使用 rabbitmq 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。rabbitmq 为我们提供了两个选项用来控制消息的投递可靠性模式。

rabbitmq 整个消息投递的路径为:
producer->rabbitmq broker cluster->exchange->queue->consumer

message 从 producer 到 rabbitmq broker cluster 则会返回一个 confirmcallback 。
message 从 exchange->queue 投递失败则会返回一个 returncallback 。我们将利用这两个 callback 控制消息的最终一致性和部分纠错能力。

 

对于消息异常,可以使用以下方法进行解决

  1. 使用republishmessagerecoverer这个messagerecoverer会发送发送消息到指定队列
  2. 给队列绑定死信队列,因为默认的republishmessagerecoverer会发送nack并且requeue为false。这样抛出一场是这种方式和上面的结果一样都是转发到了另外一个队列。详见deadletterconsumer
  3. 注册自己实现的messagerecoverer
  4. 给messagelistenercontainer设置recoverycallback
  5. 对于方法手动捕获异常,进行处理

 

rabbittemplate的发送流程是这样的:
1 发送数据并返回(不确认rabbitmq服务器已成功接收)
2 异步的接收从rabbitmq返回的ack确认信息
3 收到ack后调用confirmcallback函数
注意:在confirmcallback中是没有原message的,所以无法在这个函数中调用重发,confirmcallback只有一个通知的作用

 

 

 

 

 

参考文献:

https://segmentfault.com/a/1190000016041620

https://www.jianshu.com/p/6579e48d18ae

https://github.com/littlersmall/rabbitmq-access/blob/master/src/main/java/com/littlersmall/rabbitmqaccess/mqaccessbuilder.java

https://www.jianshu.com/p/6579e48d18ae