В сложной логической системе, системе с объемными вычислительными задачами и потоками событий необходимо организовать распределенную архитектуру и наладить коммуникацию между ее компонентами.
Для такой архитектуры чаще всего используют одно из двух решений: RabbitMQ или Apache Kafka. Разберемся, чем отличаются эти брокеры сообщений и в каких случаях какой использовать.
Что такое RabbitMQ
RabbitMQ — это распределенный и горизонтально масштабируемый брокер сообщений. Он позволяет разным программам взаимодействовать с помощью протокола AMQP, а через дополнительные модули — и с помощью некоторых других протоколов: MQTT, HTTP и так далее.
Устройство брокера упрощенно можно описать так:
- есть продюсер, или поставщик сообщений, отправляющий события;
- очередь сообщений — своего рода «почтовый ящик», где хранятся сообщения;
- подписчики, то есть программы — получатели сообщений.
В очереди может храниться любое количество сообщений от неограниченного количества поставщиков, а получать их может неограниченное число подписчиков.
RabbitMQ принимает сообщения от поставщиков и отправляет им подтверждение о приеме, а затем перенаправляет их подписчикам. Получатели подтверждают, что сообщение доставлено, либо сигнализируют о неудаче. Во втором случае сообщение остается в очереди, пока не будет доставлено. А после доставки оно удалится из системы.
Основная фишка RabbitMQ — это гибкая маршрутизация сообщений между различными поставщиками и потребителями событий. Решение не ограничивается созданием простой очереди данных между двумя сторонами. В сервере реализована концепция принимающих события узлов (эксчейнджей) — они маршрутизируют данные в разные очереди сообщений RabbitMQ.
Например, одно и то же сообщение должны получить три подписчика. Оно попадет на узел, который отправит три одинаковых сообщения в три очереди для всех подписчиков, которым оно должно быть доставлено.
Особенности RabbitMQ:
- Механизм маршрутизации дополняют ключи маршрутизации (Routing Keys). Они позволяют создавать гибкие правила пересылки сообщений между источниками и потребителями. Благодаря этому RabbitMQ подходит для широкого спектра задач по реализации нетривиальных бизнес-процессов в коде.
- Обширные инструменты маршрутизации позволяют разработчикам и администраторам настраивать сложные системы с тысячами источников и приемников сообщений. Решение подходит для систем бронирования билетов, логистических программ и микросервисных приложений .
- RabbitMQ реализует концепцию push-доставки: поставщик может направить новые события в сеть, но получатель не может их запросить у поставщика. При этом система не гарантирует порядок доставки сообщений.
Apache Kafka — другой подход к очередям сообщений
Apache Kafka — это тоже распределенный брокер сообщений, но работает он по другому принципу. Он реализует архитектурную концепцию распределенного лога, в который заносят информацию разные поставщики данных. Затем информацию из этого лога читают другие программы и микросервисы.
Сообщения сохраняются в брокере, подписчики подписываются на них, при этом гарантируется, что сообщения находятся в той же последовательности, в которой поступили.
Kafka не отслеживает, получил ли подписчик сообщение, он просто хранит его в течение установленного времени. Подписчики сами отправляют запросы к брокеру о новых сообщениях и указывают, что им нужно прочитать. Сообщения после прочтения не удаляются, поэтому есть возможность повторного их получения.
Особенности Apache Kafka:
- Apache Kafka славится способностью поглощать и пересылать титанические объемы данных. В нем есть все, что нужно для работы с высокими нагрузками: репликация, горизонтальное масштабирование, параллельная обработка потоков сообщений сразу на нескольких серверах.
- Параллелизм и распределенная архитектура хорошо сказываются на надежности: даже выход из строя части кластера не нарушит доставку сообщений.
- В пересылке данных принимают участие поставщики и потребители данных. Поставщики пишут сообщения в Apache Kafka, потребители их читают. Для организации систем со сложной топологией применяют темы — своего рода разделы для категоризации различных сообщений по назначению.
- Для маршрутизации сообщений могут применяться Routing Keys, похожие на те, что используются в RabbitMQ. Но, в отличие от RabbitMQ, Apache Kafka гарантирует порядок доставки сообщений.
RabbitMQ vs Apache Kafka: что выбрать?
RabbitMQ
- Вам важна гибкость в маршрутизации сообщений внутри системы. Инструментарий для построения путей доставки данных в RabbitMQ способен решить даже самые хитрые сценарии в организации потоков событий.
- Вам важен сам факт доставки сообщений, но порядок доставки не принципиален. Настройки RabbitMQ его не гарантируют: если вы сначала отправили сообщение №1, а затем сообщение №2, то подписчику они могут прийти в обратном порядке.
Apache Kafka
- Apache Kafka однозначно подходит, если вы работаете с big data . Репликация и параллельная обработка теоретически могут масштабировать вашу систему до бесконечности. Плюс Kafka выигрывает по производительности: может достичь пропускной способности в миллионы сообщений в секунду даже при ограниченных ресурсах.
- Решение позволяет программистам извлекать из очереди сообщения (Message Queuing) за любой момент времени.
- В некоторых системах порядок совершения событий имеет критическое значение — например, груз не может быть доставлен до того, как был отправлен. В таких системах необходимо использовать Apache Kafka: он гарантирует порядок доставки сообщений.
Выбирайте RabbitMQ , если вам нужна надежность и гибкость маршрутизации, а порядок доставки сообщений безразличен.
Apache Kafka подойдет, если работаете с большими нагрузками, вам важна масштабируемость, доставка сообщений в правильном порядке и возможность просматривать историю сообщений.
Источник: https://mcs.mail.ru/blog/rabbitmq-ili-apache-kafka
Читайте также статьи по теме:
Apache Kafka: что это и как работает
Как спокойно спать, когда у вас облачный сервис: основные архитектурные советы
Как реализуется отказоустойчивая веб-архитектура в платформе Mail.ru Cloud Solutions