Какие брокеры сообщений популярны в экосистеме Python?

Ответ

Брокеры сообщений — это ключевой компонент для построения распределенных и асинхронных систем. Они позволяют сервисам общаться, не зная друг о друге напрямую, что повышает отказоустойчивость и масштабируемость.

Основные брокеры, используемые с Python:

  1. RabbitMQ Один из самых популярных брокеров, реализующий протокол AMQP. Предоставляет гибкие возможности маршрутизации сообщений через обменники (exchanges) и очереди (queues). Идеален для сложных сценариев, где важна гарантированная доставка и порядок сообщений.

    Пример с библиотекой pika:

    import pika
    
    connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
    channel = connection.channel()
    channel.queue_declare(queue='task_queue', durable=True)
    
    channel.basic_publish(
        exchange='',
        routing_key='task_queue',
        body='New task data',
        properties=pika.BasicProperties(delivery_mode=2) # make message persistent
    )
    connection.close()
  2. Apache Kafka Распределенная стриминговая платформа. В отличие от традиционных брокеров, Kafka работает как распределенный лог событий, что обеспечивает высочайшую пропускную способность и отказоустойчивость. Используется для обработки потоков данных в реальном времени, сбора логов и аналитики.

    Пример с confluent-kafka:

    from confluent_kafka import Producer
    
    producer = Producer({'bootstrap.servers': 'localhost:9092'})
    producer.produce('user-logins', key='user1', value='{"status": "success"}')
    producer.flush()
  3. Redis (Pub/Sub) Redis, будучи в первую очередь in-memory хранилищем, предоставляет простой механизм Publish/Subscribe. Он не гарантирует доставку сообщений (если подписчик офлайн, сообщение теряется), но отлично подходит для легковесных систем уведомлений и задач, где скорость важнее надежности.

    Пример с redis-py:

    import redis
    
    r = redis.Redis()
    # Publisher
    r.publish('notifications', 'User logged in')

Системы очередей задач:

  • Celery — это не брокер, а распределенная очередь задач, которая использует брокер (RabbitMQ или Redis) для передачи сообщений. Celery предоставляет высокоуровневый API для выполнения фоновых задач, отложенных вызовов и периодических работ.

Ответ 18+ 🔞

А, слушай, вот эта вся хуйня про брокеры сообщений — это, блядь, как раз то, что заставляет твою систему не развалиться в пизду, когда один сервис решит, что он устал и хочет поспать. Это типа посредники, которые передают сообщения, чтобы сервисы не знали друг о друге в лицо, как соседи по лестничной клетке, которые только слышат, как кто-то срет в туалете. Отказоустойчивость, масштабируемость — вот это всё, епта.

Ну, смотри, основные кандидаты на эту роль в мире Python:

  1. RabbitMQ Этот, сука, старый добрый зверь, реализует протокол AMQP. Он не просто тупо швыряет сообщения, он там с обменниками (exchanges) и очередями (queрей) может такие пируэты вытворять, что у тебя голова закружится. Если тебе важна гарантированная доставка и порядок, как в очереди за колбасой в девяностые — это твой выбор.

    Вот как с ним общаться через pika (код не трогаю, он святой):

    import pika
    
    connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
    channel = connection.channel()
    channel.queue_declare(queue='task_queue', durable=True)
    
    channel.basic_publish(
        exchange='',
        routing_key='task_queue',
        body='New task data',
        properties=pika.BasicProperties(delivery_mode=2) # make message persistent
    )
    connection.close()
  2. Apache Kafka А это уже не просто брокер, это, блядь, распределённый лог событий, монстр. Он не удаляет сообщения после прочтения, они там лежат, как свидетельства твоих прошлых грехов. Пропускная способность — овердохуища. Используется, когда нужно гонять терабайты данных в реальном времени, типа логов или аналитики. С ним уже не пошутишь.

    Пример с confluent-kafka (код опять же неприкосновенен):

    from confluent_kafka import Producer
    
    producer = Producer({'bootstrap.servers': 'localhost:9092'})
    producer.produce('user-logins', key='user1', value='{"status": "success"}')
    producer.flush()
  3. Redis (Pub/Sub) Ну а это наш, блядь, шустрик. В основном-то он хранилище в памяти, но заодно умеет и в простенький Pub/Sub. Только вот загвоздка: если подписчик в момент отправки был в отъезде или просто обосрался — сообщение улетает в никуда, нахуй. Потерялось и хрен с ним. Зато скорость — чих-пых! Для каких-нибудь уведомлений в реальном времени, где надёжность не критична, — самое то.

    Примерчик на redis-py:

    import redis
    
    r = redis.Redis()
    # Тот, кто кричит (Publisher)
    r.publish('notifications', 'User logged in')

А теперь про системы очередей задач, чтоб ты не путался:

  • Celery — это, ёпта, НЕ брокер, это уже целый фреймворк для распределённых задач. Он как раз и использует кого-то из ребят выше (RabbitMQ или Redis) в качестве своей почтовой лошади. Celery — это высокоуровневая надстройка, которая говорит: «Эй, чувак, вот эту задачу выполни где-нибудь на задворках, а результат мне потом принеси». Фоновые задачи, отложенный запуск, периодичность — его конёк. Просто запомни: Celery без брокера — как Герасим без Муму, нихуя не работает.