В чем разница между Kafka и RabbitMQ?

Kafka и RabbitMQ — это системы очередей сообщений, которые можно использовать при потоковой обработке. Поток данных — это непрерывные инкрементные данные большого объема, требующие высокоскоростной обработки. Например, это могут быть данные датчиков об окружающей среде, которые необходимо постоянно собирать и обрабатывать для наблюдения за изменениями температуры или давления воздуха в реальном времени. RabbitMQ — это брокер распределенных сообщений, который собирает потоковые данные из нескольких источников и маршрутизирует их в разные пункты назначения для обработки. Apache Kafka — это платформа потоковой трансляции для создания конвейеров данных и приложений потоковой трансляции в реальном времени. Kafka предоставляет высокомасштабируемую, отказоустойчивую и надежную систему обмена сообщениями с большими возможностями, чем RabbitMQ.

Подробнее о потоковых данных»

Подробнее об Apache Kafka »

Архитектурные различия Kafka и RabbitMQ

RabbitMQ и Apache Kafka позволяют производителям отправлять сообщения потребителям. Производители — это приложения, публикующие информацию, а потребители — приложения, которые подписываются на информацию и обрабатывают ее.

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

RabbitMQ можно рассматривать как почтовое отделение, которое принимает почту и доставляет ее предполагаемым получателям. Между тем Kafka похож на библиотеку, где на полках раскладываются сообщения разных жанров, публикуемые производителями. Затем потребители читают сообщения с соответствующих полок и запоминают прочитанное. 

Архитектурный подход RabbitMQ

Брокер RabbitMQ обеспечивает низкую задержку и сложное распределение сообщений с помощью следующих компонентов:

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

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

Архитектурный подход Kafka

Кластер Kafka обеспечивает обработку потоковых событий с более сложной архитектурой с высокой пропускной способностью. Вот несколько ключевых компонентов Kafka:

  • Брокер Kafka — это сервер Kafka, который позволяет производителям передавать потоки данных потребителям. Брокер Kafka содержит темы и соответствующие разделы. 
  • Тема — носитель данных, в котором сгруппированы похожие данные в брокере Kafka. 
  • Раздел — это небольшой носитель данных в теме, на которую подписаны потребители. 
  • ZooKeeper — это специальное программное обеспечение, которое управляет кластерами и разделами Kafka для обеспечения отказоустойчивой потоковой передачи. ZooKeeper недавно было заменено протоколом Apache Kafka Raft (KRaft).

Производители в Kafka назначают каждому сообщению ключ сообщения. Затем брокер Kafka сохраняет сообщение в ведущем разделе этой конкретной темы. Протокол KRaft использует алгоритмы консенсуса для определения ведущего раздела. 

Как Kafka и RabbitMQ по-разному обрабатывают сообщения?

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

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

Потребление сообщений

В RabbitMQ брокер гарантирует получение сообщения потребителями. Потребительское приложение играет пассивную роль и ждет, пока брокер RabbitMQ отправит сообщение в очередь. Например, банковское приложение может ждать SMS-предупреждение от программного обеспечения для централизованной обработки транзакций.

Однако потребители Kafka более активно читают и отслеживают информацию. По мере добавления сообщений в физические файлы журналов пользователи Kafka отслеживают последнее прочитанное сообщение и соответствующим образом обновляют свой трекер смещений. Трекер смещений — это счетчик, показатель которого увеличивается после прочтения сообщения. В случае с Kafka производитель не знает о получении сообщений потребителями. 

Приоритет сообщения

Брокеры RabbitMQ позволяют программному обеспечению производителя увеличивать количество определенных сообщений, используя очередь приоритетов. Вместо отправки сообщений в порядке «первым пришел — первым ушел» брокер обрабатывает сообщения с более высоким приоритетом, чем обычные сообщения. Например, приложение для розничной торговли может ставить транзакции в очередь каждый час. Однако если системный администратор отправляет приоритетное сообщение резервного копирования базы данных, то брокер немедленно отправляет его.

В отличие от RabbitMQ, Apache Kafka не поддерживает приоритетные очереди. При распределении по соответствующим разделам все сообщения рассматриваются как равные. 

Порядок сообщений

RabbitMQ отправляет сообщения и ставит их в очередь в определенном порядке. Если сообщение с более высоким приоритетом не поставлено в очередь в систему, потребители получают сообщения в том порядке, в котором они были отправлены.

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

Удаление сообщения

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

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

Другие ключевые отличия Kafka от RabbitMQ

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

Далее мы расскажем о других различиях между обоими брокерами сообщений. 

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

И RabbitMQ, и Kafka предлагают высокопроизводительную передачу сообщений для предполагаемых примеров использования. Однако Kafka превосходит RabbitMQ по пропускной способности сообщений.

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

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

