初学者经常说:
我把队列设成 durable 了,所以不会丢消息。
这不完整。
更稳的心智是:
想尽量减少丢消息,要看三段链条:
1. 队列是不是 durable
2. 消息是不是 persistent
3. Producer 有没有确认 broker 真的收到了(publisher confirms)代码片段:
channel.queue_declare(queue="task_queue", durable=True)channel.basic_publish(
exchange="",
routing_key="task_queue",
body=b"hello",
properties=pika.BasicProperties(delivery_mode=2),
)channel.confirm_delivery()城市类比是:
durable queue:货架重启后还在persistent message:包裹信息写入了更可靠的存储路径publisher confirm:寄件人拿到“调度中心已接收”的回执
还要再补一刀:
即便这样,分布式系统里仍要按“至少一次投递”思考。
也就是说:
- 更安全
- 但仍可能重复
- 消费端最好幂等
比如:
- 运单创建接口要防重
- 扣库存要有幂等键
- 发券不能因为重复消息发两次