Введение: зачем нам эти очереди?
Представьте: ваш 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 если:
- ✅ Данные нужны многим потребителям
- ✅ Нужна история сообщений
- ✅ Ожидается высокая нагрузка
И помните: лучший инструмент — тот, который решает вашу задачу, а не тот, что в тренде 😉