Как отправить сообщение в очередь RabbitMQ с помощью библиотеки pika в Python?

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

Ответ

Отправка (publishing) сообщений в RabbitMQ на Python чаще всего выполняется с помощью библиотеки pika. Процесс состоит из установления соединения, создания канала и публикации сообщения в точку обмена (exchange).

Ключевые шаги:

  1. Установить соединение с RabbitMQ.
  2. Создать канал — легковесное соединение внутри основного.
  3. Объявить очередь (queue_declare), чтобы убедиться в её существовании. Если очередь не существует, она будет создана. Указание durable=True сохранит очередь при перезапуске брокера.
  4. Опубликовать сообщение (basic_publish) в точку обмена. Пустая строка exchange='' означает использование default exchange, который направляет сообщение в очередь, чьё имя совпадает с routing_key.

Пример кода (Publisher)

Использование with гарантирует корректное закрытие соединения даже при ошибках.

import pika

# Параметры подключения
connection_params = pika.ConnectionParameters('localhost')

# Устанавливаем соединение (контекстный менеджер закроет его автоматически)
try:
    with pika.BlockingConnection(connection_params) as connection:
        # Создаем канал
        channel = connection.channel()

        # Объявляем очередь. idempotent-операция.
        # durable=True делает очередь устойчивой к перезапуску RabbitMQ
        channel.queue_declare(queue='hello_queue', durable=True)

        message_body = 'Hello, RabbitMQ!'

        # Публикуем сообщение
        channel.basic_publish(
            exchange='',  # Default exchange
            routing_key='hello_queue', # Имя очереди
            body=message_body.encode('utf-8'), # Сообщение должно быть в байтах
            properties=pika.BasicProperties(
                delivery_mode=2,  # Сделать сообщение персистентным
            )
        )

        print(f" [x] Sent '{message_body}'")

except pika.exceptions.AMQPConnectionError as e:
    print(f"Failed to connect to RabbitMQ: {e}")

Важно:

  • Персистентность: Чтобы сообщения не терялись при перезапуске брокера, и очередь (durable=True), и сами сообщения (delivery_mode=2) должны быть помечены как персистентные.