Вопрос с собеседования · Брокеры сообщений

Что вы выберете для очереди фоновых задач, а что для шины событий между сервисами — RabbitMQ или Kafka?

MiddleRabbitMQ и SQSKafkaRabbitMQ
Ещё спрашивают так:
  • Когда RabbitMQ лучше Kafka?
Коротко

Очередь задач — RabbitMQ (или SQS): подтверждение каждого сообщения, повторы, DLX, приоритеты, отложенная доставка, медленная задача не блокирует остальные. Шина событий — Kafka: хранение и перечитывание, много независимых потребителей, порядок по ключу, большой поток.

  • Задачи разной длительности в Kafka блокируют партицию — head-of-line blocking
  • В RabbitMQ нет перечитывания истории и сложнее масштабировать огромный поток
  • Часто в одной системе оба: Kafka для событий, RabbitMQ или очереди для задач

А ещё Решающий вопрос — нужна ли история и сколько независимых потребителей

Подробно

Фоновые задачи (сгенерировать PDF, отправить письмо, обработать видео): каждую задачу должен взять один воркер, подтвердить после выполнения, при сбое — повторить, после N попыток — отложить в DLQ. Задачи разной длительности. RabbitMQ делает это из коробки: конкурирующие потребители на одной очереди, prefetch для справедливого распределения, DLX, TTL, приоритеты, отложенная доставка (плагин). В Kafka одна медленная задача задерживает всю партицию, а повторы требуют отдельных топиков.

Шина событий («заказ создан», «платёж прошёл»): несколько сервисов реагируют независимо, новый сервис может прочитать историю, нужен порядок событий сущности, объёмы большие. Kafka: журнал с хранением, группы потребителей, порядок по ключу, CDC и потоковая обработка. В RabbitMQ пришлось бы держать очередь на каждого подписчика, а прочитанное пропадает.

Другие критерии: эксплуатация (управляемые сервисы), экосистема, требования к задержке (RabbitMQ обычно ниже при малых объёмах), объём (Kafka — на порядки больше).

Что хотят услышать

  • Выбор по сценарию с обоснованием.
  • Почему Kafka неудобна для задач разной длительности.
  • Почему RabbitMQ неудобен для шины событий с историей.

Частые ошибки

  • Выбирать по «что быстрее», без учёта модели.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Всегда Kafka — она быстрее
  • ✓Задачи с подтверждением и маршрутизацией — RabbitMQ; шина событий с replay — Kafka
  • ✗Для фоновых задач Kafka — в ней есть приоритеты сообщений
  • ✗Всегда RabbitMQ — Kafka не гарантирует доставку

Что спросят дальше

  • Что такое exchange в RabbitMQ?
  • Когда Kafka как очередь неудобна?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования