Мы решили внести свой скромный вклад в развитие комьюнити и перевели оригинальную статью. Статья опубликована на сайте Simplilearn.

Мы все больше полагаемся на данные для выполнения задач в работе и повседневной жизни. Приложения, сервисы, ПО, мобильные устройства и другие элементы объединяются в сложную и разветвленную паутину, которая затрагивает большинство сфер нашей жизни.

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

В чем отличие брокера сообщений и системы Pub/Sub?

Брокеры сообщений – это модули ПО, благодаря которым приложения, службы и системы могут взаимодействовать и обмениваться информацией. Брокеры сообщений преобразуют сообщения от разных формальных протоколов обмена сообщениями, позволяя взаимозависимым службам напрямую «общаться» друг с другом, даже если они написаны на разных языках или работают на других платформах.

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

Pub/Sub или Publish/Subscribe – это схема распространения сообщений, которая позволяет продюсерам публиковать любое необходимое сообщение.

Дата-инженеры и дата-сайентисты называют Pub/Sub методом распространения в стиле вещания, когда между продюсером и консьюмерами существует связь «один ко многим».

Что такое Apache Kafka?

Apache Kafka – это распределенная платформа потоковой передачи событий с открытым исходным кодом, обеспечивающая высокую пропускную способность. Написанная на Java и Scala, Кафка представляет собой шину сообщений системы Pub/Sub, ориентированную на потоки и воспроизведение данных с высокой интенсивностью. Кафка не полагается на очередь, а добавляет сообщения в журнал и оставляет их там до достижения предела хранения или тех пор, пока консьюмер не прочитает эти сообщения.

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

Хотя Кафка поставляется только с Java-клиентом, существует специальный адаптер SDK, который позволяет создать свою особую системную интеграцию. Также существует постоянно пополняемый каталог проектов экосистемы сообщества и клиентов с открытым исходным кодом.

Кафка выпущена в 2011 году, поэтому этот инструмент можно назвать «новичком».

Для чего используется Apache Kafka?

Apache Kafka лучше всего подходит для потоковой передачи от А к Б без сложной маршрутизации, но с максимальной пропускной способностью. Инструмент отлично справляется с event sourcing, потоковой обработкой и моделированием изменений в системе в качестве последовательности событий. Кафку также можно использовать для обработки данных при многоэтапной конвейерной обработке.

Кафка станет отличным решением, если вам нужен фреймворк для хранения, чтения, повторного чтения и анализа потоковых данных. Ее сильная сторона – обработка и анализ данных в реальном времени. Инструмент идеально подходит для постоянного хранения сообщений или для регулярно проверяемых систем.

Что такое RabbitMQ?

RabbitMQ – это распределенный брокер сообщений с открытым исходным кодом, который обеспечивает эффективную доставку сообщений в рамках сложных сценариев маршрутизации. Этот инструмент называется «распределенным», потому что обычно работает как кластер узлов, где очереди распределяются (реплицируются) по узлам для обеспечения высокой доступности и отказоустойчивости.

В RabbitMQ применяется push модель: это помогает предотвратить перегрузку пользователей через ограничение предварительной выборки, настроенное консьюмером. Идеальный подход для обмена сообщениями с малой задержкой, который отлично работает с архитектурой RabbitMQ на основе очередей. Этот инструмент можно представить как почтовое отделение, которое получает, хранит и отправляет почту; только RabbitMQ принимает, хранит и передает сообщения с двоичными данными.

По умолчанию в RabbitMQ используется протокол AMQP 0.9.1, также существуют расширения для поддержки дополнительных протоколов: AMQP 1.0, HTTP, STOMP и MQTT. RabbitMQ официально поддерживает Elixir, Go, Java, JavaScript, .NET, PHP, Python, Ruby, Objective-C, Spring и Swift. Пользователям доступны различные инструменты разработки и клиенты, использующие расширения сообщества.

Для чего используется RabbitMQ?

Разработчики используют RabbitMQ для обработки высокопроизводительных и надежных фоновых заданий, а также для интеграции и взаимодействия внутри приложений и между ними. Инструмент применяется для выполнения сложной маршрутизации к консьюмерам и интеграции нескольких приложений и служб с нетривиальной логикой маршрутизации.

RabbitMQ идеально подходит для веб-серверов, которым требуется быстрый запрос-ответ. Этот инструмент распределяет нагрузку между рабочими приложениями при высокой нагрузке (более 20 000 сообщений в секунду) и может обрабатывать фоновые задания или длительные задачи, такие как преобразование PDF, сканирование файлов или масштабирование изображений.

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

Основные отличия Apache Kafka и RabbitMQ

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

Apache Kafka и RabbitMQ

RabbitMQ

Apache Kafka

Производительность

От 4000 до 10 000 сообщений в секунду

1 миллион сообщений в секунду

Хранение сообщений

На основе подтверждения

На основе политик (например, 30 дней)

Тип данных

Транзакционные данные

Операционные данные

Режим работы консьюмера

Умный брокер/тупой консьюмер

Тупой брокер/умный консьюмер

Топология

Обмен: прямой, Fan out, топик, на основе заголовков

Основана на системе Publish/Subscribe

Размер полезных данных

Без ограничений

По умолчанию – ограничение в 1 МБ

Примеры применения

Простые случаи

Массовая обработка данных/высокопроизводительная передача данных

