Ruby, RabbitMQ или Kafka — что выбрать и зачем?

Введение: зачем нам эти очереди?

Представьте: ваш Ruby-сервис получает тысячи запросов в секунду, и каждый требует отправки email, обновления аналитики и записи в лог. Если делать это синхронно — пользователи будут ждать как в очереди за новым iPhone.

Вот где появляются RabbitMQ (почтальон) и Kafka (гигантский конвейер). Они берут нагрузку на себя, а ваш код спокойно занимается своим делом.


RabbitMQ: надежный почтальон

Плюсы 🎯

  • Простота: Поднять брокер — brew install rabbitmq, и готово.
  • Гибкость: Очереди, публикация/подписка (pub/sub), роутинг сообщений.
  • Надежность: Подтверждения (ack), повторные попытки, dead letter queues.

Минусы ⚠️

  • Не для big data: Если сообщений больше миллиона в день — начинает хрипеть.
  • Нет истории: Сообщения исчезают после обработки (если не настроено иное).

Когда использовать с Ruby?

# Типичный пример: фоновые задачи в Rails
class UserNotifier
  include Sneakers::Worker
  from_queue 'user_emails'

  def work(message)
    user = User.find(JSON.parse(message)['user_id'])
    UserMailer.welcome(user).deliver_now
    ack! # Подтверждаем обработку
  end
end

Идеально для:

  • Очередей задач (Sidekiq альтернатива)
  • Фоновой отправки email/SMS
  • Микросервисного взаимодействия

Kafka: конвейер для данных

Плюсы 🚀

  • Скорость: Обрабатывает миллионы сообщений в секунду.
  • Надежность: Сообщения хранятся (дни/недели) и могут быть перечитаны.
  • Масштабируемость: Легко добавлять новые узлы.

Минусы ⚠️

  • Сложность: Требует ZooKeeper, настройка — не для слабонервных.
  • Overkill: Для 100 сообщений в день — как стрелять из пушки по воробьям.

Ruby + Kafka пример:

# Отправка событий в Kafka
WaterDrop.setup do |config|
  config.deliver = true
  config.kafka = { 'bootstrap.servers': 'localhost:9092' }
end

event = {
  user_id: 42,
  event: 'purchase',
  amount: 99.99,
  timestamp: Time.now.utc.iso8601
}

WaterDrop::SyncProducer.call(event.to_json, topic: 'user_events')

Идеально для:

  • Аналитики в реальном времени
  • Логирования действий пользователей
  • Синхронизации данных между сервисами

Сравнение: RabbitMQ vs Kafka

Параметр RabbitMQ Kafka
Скорость До ~50K msg/sec Миллионы msg/sec
Надежность Отличная Идеальная
Сложность Просто Средне-сложно
Данные Эфемерные Персистентные
Ruby гемы bunny, sneakers rdkafka, racecar
Когда Задачи, уведомления Потоки событий, аналитика

Практика: когда что выбрать?

Выбирайте RabbitMQ если:

  • Нужны фоновые задачи (как Sidekiq, но с брокером)
  • Важен простой dead letter queue для неудачных задач
  • Сообщения должны быть доставлены быстро, но не нужны позже

Выбирайте Kafka если:

  • События нужны нескольким потребителям (аналитика, логи, нотификации)
  • Нужна возможность “перемотать” и перечитать старые сообщения
  • Ожидается рост нагрузки в 10-100 раз

Антипаттерны: когда не стоит использовать

Для RabbitMQ:

  • Хранение данных: Это не база данных!
  • Очень большие сообщения: > 1MB — уже проблема.
  • Сложные маршруты: Если роутинг становится умнее самого приложения.

Для Kafka:

  • Маленькие проекты: Поддержка кластера не стоит усилий.
  • Срочные сообщения: Лаг в 100ms — это норма для Kafka.
  • Без DevOps: В одиночку админить кластер — боль.
  • Использовать только как “”очередь задач” — это частый и вредный антипаттерн

    ⚠️ Kafka для этого не оптимальна.


Заключение: почтальон или конвейер?

Выбор между RabbitMQ и Kafka — это как выбор между велосипедом и грузовиком.

Нужно доставить пару писем? Берите RabbitMQ — простой и надежный. Запускаете цифровую фабрику данных? Тогда Kafka — ваш мощный конвейер.

А если сомневаетесь — начните с RabbitMQ. Когда он начнет задыхаться под нагрузкой, вы точно поймете, что пора переходить на Kafka.


Чек-лист выбора

Выберите RabbitMQ если:

  • ✅ Нужны очереди задач
  • ✅ Сообщения обрабатываются один раз
  • ✅ Хочется простота и быстрота настройки

Выберите Kafka если:

  • ✅ Данные нужны многим потребителям
  • ✅ Нужна история сообщений
  • ✅ Ожидается высокая нагрузка

И помните: лучший инструмент — тот, который решает вашу задачу, а не тот, что в тренде 😉

🗓 Дата публикации: 28.05.2025, но это не точно...

Ruby RabbitMQ Kafka message brokers event streaming брокеры сообщений