【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 回调。
相关推荐
醉颜凉4 小时前
Kafka 与 RabbitMQ/RocketMQ 选型对比:场景匹配、性能基准与迁移成本
kafka·消息队列·rabbitmq·rocketmq·中间件选型
逐流人6 小时前
Ceph分布式存储集群配置与池管理:从配置优先级到PG、复本池与纠删码池
运维·分布式·ceph·云原生·云计算·rados
天天喝旺仔8 小时前
gRPC 底层原理:HTTP/2 多路复用、Protobuf 序列化与四种流模式
分布式·http·微服务·rpc
灯澜忆梦11 小时前
【RabbitMQ #5】 | 三大交换机 Fanout ,Direct ,Topic
分布式·rabbitmq·ruby
.冰块.13 小时前
Ceph 分布式存储实战(二):存储池管理与 cephx 认证授权
分布式·ceph·rados·纠删码·复本池·cephx认证与用户权限
我们从未走散16 小时前
从内存字典到租约内核:分布式上游账号池如何做到不超卖
分布式
.冰块.17 小时前
Ceph 分布式存储实战(一):架构入门与 cephadm 集群部署
分布式·ceph·架构·cephadm
j7~17 小时前
【Redis】《一文走完服务端高并发架构演进:从单机架构到 K8S 容器编排》
分布式·架构演进·服务端高并发分布式结构演进之路·架构基本概念·架构评价指标