Как очередь гарантирует доставку сообщений

«Как очередь гарантирует доставку сообщений» — вопрос из категории Брокеры сообщений, который задают на 27% собеседований Системный Аналитик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Очередь гарантирует доставку сообщений через механизмы подтверждения (acknowledgment) и сохранения состояния. Основные принципы:

  1. Сохранение сообщений – сообщения хранятся в надежном хранилище (например, диске) до подтверждения обработки.
  2. Подтверждение (ACK/NACK) – потребитель явно подтверждает успешную обработку (ACK), иначе сообщение возвращается в очередь или перенаправляется в Dead Letter Queue (DLQ).
  3. Транзакции – поддержка транзакционных операций для обеспечения атомарности (например, в RabbitMQ или Kafka).

Пример на Python с RabbitMQ:

import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='task_queue', durable=True)  # durable=True для сохранения на диск

# Публикация с persistence
channel.basic_publish(
    exchange='',
    routing_key='task_queue',
    body='Сообщение',
    properties=pika.BasicProperties(delivery_mode=2)  # delivery_mode=2 для persistence
)

# Подписка с ручным ACK
def callback(ch, method, properties, body):
    print(f"Получено: {body}")
    ch.basic_ack(delivery_tag=method.delivery_tag)  # Подтверждение

channel.basic_consume(queue='task_queue', on_message_callback=callback, auto_ack=False)
channel.start_consuming()