Rabbitmq如何同步消息?

时间:2019-01-31 17:25:29

标签: python rabbitmq message-queue pika python-pika

我使用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之前不向其他工作人员提供相同的消息?由于在测试中,如果我不打basic_ack,则如果我多次运行代码,则消息将再次发送。从发送消息的那一刻到它收到ack之前,rabbitmq会有超时吗?

1 个答案:

答案 0 :(得分:1)

  

rabbitmq如何确保不向其他人发送相同的消息   工作人员,直到我给basic_ack打电话?

仅向一个用户传递消息是RabbitMQ的 核心功能 。邮件将保持未确认状态,直到被传递给它的使用者确认它,或者被传递给它的渠道关闭为止。

  

在我的测试中,如果我不打basic_ack,消息将再次发送   如果我多次运行代码。

当您多次运行代码时,会发生以下情况:

  • RabbitMQ将消息传递给您的消费者,并将其移至未确认状态。
  • 您可以在不调用basic_ack的情况下停止用户应用程序,这将关闭通道和连接,而无需确认消息。
  • RabbitMQ检测到此情况并重新排队该消息。
  • 您重新启动消费者,它就会重新传递消息。
  • 起泡,冲洗,重复。

RabbitMQ documentation涵盖了所有这些以及更多内容。


注意: RabbitMQ团队监视rabbitmq-users mailing list,并且有时仅在StackOverflow上回答问题。