Как rabbitmq синхронизирует сообщения? - PullRequest
0 голосов
/ 31 января 2019

Я использую этот простой код, используя 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, сообщение будет отправлено снова, если я выполню код несколько раз.Имеет ли rabbitmq некоторый тайм-аут с момента отправки сообщения до получения ack?

1 Ответ

0 голосов
/ 31 января 2019

как rabbitmq может не передавать такое же сообщение другому работнику, пока я не позвоню basic_ack?

Доставка сообщения только одному потребителю - основная особенность RabbitMQ.Сообщение не будет подтверждено до тех пор, пока потребитель, которому оно было доставлено, не подтвердит его, или пока канал, по которому оно было доставлено, не закроется.

в моих тестах, если я не назову basic_ack сообщениембудет отправлено снова, если я выполню код несколько раз.

Когда вы запускаете код несколько раз, вот что происходит:

  • RabbitMQ доставляет сообщение вашему потребителю, переводя его в незафиксированное состояние.
  • Вы останавливаете свое потребительское приложение без вызова basic_ack, который закрывает канал и соединение без подтверждения сообщения.
  • RabbitMQ обнаруживает это и повторноставит в очередь сообщение.
  • Вы перезапускаете своего потребителя, и оно повторно доставляет сообщение.
  • Пену, полоскание, повтор.

Все этои многое, многое другое описано в документации RabbitMQ .


ПРИМЕЧАНИЕ: команда RabbitMQ отслеживает рассылку rabbitmq-users list и только иногда отвечает queв StackOverflow.

...