ack 最容易被误解。
很多人以为:
Consumer 收到消息,就该立刻 ack。
这在很多业务里是错的。
类比到快递城市,ack 不是“派送员看见包裹了”,而是:
派送员已经把这票活接下来并处理完成,调度中心可以把待办记录删掉了。
所以正确心智是:
消息送到消费者 ≠ 业务处理完成
业务处理完成后再 ack,才更安全最常见写法:
def callback(ch, method, properties, body):
do_business(body)
ch.basic_ack(delivery_tag=method.delivery_tag)如果你开了 auto_ack=True,就等于:
调度中心把包裹一扔出窗口
就直接当成“已签收”这样吞吐量高一点,但安全性明显下降。
消费者刚收到消息就崩了,这条消息也可能算丢了。