Подробнее о разнице между Apache Kafka и RabbitMQ:

  • Поток данных. RabbitMQ использует определенный ограниченный поток данных. Продюсер создает и отправляет сообщения, а консьюмер их принимает. Apache Kafka использует неограниченный поток данных, при этом пары «ключ-значение» непрерывно передаются в назначенную тему.

  • Использование данных. RabbitMQ отлично подходит для запросов пользователей и транзакционных данных, таких как создание и размещение заказов. Кафка лучше справляется с операционными данными, такими как технологические процессы, статистика аудита и сбора данных, активность системы.

  • Обмен сообщениями. RabbitMQ отправляет пользователям сообщения, которые удаляются из очереди после их обработки и подтверждения. Кафка – это журнал. Он использует непрерывные цепочки сообщений, которые сохраняются в очереди до истечения срока хранения.

  • Модель проектирования. RabbitMQ использует модель умный брокер/тупой консьюмер. Брокер последовательно доставляет сообщения консьюмерам и отслеживает их статус. Apache Kafka использует модель тупого брокера/умного консьюмера. Этот инструмент не отслеживает сообщения, которые прочитал каждый пользователь. Кафка запоминает только непрочитанные сообщения, сохраняя их в течение установленного периода времени. Консьюмеры должны самостоятельно следить за своей позицией в каждом журнале.

  • Топология. RabbitMQ использует топологию обмена очереди: сообщения отправляются на обмен, откуда затем рассылаются в различные привязки очередей для использования консьюмерами. Кафка использует топологию Publish/Subscribe, отправляя сообщения через поток в соответствующие топики, которые затем потребляются пользователями в разных авторизованных группах.

Apache Kafka и RabbitMQ: что стоит изучить в 2022 году?

Каждый инструмент хорошо справляются с определенным пулом задач, поэтому однозначного ответа на этот вопрос нет.

Изучайте Кафку, если ваша работа предполагает любой из следующих сценариев:

  • Event sourcing или моделирование систем изменяются как последовательность событий

  • Потоковая передача и многоэтапная конвейерная обработка данных

  • Приложения, которым требуется история потоков сообщений с гарантиями доставки at least once в порядке секционирования

  • Потоки с пропускной способностью не менее 110 000 событий в секунду, сложная маршрутизация или порядок секционирования at least once.

Изучайте RabbitMQ, если в вашей компании реализован какой-либо из этих сценариев:

  • Детальное управление согласованностью/набором гарантий для каждого сообщения

  • Сложная маршрутизация к пользователям/консьюмерам

  • Приложения, которым требуются различные возможности обмена сообщениями типа Publish/Subscribe или взаимодействие типа точка-точка «запрос-ответ»

  • Приложения, которые должны поддерживать устаревшие протоколы: STOMP, MQTT, AMQP, 0-9-1.

В зависимости от количества свободного времени и сил вы можете изучить и Apache Kafka, и RabbitMQ: такая стратегия расширит стек ваших навыков, улучшит гибкость в новой рабочей среде и повысит конкурентоспособность на рынке труда. Изучив оба инструмента, вы будете готовы ко всему.

Для тех, кто хочет изучить Apache Kafka

20-22 мая пройдет онлайн-интенсив «Apache Kafka для разработчиков». Это углубленный экспресс-курс с практикой на Java или Golang и платформой Spring+Docker+Postgres. За три дня можно получить опыт разработки нескольких приложений, использующих Кафку, погрузиться в тонкости инструмента и начать сразу применять его в работе.

Комментарии (5)


  1. baldr
    18.05.2022 11:43
    +2

    Начиная с версии 3.9 в RabbitMQ есть плагин Stream, который позволяет создавать структуры, очень похожие на топики Kafka, но, фактически, являющиеся персистентными очередями RabbitMQ c возможностью произвольного чтения (с любого места). Фича очень крутая и для небольших нагрузок, скорее всего, лучше выбирать RabbitMQ.

    На RabbitMQ можно с помощью грамотно настроенного роутинга построить достаточно сложные схемы обмена сообщениями. Как пример - европейская биржа спотовой торговли электричеством EPEX использует свой сервис M7 на основе AMQP. Думаю, минимум тысяча клиентов и более 10 сообщений в секунду каждому, плюс сложный роутинг и права доступа.

    Куча плагинов - MQTT, STOMP, в том числе и через Websockets.

    Кафка для поддержки сложновата, но быстра - это да.

    RabbitMQ - "настроил и забыл". По крайней мере у меня работает 5 лет - один сервер для связи более 20 сервисов, плюс еще один для внешнего API через shovel-плагин обмениваются сообщениями. Впрочем, поток сообщений небольшой - около 12-15 сообщений в секунду в среднем.


    1. gecube
      20.05.2022 10:08
      +1

      RabbitMQ - "настроил и забыл". По крайней мере у меня работает 5 лет - один сервер для связи более 20 сервисов, плюс еще один для внешнего API через shovel-плагин обмениваются сообщениями. Впрочем, поток сообщений небольшой - около 12-15 сообщений в секунду в среднем.

      это не так

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


  1. Sin2x
    18.05.2022 11:59
    +1

    1. enigmaz
      19.05.2022 09:45

      Сижу во всяких группах по рэбиту и в РФ до сих пор говорят только о зеркальных очередях(((


      1. Sin2x
        19.05.2022 13:31

        Они там пишут в блоге, что в 4.0 зеркальные очереди выпилят, так что так или иначе придётся переходить на кворумные.