这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战
前言: 首先你需要安装RabbitMQ在您的本地,端口设置为5672. 如果使用不同的主机端口则配置需要调整. 在第二个教程中,我们将创建一个工作队列,用于在多个员工之间分配耗时的任务。本篇文章我们来讲消息确认。
消息确认与重发
默认情况下,RabbitMQ 将按顺序将每条消息发送给下一个消费者。平均而言,每个消费者都会收到相同数量的信息。这种分发消息的方式称为循环。尝试发送到三个或三个以上的消费者时,平均更为明显。
1. 信息确认
执行任务可能需要几秒钟。你可能想知道,如果一个消费者开始一个漫长的任务,并死与它只部分完成会发生什么。我们当前的代码,一旦RabbitMQ向消费者传递消息,它立即标记它删除。在这种情况下,如果你杀了一个消费者,我们将失去它只是处理的消息。我们还将丢失发送给该特定工作人员但尚未处理的所有消息。
但我们不想失去任何的消息。如果一名消费者死亡,我们希望将任务交付给另一名消费者。
为了确保消息永远不会丢失,RabbitMQ 支持消息确认。消费者会发回一个 ack(现在的回复),告诉 RabbitMQ 已收到、处理了特定消息,并且 RabbitMQ 可以自由删除它。
2,消息重发
如果消费者在没有发送 ack 的情况下死亡(其通道已关闭、连接已关闭或 TCP 连接丢失),RabbitMQ 将了解消息未完全处理,并将重新排队。如果同时有其他消费者在线,它会很快将其重新分配给其他消费者。这样,即使消费者偶尔死亡,您也可以确信没有丢失任何消息。
没有任何消息超时:当消费者死亡时,RabbitMQ 将重新传递信息。即使处理这些消息需要很长时间,也没关系。
默认情况下,手动消息确认已打开。在以前的例子中,我们通过auto_ack=True标志明确关闭它们。一旦我们完成任务,是时候删除此标志并从对工作人员发送确认。
def callback(ch, method, properties, body):
print(" [x] Received %r" % body.decode())
time.sleep( body.count('.') )
print(" [x] Done")
ch.basic_ack(delivery_tag = method.delivery_tag)
channel.basic_consume(queue='hello', on_message_callback=callback)