rabbitmq消耗者应答模式

[复制链接]
发表于 2026-1-13 07:35:33 | 显示全部楼层 |阅读模式
1.应答模式

RabbitMQ 中的消息应答模式告急包罗两种:自动应答(Automatic Acknowledgement)和手动应答(Manual Acknowledgement)。

  •         自动应答
不在乎消耗者对消息处理惩罚是否乐成,都会告诉队列删除消息。假如处理惩罚消息失败,实现自动赔偿(队列投递已往 重新处理惩罚)。

  •         手动应答
  •         在手动应答模式下,消耗者在吸收到消息后并不会立刻向RabbitMQ确认消息已处理惩罚完毕。消耗者必要显式调用basicAck方法来确认消息处理惩罚完成,RabbitMQ只有在吸收到消耗者简直认后才会将消息从队列中删除。
  •         采取手动应答可以进步消息的可靠性,纵然消耗者在处理惩罚消息过程中出现标题,只要未发送ack确认,RabbitMQ会在重新毗连后再次将消息发送给该消耗者。
  •         假如消耗者在处理惩罚消息前断开了毗连,大概在处理惩罚消息期间抛出了未捕获的非常,RabbitMQ会以为消息未被精确处理惩罚,从而重新列队消息,确保消息至少会被消耗一次(at least once delivery)。
                        方法
                                                作用
                                                Channel.basickAck
                                                用于肯定确认
                                                Channel.basickNack
                                                用于否定确认(可以处理惩罚单个消息或多个消息)
                                                Channel.basickReject
                                                用于否定确认(只能处理惩罚单个消息)
                        https://lxblog.com/qianwen/share?shareId=f193de32-458e-400d-82e2-6dc72c43bf6e
2.SpringBoot怎样实现两种应答。

2.1自动应答

在Spring Boot的设置文件application.properties中,对于RabbitMQ监听器,设置自动应答模式:
  1. # 自动应答模式
  2. spring.rabbitmq.listener.simple.acknowledge-mode = auto
复制代码
  1. @Component
  2. public class AutoAcknowledgementConsumer {
  3.     @RabbitListener(queues = "yourQueue")
  4.     public void consumeMessage(String message, Message amqpMessage) {
  5.         // 处理消息...
  6.         // 框架会在方法执行完成后自动发送ack确认消息
  7.     }
  8. }
复制代码

2.2 手动应答

起首,同样在设置文件中启用手动应答模式
  1. # 手动应答模式
  2. spring.rabbitmq.listener.simple.acknowledge-mode = manual
复制代码


3.怎样办理死循环?重试机制

  1. #应答模式
  2. spring.rabbitmq.listener.simple.acknowledge-mode=AUTO
  3. #批量预抓取数量,提高执行效率,一次性捆绑抓取的消息数量
  4. spring.rabbitmq.listener.simple.prefetch = 10
  5. #开启消费者重试机制
  6. spring.rabbitmq.listener.simple.retry.enabled = true
  7. #重试的最大次数
  8. spring.rabbitmq.listener.simple.retry.max-attempts = 6
  9. #重试间隔时间
  10. spring.rabbitmq.listener.simple.retry.initial-interval = 3000
  11. #重试间隔倍数,默认值是1
  12. spring.rabbitmq.listener.simple.retry.multiplier = 2
  13. #最大间隔时间,默认值是10s
  14. spring.rabbitmq.listener.simple.retry.max-interval = 15000
复制代码
4.SimpleMessageListenerContainer和DirectMessageListenerContainer区别(相识)

SimpleMessageListenerContainer和DirectMessageListenerContainer都是Spring AMQP提供的消息监听容器,它们之间的区别在于:

  •         SimpleMessageListenerContainer是基于AMQP协议的,而DirectMessageListenerContainer是基于RabbitMQ的,因此SimpleMessageListenerContainer可以用于其他的AMQP实现,而DirectMessageListenerContainer只能用于RabbitMQ。
  •         SimpleMessageListenerContainer支持订阅多个队列,可以利用通配符等方式举行设置,而DirectMessageListenerContainer只能订阅一个队列。
  •         SimpleMessageListenerContainer支持自动声明队列和绑定,而DirectMessageListenerContainer必要手动声明和绑定队列。
  •         SimpleMessageListenerContainer支持多线程处理惩罚消息,而DirectMessageListenerContainer只能单线程处理惩罚消息。
因此,假如必要监听多个队列大概利用其他的AMQP实现,可以选择SimpleMessageListenerContainer;假如只必要监听一个队列而且利用RabbitMQ,可以选择DirectMessageListenerContainer。

5. 开启重试机制之后,带来的标题

#开启消耗者重试机制
spring.rabbitmq.listener.simple.retry.enabled = true
重试N次之后,消息就不再重回队列了,消息就丢失了? 怎样办理? 利用死信队列



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表