当前位置: 首页 > news >正文

RabbitMQ 消息持久化与可靠性

RabbitMQ 消息持久化与可靠性

在这里插入图片描述

1. 前言

在高可用集群中,消息可靠性是生产环境的核心需求。
RabbitMQ 提供多种机制保证消息在节点故障或消费异常情况下不会丢失。

本文重点解析:

  1. 消息持久化策略
  2. 消费确认机制(ACK/NACK)
  3. 事务模式
  4. 死信队列(Dead Letter Exchange,DLX)
  5. 核心源码实现

2. 消息持久化策略

2.1 内存队列(RAM Queue)

  • 消息只存储在内存
  • 高速读写,重启后消息丢失
  • 适用于对数据可靠性要求低、延迟敏感的场景

2.2 磁盘队列(Durable Queue)

  • 队列和消息可持久化到磁盘
  • 消息标记 persistent = true
  • 重启或节点故障时仍可恢复消息

2.3 持久化流程

basic_publish(Msg) ->if Msg.persistent ->write_to_disk_journal(Msg)elseenqueue_in_memory(Msg)
  • rabbit_queue 模块中管理消息入队
  • 磁盘写入采用 Erlang Mnesia + Journal
  • 支持异步写入提高吞吐量

3. 消费确认机制(ACK/NACK)

3.1 Auto-ack

  • 消费者一收到消息即认为处理完成
  • 风险:消费者挂掉或异常 → 消息丢失

3.2 手动 ACK

  • 消费者处理完成后调用 basic.ack
  • Broker 删除已确认消息
  • 未确认消息可重新入队,保证可靠性

3.3 NACK / Reject

  • 消费者处理失败时可调用 basic.nackbasic.reject
  • 可选择是否重新入队(requeue = true/false)
  • 配合 DLX 可实现失败消息转发

3.4 源码解析

  • rabbit_channel 模块维护消费者状态
  • deliver/2 方法投递消息
  • ack/2 方法确认消息:
ack(Channel, MsgTag) ->Queue = lookup_queue(Channel, MsgTag),Queue:ack(MsgTag)

4. 事务模式

4.1 概念

  • tx.select 开启事务
  • tx.commit 提交事务,保证消息入队原子性
  • tx.rollback 回滚事务

4.2 注意事项

  • 事务模式吞吐量低
  • 更推荐使用 持久化 + ACK/NACK 组合保证可靠性

5. 死信队列(DLX)

5.1 概念

  • 消息处理失败或过期时,发送到 Dead Letter Exchange
  • 用于重新处理或告警

5.2 配置示例

queue.declare("task_queue", [{x-dead-letter-exchange, "dlx_exchange"}])
  • 消息 NACK 或 TTL 过期 → 自动路由到 DLX
  • DLX 可绑定专门的队列进行监控或重试

5.3 源码解析

  • rabbit_queue:handle_dead_letter/1
  • 检查消息属性和 TTL
  • 调用 route_to_dlx(Msg) 将消息投递到 DLX 队列

6. 消息可靠性总结

机制作用源码模块
消息持久化重启/故障恢复rabbit_queue、Disk Journal
消费者 ACK/NACK消息处理确认rabbit_channel
事务模式入队操作原子性rabbit_tx
死信队列 DLX异常消息处理rabbit_queue

7. 小结

本文系统讲解了 RabbitMQ 消息持久化与可靠性:

  1. 内存队列 vs 磁盘队列:性能与可靠性平衡
  2. ACK/NACK:保证消费者处理消息可靠性
  3. 事务模式:原子操作,但吞吐量低
  4. 死信队列(DLX):处理失败或过期消息
  5. 源码解析rabbit_queuerabbit_channel、DLX 投递

📌 理解持久化与可靠性机制,为下一篇 RabbitMQ 内存管理与性能优化篇 打下基础。


在这里插入图片描述


文章转载自:

http://cyvifB0c.ccpnz.cn
http://ve9dHuDr.ccpnz.cn
http://1fBQ00LV.ccpnz.cn
http://BONA7nBs.ccpnz.cn
http://YPcB1sT5.ccpnz.cn
http://lPD3GioO.ccpnz.cn
http://PK49TtbS.ccpnz.cn
http://lAiMsZj0.ccpnz.cn
http://vaTszdj1.ccpnz.cn
http://dgK5dq5z.ccpnz.cn
http://TYiJKGKI.ccpnz.cn
http://khFpWDyE.ccpnz.cn
http://okfcxe0X.ccpnz.cn
http://GIepxbCP.ccpnz.cn
http://CeT0PfcF.ccpnz.cn
http://FRo5AAGM.ccpnz.cn
http://9iuwohkk.ccpnz.cn
http://pHlruH5C.ccpnz.cn
http://TUTASB2h.ccpnz.cn
http://iWosiqM1.ccpnz.cn
http://IavyYqOn.ccpnz.cn
http://DdaQdh8n.ccpnz.cn
http://FrdlOOa2.ccpnz.cn
http://s9duKrEk.ccpnz.cn
http://u6lKzYJz.ccpnz.cn
http://cF2o1i4Y.ccpnz.cn
http://Ajvs4zdT.ccpnz.cn
http://JEeMwVCM.ccpnz.cn
http://6pcfrQrn.ccpnz.cn
http://WJ6d8Yqo.ccpnz.cn
http://www.dtcms.com/a/385231.html

相关文章:

  • 基于YOLO8的打架斗殴行为检测系统【源码+数据集+文章】
  • 电磁超声螺栓轴力检测技术:破解法兰泄露与设备安全痛点的关键方案
  • GPT-5深度解析:它真的是AGI的拂晓晨光吗?
  • (播放器开发)音频输出
  • 视频转音频在线工具大比拼,哪家体验更胜一筹?
  • 如何选择合适的工业绝缘监测仪
  • 【沉浸式解决问题】iPhone 6 登录苹果ID时一直跳出 unexpected error with certificate 或 无法登录
  • Linux系统的系统服务与DHCP服务
  • 高系分五:数据库系统
  • 高效精准的全基因组谱系贝叶斯推断方法SINGER
  • NetSuite Landed Cost到岸成本功能包
  • linux的停止自动休眠
  • 继承与组合:C++面向对象的核心
  • Java进阶教程,全面剖析Java多线程编程,多线程的实现方式,继承Thread类方式,笔记03
  • 猫头虎开源AI分享:一款CSV to Chat AI工具,上传CSV文件提问,它可以即时返回统计结果和可视化图表
  • Android中怎么使用C语言, 以及打包/使用SO动态库
  • 信刻光盘加密刻录系统,保护光盘分发数据安全保密!
  • 自由学习记录(99)
  • 【开题答辩全过程】以 C语言程序设计课程网站为例,包含答辩的问题和答案
  • RocketMQ 消息幂等性实战经验分享
  • [SC]SystemC中,一个namespace中调用了其他namespace中的函数,需要显示include那个函数所在的.h文件吗?
  • Origin气泡图画相关性系数图
  • 基于SpringBoot+Uniapp的儿童疫苗接种预约小程序(qq邮箱、二维码识别)
  • 基于HugeGraph构建法律知识图谱(一)
  • C语言常用字符串函数
  • 【STM32项目开源】STM32单片机智能饮水机控制系统
  • 新质生产力背景下基于“开源链动2+1模式+AI智能名片+S2B2C商城小程序”的商业机会挖掘研究
  • html隐藏文本利用原理,实现点击隐藏功能
  • Java vs Python Web 开发深度对比:从传统同步到现代异步的全面演进
  • Redis 不只是缓存:深入解析 Redis Stack 与实时 AI 推理