我使用pika
使用这个简单的代码:
conn = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = conn.channel()
def on_message(ch, method, properties, message):
print("Received message: %r" % message)
channel.basic_ack(delivery_tag=method.delivery_tag)
channel.queue_declare(queue='my_queue', durable=True)
channel.basic_qos(prefetch_count=1)
channel.basic_consume(on_message, queue='my_queue')
channel.start_consuming()
问题:
一旦我收到了一条消息,并且我的on_message
回调正在运行,rabbitmq如何确保在我调用basic_ack
之前不会将相同的消息给予其他worker?因为在我的测试中,如果我不调用basic_ack
,如果我多次运行代码,消息将再次发送。rabbitmq从发送消息到得到ack
是否有超时?
1条答案
按热度按时间h5qlskok1#
在我调用basic_ack之前,rabbitmq如何确保不给其他worker给予相同消息?
只向一个消费者传递消息是RabbitMQ的一个 * 核心特性 *。消息将保持未确认状态,直到消息传递到的消费者确认它,或者消息传递的通道关闭。
在我的测试中,如果我不调用basic_ack,如果我多次运行代码,消息将再次发送。
当你多次运行你的代码时,会发生以下情况:
basic_ack
,这将关闭通道和连接而不确认消息。所有这些以及更多的内容都包含在RabbitMQ documentation中。