img

Самое важное про очереди сообщений: Kafka vs RabbitMQ vs SQS

Три года назад мы были убеждены, что Kafka - это ответ на все. "Это то, что использует LinkedIn!" - сказали мы в своей команде. Мы потратили два месяца на настройку Kafka для простой фоновой системы, обрабатывающей может быть по 100 сообщений в час. Спойлер: мы должны были использовать SQS и сэкономить восемь недель мучений.

icon strelka icons icons

узнай больше на курсе

Python программист с нуля
Стань разработчиком на одном из самых популярных языков программирования - Python
Подробнее о курсе
Java-разработчик с нуля
Освойте backend-разработку и программирование на Java, фреймворки Spring и Maven, работу с базами данных и API
Подробнее о курсе
C# разработчик с нуля
На курсе ты освоишь основы программирования на C#, включая синтаксис, объектно-ориентированное программирование и асинхронное программирование.
Подробнее о курсе

Позвольте спасти вас от той же ошибки. Выбор между RabbitMQ, Kafka и SQS - это не о том, что лучше, а о том, что подходит конкретной вашей задаче. Давайте разбираться.

 

Что такое очередь сообщений вообще?

Очередь сообщений - это как список задач для вашего приложения. Одна часть приложения кладет сообщения (задачи) в очередь, другая часть их берет и обрабатывает. Красивое в этом - они не обязаны быть одновременно онлайн.

Подумайте об этом как об электронной почте. Вы отправляете сообщение (produce), оно лежит во "входящих" получателя (queue), и он его читает, когда готов (consume). Отправитель не ждет, пока получатель ответит.

В современной архитектуре брокеры сообщений играют ключевую роль в обеспечении эффективного обмена данными между компонентами. Вы строите микросервисы, обрабатываете события или фоновые задания - рано или поздно нужен один из этих инструментов.

Три претендента

Позвольте представить участников:

  • Kafka: "зверь" с высокой пропускной способностью. Разработан в LinkedIn в 2011 году, сейчас - в проектах Apache Software Foundation. Предназначен для масштабов и стриминга событий.
  • RabbitMQ: надежный рабочий конь. Существует с ~2007 года, реализует протокол AMQP. Сфокусирован на гибкой маршрутизации и надежности.
  • AWS SQS: управляемый сервис удобства. Очередь сообщений от Amazon Web Services. Нулевая настройка, бесконечный масштаб, но привязка к AWS.

У каждого из них свой подход к обмену сообщениями. Давайте погрузимся.

Kafka: платформа потоковой передачи событий

На самом деле Kafka - это не просто очередь сообщений. Это распределенная платформа для стриминга событий. Разница важна.

Kafka - это publish‑subscribe система, использующая очередь сообщений как стойкое хранилище. Предназначена для высокой пропускной способности, реал‑временных стримов и пакетной обработки.

Как Kafka работает
Kafka хранит сообщения (события) в темах (topics). Темы делятся на разделы (partitions) для параллелизма. Сообщения сохраняются в течение настроенного времени (дни, недели, можно навсегда). Несколько потребителей могут читать одни и те же сообщения, потому что Kafka не удаляет их сразу после чтения.

Ключевое понимание: Kafka - это лог. События добавляются к логу, и потребители отслеживают свою позицию (offset) в этом логе. Хотите переиграть события за прошлую неделю? Просто сбросьте свой offset. Это мощно.

Когда Kafka выигрывает:

  • Когда критически важна высокая пропускная способность: Kafka часто измеряли в миллионах событий в секунду.
  • Когда важно хранение истории событий или "event sourcing".
  • Когда несколько сервисов должны получать одни и те же данные независимо друг от друга.
  • Когда нужно аналитика в реальном времени.

Пример: На стартапе соцсети мы использовали Kafka для ленты активности пользователей:

# Post created  
    kafka.send('user‑activity', {  
      'type': 'post_created',  
      'user_id': 123,  
      'post_id': 456,  
      'timestamp': now()  
    })  
    # Потребители  
    # 1. Построитель ленты  
    # 2. Аналитика отслеживает вовлечение  
    # 3. Сервис уведомлений  
    # 4. Индексовый сервис поиска  
    

