ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

深入解析:【RabbitMQ】- Channel和Delivery Tag机制

深入解析:【RabbitMQ】- Channel和Delivery Tag机制

深入解析:【RabbitMQ】- Channel和Delivery Tag机制

在 RabbitMQ 的消费者代码中,Channel 和 tag 参数的存在是为了实现消息确认机制(Acknowledgment)和精细化的消息控制。

Channel 参数

作用

Channel 是 AMQP 协议的核心操作接口,通过它可以直接与 RabbitMQ 交互:

如果不传入 Channel,Spring AMQP 会自动使用默认信道,但会失去对信道的直接控制权。

对应原理

在这里插入图片描述
在这里插入图片描述

生产者的 Channel

rabbitTemplate.convertAndSend("doctor.queue"
, jsonMessage)
;
  • Spring AMQP 内部会从 连接池 获取一个 Channel(信道)。
  • Channel 用于将消息发布到指定队列。
  • 发布后自动关闭(如果是非事务模式)或复用。

消费者的 Channel

@RabbitListener
(queues = "doctor.queue"
)
public
void onMessage(String json, Channel channel, @Header
(AmqpHeaders.DELIVERY_TAG
)
long tag) {
// 处理逻辑
}
  • Spring AMQP 会为每个消费者线程分配一个 独立的 Channel
  • 所有消息的确认(ACK/NACK)必须通过 同一个 Channel 操作(否则会报错)。

tag 参数

作用

@Header(AmqpHeaders.DELIVERY_TAG) 注入的 tag 是消息的唯一标识符:

Tag 的数值范围仅在当前信道内唯一,不同信道的 tag 可能重复。

对应原理

Tag 的生成

Tag 的作用

channel.basicAck(tag, false
)
;
// 确认当前消息
channel.basicNack(tag, false
, true
)
;
// 拒绝并重新入队
  • 严格顺序性:Tag 在同一个 Channel 内严格递增,确保消息顺序处理。
  • RabbitMQ 服务端维护了一个 消息投递状态表,记录每个 Channel 的 Tag 对应哪条消息。
  • 当消费者发送 ACK/NACK 时,RabbitMQ 根据 Channel + Tag 组合定位到原始消息。

手动确认模式

手动确认模式的优点:

// 成功处理 - 确认删除
channel.basicAck(tag, false
)
;
// 处理失败 - 拒绝并重新入队
channel.basicNack(tag, false
, true
)
;

工作流程

在这里插入图片描述

返回列表