RabbitMQ:单队列多订阅者场景下能否持久化消息至全部消费者接收?
RabbitMQ队列多订阅者与消息删除逻辑解析
核心结论
- 默认的单个队列多订阅者(工作队列模式)不支持让同一条消息被所有消费者接收后再删除:RabbitMQ会采用轮询或公平分发策略,将每条消息仅投递至一个消费者,待该消费者返回确认(ack)后,就会从队列中删除这条消息。
- 若要实现"同一条消息被所有订阅者接收"的需求,需要使用发布/订阅模式:通过声明一个
fanout类型的交换机,为每个消费者创建独立的队列并绑定到该交换机。发布消息到交换机后,消息会被路由到所有绑定的队列,每个消费者从自己的队列获取消息,各自处理并确认,此时每条消息会被所有消费者接收。
关于AMQP 0-9-1消息确认(acks)机制的澄清
你查阅的官方文档描述的是单个消费者的消息确认逻辑,和"多消费者接收同一条消息"无关:
AMQP 0-9-1内置消息确认(有时简称acks)功能,消费者通过该功能确认消息的投递和/或处理。若应用崩溃(AMQP代理会通过连接关闭感知到),且代理未收到预期的消息确认,该消息会重新入队(若存在其他消费者,可能会立即投递至其处)。
这段说明的意思是:
- 当一条消息被投递到某个消费者后,RabbitMQ会等待该消费者返回ack;
- 如果消费者崩溃且未发送ack,RabbitMQ会将这条消息重新放入队列,可能投递给其他在线的消费者,但依然是仅投递给一个消费者,不是所有;
- 只有收到当前投递目标消费者的ack后,RabbitMQ才会从队列中删除这条消息。
内容的提问来源于stack exchange,提问作者Jack BeNimble
相关产品推荐
相关产品推荐

