MQ 服务端的可靠性问题背景默认情况下RabbitMQ 收到消息优先放在内存降低收发延迟。带来两个问题MQ 宕机重启内存中的消息直接丢失docker restart mq复现内存容量有限消费者故障 / 消费慢消息大量积压触发 pageoutMQ 会阻塞。 MQ 底层会把老旧消息刷到磁盘释放内存但刷盘过程会阻塞 MQ。解决方案数据持久化 Lazy Queue1. 数据持久化RabbitMQ 持久化分为三部分交换机持久化队列持久化默认 durable消息持久化发送消息设置delivery_mode 2delivery_mode1临时消息存在内存重启丢失delivery_mode2持久消息写入磁盘特点开启生产者确认后持久化需要等待磁盘写入完成才返回 ACK速度会变慢但不会出现 pageout 阻塞问题。2. Lazy Queue惰性队列3.6 版本引入3.12 版本之后所有队列默认都是 LazyQueue机制消息到达队列后直接存入磁盘不优先放内存消费者消费时才从磁盘加载到内存优势支持百万级海量消息堆积写盘性能高避免 pageout 阻塞问题RabbitMQ 如何保证消息的可靠性总结首先通过配置可以让交换机、队列、以及发送的消息都持久化。这样队列中的消息会持久化到磁盘MQ 重启消息依然存在。RabbitMQ 在 3.6 版本引入了 LazyQueue并且在 3.12 版本后会称为队列的默认模式。LazyQueue 会将所有消息都持久化。开启持久化和生产者确认时RabbitMQ 只有在消息持久化完成后才会给生产者返回 ACK 回调。
阅读完成 · 觉得有帮助?