You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 14:54:53