Какие месседж брокеры вы использовали и как они работают
Что проверяют
Понимаете ли вы разницу между очередью задач и журналом событий и почему выбор брокера меняет код потребителя. Следом спрашивают про гарантии доставки и о том, что будет, если обработчик упал посередине.
Как отвечать
Говорите о брокерах, с которыми работали сами, и для каждого объясняйте модель:
- RabbitMQ: брокер на AMQP 0-9-1. Продюсер пишет в exchange (
direct,topic,fanout,headers), тот по binding раскладывает сообщения по очередям. Потребитель подтверждает обработкуack, без подтверждения сообщение вернётся в очередь.prefetch_countограничивает число неподтверждённых сообщений, неудачные уходят в dead letter exchange. Для надёжности берут quorum queues, зеркалирование классических очередей в 4.0 удалили; - Kafka: распределённый журнал. Топик делится на партиции, порядок гарантирован только внутри партиции, сообщения после чтения не удаляются и живут по retention. Потребитель хранит свой offset, consumer group делит партиции между экземплярами, так что потребителей в группе больше числа партиций держать бессмысленно. С 4.0 Kafka работает без ZooKeeper, на KRaft;
- Redis: Pub/Sub ничего не хранит, отключённый подписчик просто пропускает сообщения. Для очереди с подтверждениями есть Streams:
XADD,XREADGROUP,XACK.
Из Python: aio-pika или pika для RabbitMQ, aiokafka или confluent-kafka для Kafka, redis.asyncio для Redis. Для фоновых задач часто берут Celery поверх RabbitMQ или Redis, для асинхронных сервисов FastStream.
Про гарантии: на практике почти везде at-least-once, значит обработчик должен быть идемпотентным, например через ключ операции в базе. Exactly-once в Kafka работает только внутри неё самой, на транзакциях.
Где спотыкаются
Используют Kafka как очередь задач и удивляются, что параллелизм упирается в число партиций, а одно тяжёлое сообщение тормозит всю партицию.
Включают автоподтверждение (auto_ack=True в pika) и теряют сообщения при падении обработчика.
Говорят, что Redis Pub/Sub теряет сообщения при перезапуске. Он их вообще не хранит: доставка идёт только тем, кто подписан в этот момент.