全书目录

第二十一篇:RabbitMQ 完全指南 —— 城市智能快递调度中心宇宙

第八章:持久化不是一个按钮,而是一整条链

1 分钟 249 字 第 390 / 962 个阅读单元

初学者经常说:

我把队列设成 durable 了,所以不会丢消息。

这不完整。

更稳的心智是:

text
想尽量减少丢消息,要看三段链条:

1. 队列是不是 durable
2. 消息是不是 persistent
3. Producer 有没有确认 broker 真的收到了(publisher confirms)

代码片段:

python
channel.queue_declare(queue="task_queue", durable=True)
python
channel.basic_publish(
    exchange="",
    routing_key="task_queue",
    body=b"hello",
    properties=pika.BasicProperties(delivery_mode=2),
)
python
channel.confirm_delivery()

城市类比是:

  • durable queue:货架重启后还在
  • persistent message:包裹信息写入了更可靠的存储路径
  • publisher confirm:寄件人拿到“调度中心已接收”的回执

还要再补一刀:

即便这样,分布式系统里仍要按“至少一次投递”思考。

也就是说:

  • 更安全
  • 但仍可能重复
  • 消费端最好幂等

比如:

  • 运单创建接口要防重
  • 扣库存要有幂等键
  • 发券不能因为重复消息发两次