Все четыре сервиса потребляли одни и те же события с собственной скоростью. Аналитика шла медленно? Не проблема - лента все равно была быстрой.

"Налог сложности" Kafka:

  • Kafka сложно запускать. Нужен ZooKeeper (хотя новые версии движутся от него), нужно понимать партиционирование, репликацию, группы потребителей и управление offset’ами.
  • Операционная сложность: настройка, поддержка, мониторинг распределенной системы - требует задач DevOps.
  • Оверхед для простых задач: если вам просто нужно отправить email асинхронно, Kafka будет как грузовик, чтоб купить продукты.

RabbitMQ: традиционный брокер сообщений

RabbitMQ - это брокер сообщений, который реализует протокол AMQP и поддерживает широкий диапазон шаблонов обмена. В отличие от Kafka, которая хранит сообщения для многократного чтения, RabbitMQ доставляет сообщения один раз и удаляет их после подтверждения.

RabbitMQ - то, что большинство людей думают, когда слышат "сообщение‑очередь". Это настоящая очередь: сообщения приходят, потребитель берет, процессирует, сообщение удаляется.

Как работает RabbitMQ:
Producer (производитель) публикует сообщение в exchange. Exchange маршрутизирует сообщение в одну или несколько очередей. Consumer (потребитель) читает из очереди, подтверждает (ack) получение, тогда сообщение удаляется.

Когда RabbitMQ отлично подходит:

  • Когда требуется гибкая маршрутизация: типы exchanges (direct, topic, fanout, headers) позволяют сложную маршрутизацию.
  • Когда нужна традиционная очередь задач: фоновые задания, email‑отправки, генерация отчетов.
  • Когда нужны приоритетные очереди или шаблоны запрос‑ответ (RPC).

Ограничения RabbitMQ:

  • Не для огромного масштаба: хороший для десятков тысяч сообщений в секунду, но не миллионов.
  • Нет встроенной возможности "переиграть" сообщения после потребления - как в Kafka.
  • Если потребители замедляются - очередь может расти, нагрузка на память возрастает.

AWS SQS: управляемое решение

Amazon SQS - это полностью управляемый сервис очередей сообщений от AWS. В отличие от Kafka и RabbitMQ, SQS является безсерверным: AWS управляет инфраструктурой, масштабированием и обслуживанием.

SQS - это вариант "я не хочу управлять инфраструктурой". Нулевая настройка, автоматический масштаб, но зависимость от AWS.

Как работает SQS:
Создаете очередь, отправляете сообщения, получаете сообщения, обрабатываете, удаляете. Все просто.

SQS имеет два типа очередей:

  • Standard Queue: доставка "как минимум один раз", порядок не гарантирован, бесконечная пропускная способность.
  • FIFO Queue: точно‑один раз, строгий порядок, ограничена ~3 000 сообщений/сек (300 с батчингом).

Когда SQS идеальна:

  • Вы уже на AWS: интеграция с AWS Lambda, S3, SNS - бесшовная.
  • Вы хотите нулевой операционный накладной: нет серверов, нет настройки, масштаб автоматический.
  • Архитектура безсерверная: SQS + Lambda - отличное сочетание.
  • Простые нужды очередей: надежная доставка без сложной маршрутизации.

Ограничения SQS:

  • Привязка к AWS: перенос на GCP или Azure может быть затруднен.
  • Более высокая латентность: чем у Kafka или RabbitMQ.
  • Ограничение по размеру сообщения: максимум 256 KB. Если больше - нужен обходной путь (например, положить данные в S3 и передать ссылку).

Матрица решения

