Какие библиотеки Python используются для работы с RabbitMQ?

Ответ

Для работы с RabbitMQ в Python существует несколько популярных библиотек, выбор которых зависит от требований к синхронности и уровню абстракции.

  1. pika Это официальная клиентская библиотека для RabbitMQ на Python. Она предоставляет низкоуровневый доступ к протоколу AMQP 0-9-1 и поддерживает как блокирующий, так и неблокирующий режимы работы. pika является хорошим выбором для большинства синхронных приложений.

    Пример синхронного подключения и отправки сообщения:

    
    import pika

Установка соединения с RabbitMQ

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel()

Объявление очереди

channel.queue_declare(queue='hello')

Отправка сообщения

channel.basic_publish(exchange='', routing_key='hello', body='Hello World!') print(" [x] Sent 'Hello World!'")

Закрытие соединения

connection.close()


2.  **`aio-pika`**
    Эта библиотека построена на базе `pika` и предназначена для асинхронной работы с RabbitMQ, используя `asyncio`. Она идеально подходит для высокопроизводительных асинхронных приложений, таких как веб-серверы на FastAPI или Starlette.

    **Пример асинхронной отправки сообщения:**
    ```python
import asyncio
import aio_pika

async def send_message():
    # Установка надежного асинхронного соединения
    connection = await aio_pika.connect_robust("amqp://guest:guest@localhost/")
    async with connection:
        channel = await connection.channel() # Создание канала

        # Отправка сообщения через обменник по умолчанию
        await channel.default_exchange.publish(
            aio_pika.Message(body=b"Hello World! (async)"),
            routing_key="hello"
        )
        print(" [x] Sent 'Hello World! (async)'")

if __name__ == "__main__":
    asyncio.run(send_message())

Альтернативы и высокоуровневые решения:

  • celery: Это мощный фреймворк для распределенных задач, который может использовать RabbitMQ (через pika или kombu) в качестве брокера сообщений. Celery предоставляет абстракции для создания фоновых задач, планирования и мониторинга.
  • kombu: Универсальная библиотека для обмена сообщениями, которая поддерживает различные брокеры, включая RabbitMQ. Kombu предоставляет более высокоуровневый API по сравнению с pika и часто используется как компонент в других проектах (например, в Celery).

Ответ 18+ 🔞

Так, слушай, про кролика этого, RabbitMQ, на питоне. Библиотек, блядь, как говна за баней, но реально пару штук выживают, остальное — мартышлюшка какая-то.

Первое, pika — это типа официальный, низкоуровневый дед. Прямо в протокол AMQP лезешь, как в душу. Для синхронного говна — то, что надо. Простой, как три копейки, но если накосячишь — сам виноват, пидарас шерстяной.

Смотри, как с ним работать:

import pika

# Подключаемся к кролику на локалхосте
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

# Создаём очередь, если её нет — она появится, как геморрой от перенапряжения
channel.queue_declare(queue='hello')

# Шлём сообщение в очередь 'hello'
channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')
print(" [x] Sent 'Hello World!'")

# Закрываем соединение, а то кролик сдохнет от открытых коннектов
connection.close()

Второе, aio-pika — это когда тебе мало просто послать сообщение, а надо, чтобы всё летало, как угорелое, в асинхронном режиме. Для FastAPI, всяких асинхронных монстров — идеально, ёпта.

Вот так это выглядит:

import asyncio
import aio_pika

async def send_message():
    # Подключаемся надёжно, чтобы не отвалилось на полпути
    connection = await aio_pika.connect_robust("amqp://guest:guest@localhost/")
    async with connection:
        channel = await connection.channel() # Канал создаём

        # Шлём сообщение через обменник по умолчанию
        await channel.default_exchange.publish(
            aio_pika.Message(body=b"Hello World! (async)"),
            routing_key="hello"
        )
        print(" [x] Sent 'Hello World! (async)'")

if __name__ == "__main__":
    asyncio.run(send_message())

А ещё есть, блядь, высокоуровневые штуки, чтобы мозги не выносить:

  • celery — это вообще отдельная религия. Фреймворк для фоновых задач, который может использовать нашего кролика как брокера. Хочешь задачи в очередь пихать, чтобы они где-то там на других воркерах выполнялись — это твой выбор. Но готовься к тому, что настройка — это пиздец, иногда проще самому написать.
  • kombu — универсальная обёртка над разными брокерами, включая RabbitMQ. Чуть выше уровнем, чем pika, часто внутри celery используется. Если не хочешь ковыряться в кишках AMQP — можешь попробовать, но иногда от этой абстракции только волнение ебать.

Короче, если просто и синхронно — бери pika. Если всё должно нестись асинхронно — aio-pika. А если задачи какие-то ебашить в фоне — смотри в сторону celery, но не ной, что сложно, сам лез, хитрая жопа.