rabbitmq ACK

在消息队列(如 RabbitMQ)中,**ACK(Acknowledgement)是消息确认机制**,用于确保消息被消费者成功处理。其核心作用是解决以下问题:

mermaid复制代码导出svg


📌 ACK 的两种模式

1. 自动确认模式 (Auto-ACK)
  • 消费者收到消息时,RabbitMQ 立即删除队列中的消息
  • 风险:若消费者处理消息时崩溃,消息永久丢失

python复制代码

channel.basic_consume(queue="my_queue",auto_ack=True,  # ⚠️ 危险模式on_message_callback=callback
)
2. 手动确认模式 (Manual ACK) ✅ 推荐
  • 消费者处理完业务逻辑后,显式发送 ACK
  • RabbitMQ 收到 ACK 后才删除消息
  • 处理失败时可拒绝消息(NACK)

python复制代码

def callback(channel, method, properties, body):try:process_message(body)  # 业务处理channel.basic_ack(delivery_tag=method.delivery_tag)  # ✅ 手动确认except Exception:# 处理失败:拒绝消息并重新入队channel.basic_nack(delivery_tag=method.delivery_tag, requeue=True)

🔧 ACK 的三大核心作用

场景无 ACK 机制开启手动 ACK
消费者崩溃消息丢失 ❌消息重新投递给其他消费者 ✅
处理逻辑出错消息被误删除 ❌触发重试机制 ✅
高并发场景可能因消息积压导致内存溢出 ⚠️控制消息流速(QoS)✅

🛠 最佳实践:手动 ACK + QoS

python复制代码

# 1. 设置每次只接收一条消息(避免消息积压)
channel.basic_qos(prefetch_count=1)  # 🚦 流量控制# 2. 消费消息(关闭自动ACK)
channel.basic_consume(queue="orders",auto_ack=False,  # ✋ 手动确认模式on_message_callback=process_order
)# 3. 在回调函数中显式ACK
def process_order(channel, method, properties, body):try:save_to_database(body)   # 业务操作charge_credit_card(body) # 关键业务channel.basic_ack(delivery_tag=method.delivery_tag)  # ✅ 确认except PaymentFailed:# 支付失败:消息重新入队等待重试channel.basic_nack(delivery_tag=method.delivery_tag, requeue=True)except InvalidOrder:# 无效订单:拒绝并不再重试channel.basic_reject(delivery_tag=method.delivery_tag, requeue=False)

⚠️ 关键注意事项

  1. 忘记 ACK 的后果

    • 消息会一直保留在队列中(显示 Unacked 状态)
    • 导致消息堆积,最终阻塞整个队列
  2. NACK 与 Reject 的区别

    • basic_nack():支持批量拒绝多条消息
    • basic_reject():只能拒绝单条消息
  3. 死信队列配合
    当消息被拒绝且 requeue=False 时,可将其路由到死信队列进行分析:

    python复制代码

    # 声明队列时绑定死信交换机
    args = {"x-dead-letter-exchange": "dead_letter_exchange"}
    channel.queue_declare(queue="orders", arguments=args)
    

🌟 总结:ACK 的本质

ACK 是消息可靠性的最后一道防线
它通过 生产者 → RabbitMQ → 消费者 的闭环确认机制,实现:

  • 至少一次投递(At Least Once Delivery)
  • 防消息丢失(即使消费者崩溃)
  • 业务可重试性(通过 NACK 机制)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/89341.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

性能远超Spring Cloud Gateway!Apache ShenYu如何重新定义API网关!

Apache ShenYu Apache ShenYu是一个异步的,高性能的,跨语言的,响应式的 API 网关。 特点 • 代理:支持Apache Dubbo,Spring Cloud,gRPC,Motan,SOFA,TARS,We…

质变科技亮相可信数据库发展大会,参编《数据库发展研究报告2025》

数据库作为支撑数据存储与计算的关键载体,在数据要素时代的重要性愈发凸显。过去一年,全球数据库新技术、新业态、新模式不断涌现;我国数据库应用创新于重点行业快速推进。随着人工智能技术深刻变革,数据库与AI融合趋势愈发明显。…

LVS(Linux Virtual Server)详细笔记(理论篇)

一.详解1. LVS概述LVS(Linux Virtual Server)是由章文嵩博士发起的开源负载均衡项目,通过在Linux内核中实现高性能四层交换能力,将多台物理服务器组织成单一虚拟服务。它能够处理百万级并发连接,同时保持线性扩展能力&…

Oracle Data Pump 导入冲突解决

问题场景 使用 impdp 导入数据时遇到"对象已存在"错误,导致导入失败。 核心解决方案 1. TABLE_EXISTS_ACTION 参数 impdp username/passworddatabase \ directoryDATA_PUMP_DIR \ dumpfileyour_dump_file.dmp \ TABLE_EXISTS_ACTIONREPLACE作用&#xff1…

汽车免拆诊断案例 | 2015款进口起亚索兰托L车漏电

故障现象 一辆2015款进口起亚索兰托L车,搭载D4HB发动机,累计行驶里程约为15万km。车主反映,该车停放2天左右就因蓄电池亏电而无法起动,更换过蓄电池,但故障依旧,于是将车开至我厂检修。故障诊断 接车后用…

mysql复制延迟如何处理

