我知道消费者交付确认分为手动或自动模式。但在我看来,交付确认的概念在手动模式下是一样的。自动模式在消息发送后立即删除,与ack有什么关系?
我找到了官方文档enter image description here
我认为自动模式是当消费者收到一条消息时,它不处理以下步骤,它对rabbitmq进行确认,让它从队列中删除消息。
我希望得到详细的答复。
我知道消费者交付确认分为手动或自动模式。但在我看来,交付确认的概念在手动模式下是一样的。自动模式在消息发送后立即删除,与ack有什么关系?
我找到了官方文档enter image description here
我认为自动模式是当消费者收到一条消息时,它不处理以下步骤,它对rabbitmq进行确认,让它从队列中删除消息。
我希望得到详细的答复。
2条答案
按热度按时间yvt65v4c1#
消费者交付确认中关于手动或自动模式的不同在于,消费者获得消息将给予ack消息给RabbitMQ,RabbitMQ将从队列中删除消息。
事实上,你的消费者消费一条消息需要一些时间,消费时间的长短取决于你的代码运行时。
假设你的消费者发送确认到你的Rabbitmq,你的系统将丢失消息。
但是如果你是手动确认RabbitMQ,你的RabbitMQ会知道你的消费者遇到了一些问题,它会把消息传递给其他消费者。
另一方面,如果你的消费者未能消费消息,你可以简单地不向RabbitMQ发送ACK,以确保你的消息将有一个正确的消费。
rqqzpn5f2#
考虑以下场景:消费者负责处理消息并将其插入数据库。但是,使用者在收到消息后很快重新启动,无法处理数据并将其插入数据库。同时,代理在消息被消费时删除它。可以通过手动选择
ack
消息来防止此问题。您可以通过手动确认将飞行中事务失败减少到合理的程度。
我已经为demo sometime back准备了这个用例,你可以参考
consumer1
是如何工作的。