【RabbitMQ #10】 | MQ可靠性

MQ 服务端的可靠性

问题背景

默认情况下,RabbitMQ 收到消息优先放在内存,降低收发延迟。带来两个问题:

  1. MQ 宕机重启,内存中的消息直接丢失(docker restart mq 复现)
  2. 内存容量有限,消费者故障 / 消费慢,消息大量积压,触发 pageout,MQ 会阻塞。 MQ 底层会把老旧消息刷到磁盘释放内存,但刷盘过程会阻塞 MQ。

解决方案:数据持久化 + Lazy Queue

1. 数据持久化

RabbitMQ 持久化分为三部分:

  1. 交换机持久化
  2. 队列持久化(默认 durable)
  3. 消息持久化:发送消息设置 delivery_mode = 2
    • delivery_mode=1:临时消息,存在内存,重启丢失
    • delivery_mode=2:持久消息,写入磁盘

特点:开启生产者确认后,持久化需要等待磁盘写入完成才返回 ACK,速度会变慢;但不会出现 pageout 阻塞问题。

2. Lazy Queue(惰性队列)
  • 3.6 版本引入;3.12 版本之后,所有队列默认都是 LazyQueue
  • 机制:消息到达队列后直接存入磁盘,不优先放内存;消费者消费时才从磁盘加载到内存
  • 优势:支持百万级海量消息堆积,写盘性能高,避免 pageout 阻塞问题

RabbitMQ 如何保证消息的可靠性总结

  • 首先通过配置可以让交换机、队列、以及发送的消息都持久化。这样队列中的消息会持久化到磁盘,MQ 重启消息依然存在。
  • RabbitMQ 在 3.6 版本引入了 LazyQueue,并且在 3.12 版本后会称为队列的默认模式。LazyQueue 会将所有消息都持久化。
  • 开启持久化和生产者确认时,RabbitMQ 只有在消息持久化完成后才会给生产者返回 ACK 回调。
相关推荐
Alluxio1 天前
Alluxio + OCI:为 AI 工作负载实现亚毫秒访问延迟与可扩展吞吐
运维·数据库·人工智能·分布式·缓存·ai·语言模型
阿卡好可爱1 天前
Lua 热更新不生效:改完文件线上仍是旧逻辑,package.loaded 与 upvalue 重绑定详解
数据结构·分布式·后端·架构·lua
方方洛3 天前
ray教程-28-附录G-CICD与Slurm与云上调度
人工智能·分布式·机器学习
空奈qwq3 天前
【Kafka 从入门到实战】从手写一个队列到生产级消息中间件:架构、分区、消费组、零拷贝全解析
分布式·架构·kafka
山甫aa4 天前
锁一篇搞定:乐观锁、悲观锁、CAS、数据库锁与分布式锁【从零开始的 Web 后端学习】
java·数据库·分布式·后端·学习·web
严肃小白兔5 天前
Cloudflare Durable Objects 支持自动重试:分布式调用如何避免重复执行?
分布式
Pniubi5 天前
基于RabbitMQ实现延迟队列
rabbitmq
方方洛5 天前
ray教程-27-附录F-RayClient与runtime_env与多语言
人工智能·分布式·机器学习
方方洛6 天前
ray教程-25-附录E-端到端实战案例
人工智能·分布式·机器学习