一、复制延迟的原因主库增删改并发大大表在做DDL从库备份导致延迟大事务从库机器配置差二、怎样判断延迟使用 SHOW SLAVE STATUS 命令Seconds_Behind_Master:表示从库落后主库的秒数(若为 NULL,可能复制线程已停止)对比位点字段名…

HertzBeat 监控 SpringBoot 使用案例

HertzBeat 监控 SpringBoot 使用案例 在云原生时代,Spring Boot应用的监控与可视化已然成为运维体系的核心环节,实时监控应用性能是保障系统稳定性的关键。 这篇文章将结合 HertzBeat 实现从指标采集、可视化到告警的一体化解决方案,并展示…

突破性量子芯片问世:电子与光子首次集成,开启量子技术规模化应用新篇章

文丨浪味仙 排版丨浪味仙行业动向:3000字丨8分钟阅读内容提要在量子技术迈向规模化应用的征程中,研究人员迎来了重要突破。近日,波士顿大学、加州大学伯克利分校以及西北大学的科学家在《Nature Electronics》上发表论文,报告实现…

day30——零基础学嵌入式之线程2.0

一、进程和线程的对比线程进程定义轻量级的进程。是进程中的执行单元,作为CPU调度的基本单位进程时程序的一次执行过程,作为CPU的资源分配的基本单位优势创建以及切换速度块-----效率高线程(线程共享了进程的资源)间共享资源方便创…

洛谷 P1395 会议

【题目链接】 洛谷 P1395 会议 【题目考点】 1. 树形动规:树的重心 本题为求树的重心模板题 【解题思路】 树的重心:相比于树中其它结点,其所有的子树中结点数最多的子树的结点数最少,该结点就是这棵树的重心。 另一种定义&…

Microsoft 365 Adoption Score功能深度解析:驱动企业数字化转型的利器

在数字化转型的浪潮中,Microsoft 365(原Office 365)凭借其强大的生产力工具和云服务生态,已成为全球企业和组织提升效率、协作和创新的核心平台。然而,仅仅部署Microsoft 365并不足以充分发挥其潜力,关键在于如何推动员工高效采用这些工具,并将其融入日常工作流程。为此…

尺寸标注识别5 实例分割 roboflow | result.boxes获取边界框 | yolov8n-seg架构 torchinfo | 对直线关系不敏感

https://gitee.com/njsgcs/yolo-local 单标注一个尺寸线 100轮就百分百了 Sign in to Roboflow 有混起来的问题 roboflow训练用的cocon-seg模型我网上找不到 上面这种比较麻烦 text的中心要在dt范围内 屏幕点以下等同于按下save(enter) 取最长线段作…

敏捷开发卡在需求分析?飞算 JavaAI 加速需求确认与功能迭代

在敏捷开发中,需求分析常成为团队推进的 “卡点”—— 模糊的需求描述、反复的需求变更、拆解落地难等问题,往往导致迭代周期延长。而飞算 JavaAI 作为专为 Java 开发设计的工具,正通过 “需求理解 - 接口设计 - 代码生成” 的全流程智能化&a…

QT跨平台应用程序开发框架(10)—— Qt窗口

目录 一,关于窗口 二,菜单栏 2.1 菜单介绍 2.2 添加菜单 2.3 添加快捷键 2.4 添加其子菜单 2.5 添加分割线和图标 三,工具栏 3.1 添加和使用工具栏 3.2 设置位置属性 四,状态栏 五,浮动窗口 六,对话框 6.1 …

git从本地仓库添加到远程仓库

先创建,然后配置 Git 的全局用户名和邮箱git config --global user.name "不吃糖o" git config --global user.email "1523944556qq.com" git config --global -l 查看设置的用户名和邮箱如何生成SSH公钥?ssh-keygen 生成sshkeyls ~…

锁步核,为什么叫锁步核?

“锁步核”(Lockstep Cores)这一名称源于其工作原理与军事队列行进中的“锁步”(Lockstep)动作的类比。以下是详细的说明整理:1. 军事起源:什么是“锁步”? 在传统军事训练中,“锁步…

python学智能算法(二十二)|SVM-点与超平面的距离

引言 前序学习进程中,了解了向量、向量点积运算、超平面、感知机等知识点。 SVM算法最核心的目标是通过规划租号的分割超平面,来使得超平面附近的点到超平面的距离和达到最大值。 那点和超平面的距离如何计算,就是今天学习的重点。 点与超平…

参会邀请!2025世界人工智能大会合合信息技术交流日报名启动!

2025世界人工智能大会即将开幕,合合信息邀请您一起参与KOL深度技术交流活动。本次活动不仅可以带您逛展2025世界人工智能大会,在合合信息展台体验AI黑科技,还可以与行业顶尖技术专家面对面交流,共同探讨当下热门AI安全话题。 详细…

零基础入门:用C++从零实现TCP Socket网络小工具

个人主页:chian-ocean 文章专栏-Linux 前言: 网络编程中的套接字(Socket)是通信的基本接口,允许不同计算机之间通过网络交换数据。套接字是计算机网络中通信的“端点”,通过它,应用程序可以与…

SOES:软实现EtherCAT从站协议栈项目介绍及从站开发案例

在现代工业自动化领域,EtherCAT(Ethernet for Control Automation Technology)以其高速、实时和开放的特性,成为现场总线通信的主流协议之一。EtherCAT网络中,主站(Master)负责调度和管理&#…