知识卡片

RabbitMQ做不到精确一次投递

专业/工作 · 592.j

内容

消息传输保障分三个层级:至多一次(可能丢不会重复)、至少一次(不丢但可能重复)、恰好一次(不丢不重复)。RabbitMQ只能做到前两种:即使消费者已处理完消息,若确认命令在网络中丢失,Broker会误判为未消费并重投;即使消息已送达,若确认响应丢失导致生产者误判失败而重发,Broker也会存下重复消息。这不是RabbitMQ的实现缺陷,而是绝大多数消息中间件的共性——去重责任被下放到业务层,靠消息自带全局唯一ID、业务逻辑本身具备幂等性,或借助外部缓存做去重判断来解决。发散:分布式系统里”恰好一次”几乎总是需要业务语义配合才能实现的复合目标,而非单靠中间件就能兜底的基础设施特性。

参考来源

《RabbitMQ实战指南》第4章《RabbitMQ进阶》