RabbitMQ交换机durable与delivery_mode参数区别及配置效果
Kombu/RabbitMQ 中durable与delivery_mode参数的差异及组合效果
首先明确两个参数的作用边界:
durable是交换机自身的属性:配置为True时,对应的交换机会在RabbitMQ服务重启后保留,不会被自动删除;配置为False时,服务重启后交换机直接消失。delivery_mode是Kombu交换机配置的 消息默认投递属性,实际投递时可单独指定参数覆盖:取值1代表消息为瞬态,只会存在于内存中;取值2代表消息为持久化,会被写入磁盘存储。
场景1:durable = True 且 delivery_mode = 1(瞬态)
运行效果如下:
- 交换机本身会持久化:RabbitMQ服务重启后,该交换机依然存在,不需要重新声明创建,绑定的路由规则也会保留。
- 所有通过该交换机投递的消息默认是瞬态:就算绑定的队列本身也是
durable的,只要RabbitMQ服务重启,所有未消费的消息都会直接丢失,不会被恢复。 - 该配置适合对消息可靠性要求低、追求投递速度的场景,比如日志上报、实时状态同步类消息。
场景2:durable = False 且 delivery_mode = 2(持久化)
运行效果如下:
- 交换机本身是临时的:RabbitMQ服务重启后,该交换机直接被删除,后续新消息无法通过该交换机投递,原有已经成功投递到队列的消息不受交换机删除的影响。
- 你设置的持久化消息仅在对应队列也配置为
durable的情况下有留存可能:如果绑定的队列是临时的(durable=False),服务重启后队列和消息都会一起消失;就算队列是持久化的,消息也能从磁盘恢复,但因为原交换机已经消失,你需要重新创建交换机并绑定队列才能继续处理后续的新消息。 - 这种配置属于逻辑错配,常规业务场景下不会用到:要实现完整的服务重启不丢消息,需要同时把交换机、队列都设为
durable,配套消息delivery_mode=2才能生效。
内容的提问来源于stack exchange,提问作者Taebow
相关产品推荐
相关产品推荐