Вот как я на самом деле выбираю:

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

  • ✅ Нужна обработка миллионов сообщений в секунду
  • ✅ Много сервисов должны потреблять одни и те же события
  • ✅ Важна переигровка событий или аудит истории
  • ✅ Строите real‑time потоковую аналитику
  • ❌ У вас маленькая команда без DevOps‑экспертизы
  • ❌ Пропускная способность < 100 k сообщений/сек
  • ❌ Просто нужно фоновые задания

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

  • ✅ Нужна гибкая маршрутизация
  • ✅ Традиционная схема очередей задач
  • ✅ Хотите меньше операций чем с Kafka
  • ✅ Пропускная способность < 100 k сообщений/сек вполне достаточна
  • ✅ Нужны приоритеты, сложные маршруты
  • ❌ Нужен масштаб миллионов сообщений/сек
  • ❌ Важна переигровка истории событий
  • ❌ Хотите вообще не управлять инфраструктурой

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

  • ✅ Вы на AWS
  • ✅ Хотите нулевой операционный накладной
  • ✅ Архитектура безсерверная
  • ✅ Простые очереди - это все, что нужно
  • ❌ Нужна субсекундная латентность
  • ❌ Возможно переезд с AWS
  • ❌ Нужна сложная маршрутизация или шаблоны сообщений

Сравнение в цифрах из реального мира

Позвольте привести реальные числа из продакшн‑систем:

  • Пропускная способность:
      ‑ Kafka: 1 М+ сообщений/сек (пример: 5 М/сек на хорошо настроенном кластере)
      ‑ RabbitMQ: 20 000‑50 000 сообщений/сек (для большинства задач этого достаточно)
      ‑ SQS: тысячи сообщений/сек (Standard очередь - почти неограничена, FIFO имеет ограничение)
  • Задержка:
      ‑ Kafka: несколько миллисекунд
      ‑ RabbitMQ: десятки миллисекунд
      ‑ SQS: секунды (зависит от числа сообщений, размера и сетевых условий)
  • Хранение/удержание:
      ‑ Kafka: конфигурируется, может быть бесконечным
      ‑ RabbitMQ: пока сообщение не потреблено (или TTL истек)
      ‑ SQS: по умолчанию 4 дня, максимум 14 дней

Гибридные подходы

Не думайте, что надо выбирать один‑единственный инструмент навсегда. Я часто использую комбинации:

  • Kafka + SQS: События стримятся в Kafka для аналитики. Специфические задачи отправляются в SQS для обработки через Lambda.
  • RabbitMQ + SQS: RabbitMQ для критичной бизнес-логики. SQS - для менее критичных фоновых работ.

Инструменты дополняют друг друга. Kafka - для high‑throughput и real‑time. RabbitMQ - для гибкости и шаблонов. SQS - для простоты и управления.

Распространенные ошибки

Ошибка №1: Kafka для всего
Я видел, как команда использовала Kafka даже для отправки писем по сбросу пароля. Настройка, операционный накладной и ресурсы - все было чрезмерно. Простая очередь (RabbitMQ или SQS) лучше бы подошла.

Ошибка №2: Необработанные сбои сообщений
Все три системы могут доставлять сообщения несколько раз. Ваши потребители должны быть идемпотентны.

# Плохо: не идемпотентно  
    def process_order(order_id):  
        charge_credit_card(order_id)  # Может списать дважды!  
    # Хорошо: идемпотентно  
    def process_order(order_id):  
        if already_processed(order_id):  
            return  
        charge_credit_card(order_id)  
        mark_as_processed(order_id)  
    

Ошибка №3: Игнорирование Dead Letter Queue
Что случится, если обработка сообщения постоянно не удается? Без DLQ вы либо будете пытаться бесконечно, либо потеряете сообщения.

# Настройка DLQ во всех трех системах  
    # RabbitMQ  
    channel.queue_declare(queue='main_queue',  
                         arguments={'x‑dead‑letter‑exchange':'dlx'})  
    # SQS  
    sqs.create_queue(  
        QueueName='main‑queue',  
        Attributes={  
            'RedrivePolicy': json.dumps({  
                'deadLetterTargetArn': dlq_arn,  
                'maxReceiveCount': '3'  
            })  
        }  
    )  
    # Kafka (используется отдельная тема для ошибок)  
    

Ошибка №4: Отсутствие мониторинга
Вы не можете управлять тем, что не измеряете. Мониторьте: глубину очереди / задержку, скорость обработки, ошибки, состояние потребителей. Я видел очереди, выросшие до миллионов сообщений, потому что никто не заметил, что потребители упали.

Советы по настройке производительности

