Мы решили внести свой скромный вклад в развитие комьюнити и перевели оригинальную статью. Статья опубликована на сайте 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. За три дня можно получить опыт разработки нескольких приложений, использующих Кафку, погрузиться в тонкости инструмента и начать сразу применять его в работе.
baldr
Начиная с версии 3.9 в RabbitMQ есть плагин Stream, который позволяет создавать структуры, очень похожие на топики Kafka, но, фактически, являющиеся персистентными очередями RabbitMQ c возможностью произвольного чтения (с любого места). Фича очень крутая и для небольших нагрузок, скорее всего, лучше выбирать RabbitMQ.
На RabbitMQ можно с помощью грамотно настроенного роутинга построить достаточно сложные схемы обмена сообщениями. Как пример - европейская биржа спотовой торговли электричеством EPEX использует свой сервис M7 на основе AMQP. Думаю, минимум тысяча клиентов и более 10 сообщений в секунду каждому, плюс сложный роутинг и права доступа.
Куча плагинов - MQTT, STOMP, в том числе и через Websockets.
Кафка для поддержки сложновата, но быстра - это да.
RabbitMQ - "настроил и забыл". По крайней мере у меня работает 5 лет - один сервер для связи более 20 сервисов, плюс еще один для внешнего API через shovel-плагин обмениваются сообщениями. Впрочем, поток сообщений небольшой - около 12-15 сообщений в секунду в среднем.
gecube
это не так
Мы отхватили с ребитом будь здоров. Эти ребята вообще класть хотели на обратную совместимость. С плагином федерации. Касательно настроил и забыл - это тоже так не работает, потому что нужно патчить на уязвимости. Ладно там фичи. Но все равно придется обновляться из-за уязвимостей...