RabbitMQ消息持久化
一、前言
如果我们希望即使在RabbitMQ服务重启的情况下,也不会丢失消息,我们可以将Queue与Message都设置为可持久化的(durable),这样可以保证绝大部分情况下我们的RabbitMQ消息不会丢失。当然还是会有一些小概率事件会导致消息丢失。
二、队列持久化
2.1 查看存在的队列和消息数量
在windows环境下,在rabbitmq的安装目录/sbin下,通过rabbitmqctl.bat list_queues查看
这边启动了两个producer,分别生成两个队列hello 和 hello1,并且他们都有一个消息存在
重启rabbitmq,模拟故障
可以看到重启后两个队列都消失了
2.2 持久化队列
我们就hello队列持久化
在声明队列名称时,持久化队列,生产端和消费端都要
1 | channel.queue_declare(queue = 'hello' , durable = True ) |
我们重复上面的操作,但是给hello队列做持久化,而hello1不做,并重启rabbitmq
可以看到重启后,hello队列还在,hello1队列消失了,但是原本hello中的一条消息也没有保存下来。所以在这边我们仅仅做到了消息队列的持久化,还没有做消息持久化。
三、消息持久化
我们刚才实现了在rabbitmq崩溃的情况下,就队列本身保存下来,重启后队列还在。接下来我们要将消息也保存下来,即消息的持久化
1 2 3 4 5 6 7 8 9 | channel.basic_publish(exchange = '', routing_key = 'hello' , body = 'hello' , properties = pika.BasicProperties( delivery_mode = 2 , # make message persistent )) # 增加properties,这个properties 就是消费端 callback函数中的properties # delivery_mode = 2 持久化消息 |
生产端生成一个消息,并重启rabbitmq
可以看到,经过队列和消息持久化后的hello, 在重启的情况下,队列和消息都存在,没有消失。
消费端再重启后也能正常接收
四、总结
- 队列持久化需要在声明队列时添加参数 durable=True,这样在rabbitmq崩溃时也能保存队列
- 仅仅使用durable=True ,只能持久化队列,不能持久化消息
- 消息持久化需要在消息生成时,添加参数 properties=pika.BasicProperties(delivery_mode=2)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)