全书目录

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

第七章:ack 到底是什么,它不是“收到就点签收”

1 分钟 201 字 第 389 / 962 个阅读单元

ack 最容易被误解。

很多人以为:

Consumer 收到消息,就该立刻 ack。

这在很多业务里是错的。

类比到快递城市,ack 不是“派送员看见包裹了”,而是:

派送员已经把这票活接下来并处理完成,调度中心可以把待办记录删掉了。

所以正确心智是:

text
消息送到消费者 ≠ 业务处理完成
业务处理完成后再 ack,才更安全

最常见写法:

python
def callback(ch, method, properties, body):
    do_business(body)
    ch.basic_ack(delivery_tag=method.delivery_tag)

如果你开了 auto_ack=True,就等于:

text
调度中心把包裹一扔出窗口
就直接当成“已签收”

这样吞吐量高一点,但安全性明显下降。
消费者刚收到消息就崩了,这条消息也可能算丢了。