Безопасность 

RabbitMQ и Kafka позволяют приложениям безопасно обмениваться сообщениями, но с использованием разных технологий.

RabbitMQ поставляется с инструментами администрирования для управления разрешениями пользователей и безопасностью брокеров.

Между тем архитектура Apache Kafka обеспечивает безопасные потоки событий с помощью TLS и службы аутентификации и авторизации Java (JAAS). TLS — это технология шифрования, предотвращающая непреднамеренное прослушивание сообщений, а JAAS контролирует, какое приложение имеет доступ к брокерской системе. 

Язык программирования и протоколы 

И Kafka, и RabbitMQ поддерживают различные языки, платформы и протоколы, знакомые разработчикам.

Вы можете писать код на Java и Ruby при создании клиентских приложений для Kafka и RabbitMQ. Кроме того, Kafka поддерживает Python и Node.js, а RabbitMQ поддерживает JavaScript, Go, C, Swift, Spring, Elixir, PHP и .NET.

Kafka использует протокол передачи двоичных данных через TCP для потоковой передачи сообщений по конвейерам данных в реальном времени, а RabbitMQ по умолчанию поддерживает протокол расширенной очереди сообщений (AMQP). RabbitMQ также поддерживает устаревшие протоколы, такие как простой потоковый текст-ориентированный протокол обмена сообщениями (STOMP) и MQTT, для маршрутизации сообщений.

Подробнее об MQTT »

В чем сходство между Kafka и RabbitMQ?

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

Далее мы обсудим некоторые ключевые сходства между RabbitMQ и Kafka.

Масштабируемость

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

Кроме того, архитектура Kafka позволяет добавлять больше разделов к определенной теме для равномерного распределения нагрузки сообщений. 

Отказоустойчивость

И Kafka, и RabbitMQ представляют собой надежные архитектуры очередей сообщений, устойчивые к сбоям системы.

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

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

Простота использования  

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

Например, вы можете использовать Kafka Streams (клиентскую библиотеку) для создания систем обмена сообщениями на Kafka, а Spring Cloud Data Flow — для создания управляемых событиями микросервисов с помощью RabbitMQ.

Когда использовать Kafka, а когда RabbitMQ

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

Далее мы обсудим некоторые примеры использования RabbitMQ и Kafka, достойные рассмотрения.

Воспроизведение потоков событий

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

Агрегировать журналы с помощью RabbitMQ сложнее, поскольку сообщения удаляются сразу после использования. Обходной путь — воспроизвести сохраненные сообщения от производителей.

Обработка данных в реальном времени

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

Сложная архитектура маршрутизации

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

Эффективная доставка сообщений

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

Поддержка языков и протоколов

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

Использует ли Kafka RabbitMQ?

Kafka не использует RabbitMQ. Это независимый брокер сообщений, который распространяет потоки событий в реальном времени без использования RabbitMQ. Оба брокера являются отдельными системами обмена данными, которые работают независимо друг от друга.

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

Краткое описание различий: Kafka и RabbitMQ

 

RabbitMQ

Kafka

Архитектура

Архитектура RabbitMQ разработана для сложной маршрутизации сообщений. В ней используется модель push. Производители отправляют сообщения потребителям с другими правилами. 

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

Обработка сообщений

Брокеры RabbitMQ отслеживают потребление сообщений. Сообщения удаляются после их потребления. RabbitMQ поддерживает приоритеты сообщений. 

Потребители отслеживают получение сообщений с помощью трекера смещений. Kafka сохраняет сообщения в соответствии с политикой хранения. Здесь нет приоритета сообщений. 

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

RabbitMQ имеет низкую задержку. Он отправляет тысячи сообщений в секунду.

Kafka передает в режиме реального времени до миллионов сообщений в секунду.

Язык программирования и протокол

RabbitMQ поддерживает широкий спектр языков и устаревших протоколов.

Выбор языков программирования Kafka ограничен. Он использует протокол передачи двоичных данных через TCP для передачи данных. 

Как AWS может поддерживать выполнение требований RabbitMQ и Kafka?

Amazon Web Services (AWS) предоставляет полностью управляемые сервисы брокера сообщений с низкой задержкой для реализаций RabbitMQ и Kafka.

  • Используйте Amazon MQ для предоставления услуг брокерам RabbitMQ без трудоемких настроек. Amazon MQ шифрует сообщения RabbitMQ при передаче и хранении. Мы также обеспечиваем конвейеры данных высокой доступности в зонах доступности AWS. 

Создайте аккаунт уже сегодня и начните работу с брокерами сообщений на AWS.

AWS: дальнейшие шаги