Как rabbitmq синхронизирует сообщения?
Я использую этот простой код, используя 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 ответ
Как может rabbitmq не передавать такое же сообщение другому работнику, пока я не вызову basic_ack?
Доставка сообщения только одному потребителю является основной функцией RabbitMQ. Сообщение не будет подтверждено до тех пор, пока его не подтвердит получатель, или канал, по которому оно было доставлено, не закроется.
в моих тестах, если я не буду вызывать basic_ack, сообщение будет отправлено снова, если я выполню код несколько раз.
Когда вы запускаете свой код несколько раз, вот что происходит:
- RabbitMQ доставляет сообщение вашему потребителю, переводя его в незафиксированное состояние.
- Вы останавливаете свое потребительское приложение без звонка
basic_ack
, который закрывает канал и соединение без подтверждения сообщения. - RabbitMQ обнаруживает это и повторно помещает сообщение в очередь.
- Вы перезапускаете своего потребителя, и он повторно доставляет сообщение.
- Вспенить, промыть, повторить.
Все это и многое, многое другое описано в документации RabbitMQ.
ПРИМЕЧАНИЕ: команда RabbitMQ контролирует rabbitmq-users
список рассылки и только иногда отвечает на вопросы по Stackru.