Durable队列无法在RabbitMQ容器停止后保留的问题求助
解决办法
1. 修复Docker卷挂载语法错误
你的docker-compose.yml中,rabbitmq_data卷的挂载路径末尾多了一个单引号:
- rabbitmq_data:/var/lib/rabbitmq/mnesia/'
这个语法错误会导致Docker无法正确将RabbitMQ的持久化数据写入命名卷,容器重启后数据全部丢失。
修正后:
- rabbitmq_data:/var/lib/rabbitmq/mnesia/
2. 排查RabbitMQ配置文件影响
如果自定义的rabbitmq.conf中存在禁用持久化的配置(如特殊的队列定位策略),可能导致数据不落地。可以先移除./rabbitmq.conf的挂载,使用默认配置测试,确认问题是否消失。
3. 补全消息持久化配置
你的代码中已设置交换机和队列的durable=True,但消息本身未开启持久化——即使队列是持久化的,未标记持久化的消息在重启后也会丢失。修改生产者代码,添加消息持久化属性:
import pika import sys if __name__ == '__main__': connection = pika.BlockingConnection( pika.ConnectionParameters(host='localhost')) channel = connection.channel() channel.exchange_declare(exchange='E1', durable=True) channel.queue_declare(queue='Q1', durable=True) channel.queue_bind(queue='Q1', exchange='E1', routing_key='q1') message = b' '.join(sys.argv[1:]) or b"info: Hello World!" channel.basic_publish( exchange='E1', routing_key='q1', body=message, properties=pika.BasicProperties( delivery_mode=2, # 标记消息为持久化 ) ) print(f" [x] Sent {message}") connection.close()
4. 清理异常数据卷(可选)
如果之前的错误挂载已导致rabbitmq_data卷出现异常,可以删除旧卷后重新创建:
docker volume rm $(basename $(pwd))_rabbitmq_data
再执行docker compose up -d重启服务。
内容的提问来源于stack exchange,提问作者Edgar Navasardyan
相关产品推荐
相关产品推荐

