rabbitmq消费者应答模式

1.应答模式

RabbitMQ 中的消息应答模式主要包括两种:自动应答(Automatic Acknowledgement)和手动应答(Manual Acknowledgement)。

  1. 自动应答

不在乎消费者对消息处理是否成功,都会告诉队列删除消息。如果处理消息失败,实现自动补偿(队列投递过去 重新处理)。

  1. 手动应答

  2. 在手动应答模式下,消费者在接收到消息后并不会立即向RabbitMQ确认消息已处理完毕。消费者需要显式调用basicAck方法来确认消息处理完成,RabbitMQ只有在接收到消费者的确认后才会将消息从队列中删除。

  3. 采用手动应答可以提高消息的可靠性,即使消费者在处理消息过程中出现问题,只要未发送ack确认,RabbitMQ会在重新连接后再次将消息发送给该消费者。

  4. 如果消费者在处理消息前断开了连接,或者在处理消息期间抛出了未捕获的异常,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监听器,设置自动应答模式:

XML 复制代码
# 自动应答模式
spring.rabbitmq.listener.simple.acknowledge-mode = auto
java 复制代码
@Component
public class AutoAcknowledgementConsumer {

    @RabbitListener(queues = "yourQueue")
    public void consumeMessage(String message, Message amqpMessage) {
        // 处理消息...
        // 框架会在方法执行完成后自动发送ack确认消息
    }
}

2.2 手动应答

首先,同样在配置文件中启用手动应答模式

复制代码
# 手动应答模式
spring.rabbitmq.listener.simple.acknowledge-mode = manual

3.如何解决死循环?重试机制

bash 复制代码
#应答模式
spring.rabbitmq.listener.simple.acknowledge-mode=AUTO

#批量预抓取数量,提高执行效率,一次性捆绑抓取的消息数量
spring.rabbitmq.listener.simple.prefetch = 10
#开启消费者重试机制
spring.rabbitmq.listener.simple.retry.enabled = true
#重试的最大次数
spring.rabbitmq.listener.simple.retry.max-attempts = 6
#重试间隔时间
spring.rabbitmq.listener.simple.retry.initial-interval = 3000
#重试间隔倍数,默认值是1
spring.rabbitmq.listener.simple.retry.multiplier = 2
#最大间隔时间,默认值是10s
spring.rabbitmq.listener.simple.retry.max-interval = 15000

4.SimpleMessageListenerContainer和DirectMessageListenerContainer区别(了解)

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

  1. SimpleMessageListenerContainer是基于AMQP协议的,而DirectMessageListenerContainer是基于RabbitMQ的,因此SimpleMessageListenerContainer可以用于其他的AMQP实现,而DirectMessageListenerContainer只能用于RabbitMQ。

  2. SimpleMessageListenerContainer支持订阅多个队列,可以使用通配符等方式进行配置,而DirectMessageListenerContainer只能订阅一个队列。

  3. SimpleMessageListenerContainer支持自动声明队列和绑定,而DirectMessageListenerContainer需要手动声明和绑定队列。

  4. SimpleMessageListenerContainer支持多线程处理消息,而DirectMessageListenerContainer只能单线程处理消息。

因此,如果需要监听多个队列或者使用其他的AMQP实现,可以选择SimpleMessageListenerContainer;如果只需要监听一个队列并且使用RabbitMQ,可以选择DirectMessageListenerContainer。

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

#开启消费者重试机制

spring.rabbitmq.listener.simple.retry.enabled = true

重试N次之后,消息就不再重回队列了,消息就丢失了? 如何解决? 使用死信队列

相关推荐
oMcLin27 分钟前
如何在Debian 11上通过配置MySQL 8.0的分布式架构,提升跨区域数据同步的效率与延迟?
分布式·mysql·debian
一条咸鱼_SaltyFish1 小时前
[Day15] 若依框架二次开发改造记录:定制化之旅 contract-security-ruoyi
java·大数据·经验分享·分布式·微服务·架构·ai编程
J_liaty1 小时前
RabbitMQ面试题终极指南
开发语言·后端·面试·rabbitmq
IT 行者3 小时前
Spring Security 7 OAuth2 授权码分布式存储之Redis存储方案
redis·分布式·spring
潇凝子潇3 小时前
kafka之监控告警
分布式·kafka
Light604 小时前
从“报告”到“能力”——构建智能化、可审计的数据治理闭环——领码 SPARK 数据质量平台白皮书
大数据·分布式·spark
maozexijr4 小时前
RabbitMQ Exchange Headers类型存在的意义?
分布式·rabbitmq
还在忙碌的吴小二4 小时前
XXL-SSO 分布式单点登录框架
分布式
独自破碎E5 小时前
RabbitMQ的消息确认机制是怎么工作的?
分布式·rabbitmq
潇凝子潇5 小时前
Kafka 实现集群安全认证与加密机制
分布式·安全·kafka