Для Kafka:

  • Увеличивайте число partition для параллелизма
  • Настройте размер пакетной отправки, сжатие
  • Используйте правильные группы потребителей
  • Мониторьте отставание (consumer lag)

Для RabbitMQ:

  • Используйте durable очереди для постоянства
  • Устанавливайте prefetch‑лимиты
  • Включите "lazy queues" для больших резервов
  • Используйте кластеризацию для высокой доступности

Для SQS:

  • Используйте батчи (отправка/получение до 10 сообщений за раз)
  • Используйте long‑polling вместо короткого опроса
  • Используйте FIFO, только когда важен порядок
  • Рассмотрите комбинацию SNS + SQS для "fan‑out" шаблонов

С чего начать

Если вы строите что‑то новое и не уверены, что выбрать:

  • Начните с SQS, если вы на AWS и хотите простоту
  • Начните с RabbitMQ, если вы сами хостите и нуждаетесь в умеренной пропускной способности и хорошей маршрутизации
  • Начните с Kafka, если вы знаете, что нужны огромные масштабы и стриминг с самого начала

Для большинства проектов я бы рекомендовал начинать с управляемого варианта (SQS или управляемый сервис для Kafka/RabbitMQ), потому что операционная сложность реальна. Оптимизируйте позже, когда у вас появятся реальные данные о загрузке.

Заключительные мысли

Нет единственной "лучшей" очереди сообщений. Kafka, RabbitMQ и SQS - отлично работают, но в разных сценариях.

Kafka выигрывает при огромных масштабах и потоковой передаче событий. RabbitMQ побеждает в гибкости и традиционных шаблонах обмена сообщениями. SQS - в простоте и удобстве управляемого сервиса.

Главное - выбрать инструмент, соответствующий вашим реальным требованиям, а не воображаемому будущему масштабу. Начните с простого, измеряйте фактическую нагрузку и развивайтесь по мере необходимости.

Какую очередь сообщений используете вы? С какими проблемами столкнулись?

Ссылка
скопирована
Получите бесплатные уроки на наших курсах
Все курсы
icon strelka icons icons

узнай больше на курсе

Python программист с нуля
Стань разработчиком на одном из самых популярных языков программирования - Python
Подробнее о курсе
Java-разработчик с нуля
Освойте backend-разработку и программирование на Java, фреймворки Spring и Maven, работу с базами данных и API
Подробнее о курсе
C# разработчик с нуля
На курсе ты освоишь основы программирования на C#, включая синтаксис, объектно-ориентированное программирование и асинхронное программирование.
Подробнее о курсе
Фронтенд-разработчик с нуля
Погрузитесь в мир веб-разработки, освоив основные инструменты работы: HTML, CSS, JavaScript
Подробнее о курсе
Разработка приложений на Flutter и Dart
Научись создавать кроссплатформенные приложения на Flutter, освой язык Dart
Подробнее о курсе
Автоматизированное тестирование на Python
Изучите автоматизацию тестирования на Python чтобы стать востребованным специалистом
Подробнее о курсе
Еще по теме:
img
2005 год. В мире технологий появляется Django - фреймворк, который обещал изменить всё. Модель, шаблон, представление - три слова, которые одновременно вдохновляли и пугали новичков.
img
Бывало у тебя такое, что какой-нибудь сайт упал и вставать не собирается? Это очень неприятно, особенно, когда после этого вся работа просто встаёт. А это всё потому что кто-то не делал код-ревью. Сейчас объясним что это такое.
img
Ну рассказывай, что ты слышал про TypeScript? Ладно-ладно, не пугайся, это не новый язык программирования, который надо учить с нуля, а по сути, прокаченный, как одна из твоих рук, джаваскрипт.
img
А что если мы скажем, что есть способы легко и без боли начать программировать? А потом стать крутым разработчиком, работать в свободном графике и в любое время кушать питсу? Подробнее в статье!
img
Делаем код-ревью корректно - с уважением, эффективностью и улучшением качества, не раздражая коллег
ОСЕННИЕ СКИДКИ
30%
40%
50%
До конца акции: 30 дней 24 : 59 : 59