【RabbitMQ】- Channel和Delivery Tag机制

article/2025/6/15 17:59:48

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

Channel 参数

作用

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

  • 手动消息确认:通过 basicAck/basicNack 显式告知 RabbitMQ 消息处理结果
  • 流量控制:可调用 basicQos 限制预取消息数量(防止消费者过载)
  • 其他高级操作:如消息重发、队列绑定等

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

对应原理

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

生产者的 Channel

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

消费者的 Channel

  • 消费者通过 @RabbitListener 监听队列时:
@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 是消息的唯一标识符:

  • 消息指纹:每个投递给消费者的消息都会获得唯一的 delivery tag
  • 幂等性设计:通过 tag 可以精确确认/拒绝特定消息
  • 必须参数:调用 basicAck/basicNack 时必须指定此 tag

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

对应原理

Tag 的生成

  • 当 RabbitMQ 将消息推送给消费者时:
    • 服务端会为 每条消息 分配一个唯一的 Delivery Tag(在当前 Channel 内递增)。
    • 例如:第一次推送的 Tag=1,第二次 Tag=2,…(不同 Channel 的 Tag 独立计数)。

Tag 的作用

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

手动确认模式

手动确认模式的优点:

  • 可靠性:只有处理成功的消息才会被确认(basicAck
  • 错误恢复:处理失败时通过 basicNack 让消息重新入队
  • 业务控制:可以根据业务逻辑决定是否确认(如示例中的 shouldBeProcessed 判断)
// 成功处理 - 确认删除
channel.basicAck(tag, false); // 处理失败 - 拒绝并重新入队
channel.basicNack(tag, false, true);

工作流程

在这里插入图片描述


http://www.hkcw.cn/article/YFqyYGhUqE.shtml

相关文章

详解代理型RAG与MCP服务器集成

检索增强型生成(RAG)将语言模型与外部知识检索相结合,让模型的回答基于最新的事实,而不仅仅是其训练数据呢。 RAG(高级别) 在 RAG 流程中,用户查询用于搜索知识库(通常通过向量数据库中的嵌入来实现),并将检索到的最相关文档“增强”到模型的提示中,以帮助生成事实…

Keil 中因未引入源文件导致的函数调用与索引失败:从找不到定义到全局搜索无效

我在头文件中声明函数,源文件有定义,在有引入头文件的情况下调用的时候却找不到函数,头文件点击函数跳转不到源文件,全局搜索函数时找不到源文件的这个函数,最后是因为没有引入这个源文件 一、我在MQTT_Client_Task中使…

vue3学习

p3 创建vue3工程 1.创建命令 npm create vuelatest p4 编写APP组件 入口文件是index.html Vite 项目中, index.htm 是项目的入口文件,在项目最外层 加载index.html后,Vite解析 script typemoduleSrCXXX 指向的javascript Vue 中是通过 cr…

Vue3 + Vite:我的 Qiankun 微前端主子应用实践指南

前言 实践文章指南 vue微前端qiankun框架学习到项目实战,基座登录动态菜单及权限控制>>>>实战指南:Vue 2基座 Vue 3 Vite TypeScript微前端架构实现动态菜单与登录共享>>>>构建安全的Vue前后端分离架构:利用长Token与短Tok…

CloudFront 加速详解:AWS CDN 怎么用?

让全球访问更快速稳定,深入解读 AWS 的内容分发网络 在上一篇中,我们介绍了 Amazon S3 对象存储,它非常适合托管静态资源,比如图片、视频、网页等。但你可能遇到过这样的问题: “我把网站静态文件部署到了 S3&#xf…

嵌入式SDK技术EasyRTC音视频实时通话助力即时通信社交/教育等多场景创新应用

一、引言​ 在数字化时代,即时通信已成为人们生活和工作中不可或缺的部分。音视频功能作为即时通信的核心,能实现更加直观、高效的信息传递。EasyRTC作为一款强大的实时通信框架,具备诸多优势,为即时通信的音视频应用提供了优质解…

Rust 学习笔记:关于 Cargo 的练习题

Rust 学习笔记:关于 Cargo 的练习题 Rust 学习笔记:关于 Cargo 的练习题问题一问题二问题三问题四问题五问题六问题七 Rust 学习笔记:关于 Cargo 的练习题 参考视频: https://www.bilibili.com/video/BV1xjAaeAEUzhttps://www.b…

【时时三省】(C语言基础)数组作为函数参数

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 调用有参函数时,需要提供实参。例如sin ( x ),sqrt ( 2,0 ),max ( a,b )等。实参可以是常量、变量或表达式。数组元素的作用与变量…

基于Android的一周穿搭APP的设计与实现 _springboot+vue

开发语言:Java框架:springboot AndroidJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7数据库工具:Navicat12开发软件:eclipse/myeclipse/ideaMaven包:Maven3.6 系统展示 APP登录 A…

【开源工具】超全Emoji工具箱开发实战:Python+PyQt5打造跨平台表情管理神器

🌟 超全Emoji工具箱开发实战:PythonPyQt5打造跨平台表情管理神器 🌈 个人主页:创客白泽 - CSDN博客 🔥 系列专栏:🐍《Python开源项目实战》 💡 热爱不止于代码,热情源自每…

当 “欧洲版 Cursor” 遇上安全危机

在 AI 编程助手蓬勃发展的当下,安全问题正成为行业不容忽视的隐忧。近期,AI 编程助手公司 Replit 与号称 “欧洲版 Cursor” 的 Lovable 之间,因安全漏洞问题掀起了一场风波,引发了业界的广泛关注。​ Replit 的员工 Matt Palmer…

Agentic Workflow是什么?Agentic Workflow会成为下一个AI风口吗?

无论是想要学习人工智能当做主业营收,还是像我一样作为开发工程师但依然要运用这个颠覆开发的时代宠儿,都有必要了解、学习一下人工智能。 近期发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,入行门槛低&#x…

遥感影像建筑物变化检测

文章目录 效果1、环境安装2、项目下载3、数据集下载4、模型训练5、模型推理6、推理结果7、批量推理效果 1、环境安装 参考文章 搭建Pytorch的GPU环境超详细 win10安装3DGS环境(GPU)超详细 测试GPU环境可用 2、项目下载 https://gitcode.com/gh_mirrors/ch/change_detectio…

vue+cesium示例:地形开挖(附源码下载)

基于cesium和vue绘制多边形实现地形开挖效果,适合学习Cesium与前端框架结合开发3D可视化项目。 demo源码运行环境以及配置 运行环境:依赖Node安装环境,demo本地Node版本:推荐v18。 运行工具:vscode或者其他工具。 配置方式&#x…

Ubuntu 系统部署 MySQL 入门篇

一、安装 MySQL 1.1 更新软件包 在终端中执行以下命令,更新系统软件包列表,确保安装的是最新版本的软件: sudo apt update 1.2 安装 MySQL 执行以下命令安装 MySQL 服务端: sudo apt install mysql-server 在安装过程中&…

机器学习——主成分分析PCA

主成分分析—PCA 一、主成分分析简介1. PCA概述2. 降维 & PCA3. PCA的优缺点 二、PCA的数学基础1. 方差2. 协方差矩阵3. 特征值和特征向量 三、PCA的算法流程1. 标准化数据2. 计算协方差矩阵3.计算特征值和特征向量4. 选择主成分5. 数据投影 四、代码分析(人脸识…

连接关键点:使用 ES|QL 联接实现更丰富的可观测性洞察

作者:来自 Elastic Luca Wintergerst ES|QL 的 LOOKUP JOIN 现已进入技术预览阶段,它允许你在查询时对日志、指标和追踪进行丰富处理,无需在摄取时进行非规范化。动态添加部署、基础设施或业务上下文,减少存储占用,加速…

专家:乌军“蛛网”行动影响深远 无人机开启新战局

乌克兰在大规模使用无人机发动特种攻击方面再次震惊了世界。6月1日,乌克兰国家安全局对俄罗斯境内多地的军用机场发动大规模无人机攻击,声称摧毁了“多达41架战略轰炸机”。俄罗斯方面承认乌军无人机成功袭击的事实,但表示损失没有那么大。西方媒体认为,乌方使用的这种无人…

西北华北华南大片区域高温来袭 多地将迎35℃以上高温

今明两天(6月3日至4日),我国降雨主要出现在云南和华南沿海、东北地区等地,局地还可能伴有强对流天气。随着高压脊东移,北方大部气温逐渐升高,华北、黄淮等地高温天气将发展增多,南方多地5日起也将加入高温行列。昨天,冷空气南下导致南方强降雨区域南压至华南和云南一带…