知识卡片

宁可重复也不能丢unack消息

专业/工作 · 594.e

内容

当镜像队列的master失效、资历最老的slave被提升为新master时,新master会把所有处于”已投递未确认”状态的消息重新放回队列等待重新投递(该判定规则源自[[消费确认机制如何保证消息不丢]])——因为它无法判断这些消息究竟是客户端已经收到但确认信号丢失在路上,还是压根没送达。这个决策的代价是消费者可能重复收到同一条消息,换来的收益是不会有消息在这次故障切换中被静默丢弃。发散:这再次印证”可靠消息传递做不到恰好一次”([[RabbitMQ做不到精确一次投递]])——所有面对不确定状态的容错设计,几乎都会在”可能重复”和”可能丢失”这两难之间倒向前者,因为重复通常可以靠业务幂等吸收,丢失往往无法挽回。

参考来源

《RabbitMQ实战指南》第9章《RabbitMQ高阶》