Мы решили внести свой скромный вклад в развитие комьюнити и перевели оригинальную статью. Статья опубликована на сайте 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. За три дня можно получить опыт разработки нескольких приложений, использующих Кафку, погрузиться в тонкости инструмента и начать сразу применять его в работе.