Ответ
Брокеры сообщений — это ключевой компонент для построения распределенных и асинхронных систем. Они позволяют сервисам общаться, не зная друг о друге напрямую, что повышает отказоустойчивость и масштабируемость.
Основные брокеры, используемые с Python:
-
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() -
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() -
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:
-
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() -
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() -
Redis (Pub/Sub) Ну а это наш, блядь, шустрик. В основном-то он хранилище в памяти, но заодно умеет и в простенький Pub/Sub. Только вот загвоздка: если подписчик в момент отправки был в отъезде или просто обосрался — сообщение улетает в никуда, нахуй. Потерялось и хрен с ним. Зато скорость — чих-пых! Для каких-нибудь уведомлений в реальном времени, где надёжность не критична, — самое то.
Примерчик на
redis-py:import redis r = redis.Redis() # Тот, кто кричит (Publisher) r.publish('notifications', 'User logged in')
А теперь про системы очередей задач, чтоб ты не путался:
- Celery — это, ёпта, НЕ брокер, это уже целый фреймворк для распределённых задач. Он как раз и использует кого-то из ребят выше (RabbitMQ или Redis) в качестве своей почтовой лошади. Celery — это высокоуровневая надстройка, которая говорит: «Эй, чувак, вот эту задачу выполни где-нибудь на задворках, а результат мне потом принеси». Фоновые задачи, отложенный запуск, периодичность — его конёк. Просто запомни: Celery без брокера — как Герасим без Муму, нихуя не работает.