Найти в Дзене

История возникновения Kafka и RabbitMQ

Давайте рассмотрим 2 наверно самые популярные системы обмена сообщениями, как они возникли и какие для этого были предпосылки. Кажется это интересно. Подписывайтесь на мой канал в Телеграмм, чтобы ничего не пропустить. RabbitMQ — это система обмена сообщениями, разработанная для организации взаимодействия между приложениями и сервисами через асинхронные очереди сообщений. Её создание было мотивировано необходимостью разработки надежного и масштабируемого решения для передачи сообщений между различными системами с минимальными задержками и высокой отказоустойчивостью. В начале 2000-х годов, когда интернет-услуги и веб-приложения начали активно развиваться, разработчики столкнулись с рядом проблем, связанных с необходимостью обмена данными между системами. В то время основными инструментами для взаимодействия между приложениями были синхронные вызовы, такие как Remote Procedure Calls (RPC) или передачей данных через базы данных. Однако такие подходы имели ряд недостатков: высокая задерж
Оглавление

Давайте рассмотрим 2 наверно самые популярные системы обмена сообщениями, как они возникли и какие для этого были предпосылки. Кажется это интересно.

Подписывайтесь на мой канал в Телеграмм, чтобы ничего не пропустить.

RabbitMQ

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

Истоки и мотивация

В начале 2000-х годов, когда интернет-услуги и веб-приложения начали активно развиваться, разработчики столкнулись с рядом проблем, связанных с необходимостью обмена данными между системами. В то время основными инструментами для взаимодействия между приложениями были синхронные вызовы, такие как Remote Procedure Calls (RPC) или передачей данных через базы данных. Однако такие подходы имели ряд недостатков: высокая задержка, сложность масштабирования и высокая зависимость от времени работы каждого компонента системы.

Для решения этих проблем стала популярной концепция асинхронных систем обмена сообщениями (Message-Oriented Middleware, MOM), которые обеспечивали передачу данных между компонентами через посредников — брокеры сообщений. Один из популярных стандартов, который лег в основу таких систем, был Advanced Message Queuing Protocol (AMQP).

Создание RabbitMQ

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

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

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

2. Масштабируемость — система рассчитана на поддержку больших объемов данных и может быть развернута как на одном сервере, так и в распределенной среде.

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

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

Развитие и популярность

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

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

В 2010 году компания VMware приобрела Rabbit Technologies, что дало проекту новый импульс для развития. В дальнейшем проект был передан под управление Pivotal Software, а после её реорганизации вошел в состав VMware Tanzu — облачной платформы для разработки и управления приложениями.

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

Kafka

История возникновения Kafka тесно связана с развитием технологий обработки данных и потребностями современных компаний в масштабируемых и надежных системах для обмена сообщениями и потоковой обработки данных. Apache Kafka была создана в 2011 году в компании LinkedIn как решение для внутренней проблемы обработки большого объема данных в реальном времени.

Предпосылки создания Kafka

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

Ранее LinkedIn использовала различные системы для передачи и обработки потоков данных, включая системы типа очередей сообщений (Message Queues) и обработку данных в пакетном режиме (Batch Processing). Однако эти решения не удовлетворяли требованиям по производительности, масштабируемости и надежности. В частности, такие системы плохо справлялись с большими объемами данных в реальном времени и не могли обеспечить низкую задержку при обработке событий.

Разработка Kafka

Для решения этих проблем команда инженеров LinkedIn, включая Джея Крепса (Jay Kreps), Неху Наркарни (Neha Narkhede) и Джуна Рао (Jun Rao), начала разработку новой системы обмена сообщениями, которая смогла бы эффективно обрабатывать большие потоки данных в реальном времени. Они назвали эту систему "Kafka" в честь австрийского писателя Франца Кафки, хотя сам выбор имени был скорее случайным и по признанию авторов, не несет глубокого символического значения.

Основные принципы, которые легли в основу разработки Kafka:

1. Масштабируемость: Kafka должна была быть распределенной системой, которая легко масштабируется на множество серверов и может обрабатывать огромные объемы данных.

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

3. Надежность: Kafka должна быть устойчивой к сбоям и обеспечивать гарантированную доставку сообщений.

4. Хранение сообщений: В отличие от многих традиционных систем очередей сообщений, Kafka должна была обеспечивать возможность долговременного хранения сообщений.

5. Гибкость: Система должна была быть способна работать с разными типами потребителей данных, поддерживая как потоковую, так и пакетную обработку данных.

Запуск и открытие исходного кода

В 2011 году первая версия Kafka была внедрена внутри LinkedIn для обработки логов и событий системы. Kafka быстро завоевала популярность благодаря своей производительности и надежности. Вскоре LinkedIn решила открыть исходный код Kafka, и в 2011 году она была представлена как проект с открытым исходным кодом в рамках Apache Software Foundation.

Благодаря своей открытости и уникальным характеристикам, Kafka быстро привлекла внимание других компаний и разработчиков, которые искали эффективные решения для работы с потоковыми данными. Проект стал развиваться в сообществе, и в 2012 году Kafka получила статус полноценного проекта Apache (Top-Level Project), что означало признание зрелости и важности этого инструмента.

Развитие и популяризация

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

В 2014 году Джей Крепс, Неха Наркарни и Джун Рао покинули LinkedIn и основали компанию Confluent, которая начала предлагать коммерческую поддержку и дополнительные решения на базе Kafka. Confluent продолжает активно развивать экосистему вокруг Kafka, предлагая такие продукты, как Confluent Platform и Confluent Cloud.

Влияние и применение

Сегодня Kafka является одной из самых популярных и используемых систем потоковой передачи данных и обработки событий. Её используют крупные компании, такие как Netflix, Uber, Twitter, Spotify, а также множество других организаций в самых разных отраслях: от финансов и ритейла до телекоммуникаций и здравоохранения.

Kafka играет важную роль в архитектурах микросервисов, больших данных (Big Data) и системах обработки данных в реальном времени. Она стала неотъемлемой частью экосистемы современных распределённых систем и продолжает развиваться и совершенствоваться с каждым годом.

Сравнение Kafka и RabbitMQ

1. Архитектура

  • Kafka:

Основана на концепции логов (commit logs), где данные записываются в последовательные журналы и могут быть прочитаны многократно.
Сообщения хранятся на диске в течение определённого времени или до достижения заданного размера хранилища. Это позволяет повторно читать сообщения по потребности, что делает Kafka подходящей для аналитики данных и потоковой обработки.
Kafka использует концепцию
партиций для масштабирования: топик может быть разделён на несколько партиций, что позволяет обрабатывать данные параллельно.

  • RabbitMQ:

RabbitMQ — это система очередей сообщений (message queue), которая ориентирована на доставку сообщений от отправителя к получателю в режиме реального времени.
Сообщения обычно удаляются из очереди после потребления, хотя можно настроить персистентность сообщений.
RabbitMQ поддерживает
очереди с различными режимами маршрутизации (direct, fanout, topic, headers), что делает его гибким для различных сценариев маршрутизации сообщений.

2. Модель доставки сообщений

  • Kafka:

Основная модель доставки — это pub/sub (publish-subscribe). Продюсеры публикуют сообщения в топики, а консумеры могут подписываться на эти топики.
Поддерживает модель
"At least once" (минимум один раз) с возможностью конфигурации на "Exactly once" (ровно один раз), что делает Kafka надёжной для задач, где важно избежать потери данных или их дублирования.

  • RabbitMQ:

Поддерживает как pub/sub, так и точка-точка (point-to-point) модели обмена сообщениями.
Основной механизм доставки — это
"At least once" (минимум один раз). Однако гарантии "Exactly once" сложнее обеспечить, чем в Kafka.
RabbitMQ больше ориентирован на
реальную доставку сообщений и их обработку на стороне потребителя.

3. Производительность и масштабируемость

  • Kafka:

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

  • RabbitMQ:

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

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

  • Kafka:

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

  • RabbitMQ:

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

5. Использование и сценарии применения

  • Kafka:

Идеальна для приложений с высокой нагрузкой, где требуется обработка событий в реальном времени или потоковая аналитика.
Применяется для построения
событийно-ориентированных архитектур (event-driven architecture), систем потоковой обработки данных (stream processing) и хранилищ журналов событий (event sourcing).

  • RabbitMQ:

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

6. Требования к инфраструктуре

  • Kafka:

Kafka требует более сложной инфраструктуры, включая ZooKeeper (или KRaft в новых версиях Kafka для управления метаданными без ZooKeeper).
Kafka лучше всего работает в кластерной среде, где необходимо распределение нагрузки и отказоустойчивость.

  • RabbitMQ:

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

7. Экосистема и интеграции

  • Kafka:

Kafka имеет мощную экосистему, включая Kafka Streams (для потоковой обработки данных), Kafka Connect (для интеграции с внешними системами) и ksqlDB (для обработки потоков на уровне SQL).
Kafka легко интегрируется с другими системами Big Data, такими как Hadoop, Spark и Flink.

  • RabbitMQ:

RabbitMQ поддерживает множество плагинов для интеграции с различными системами и протоколами, такими как AMQP, MQTT, STOMP.
RabbitMQ имеет встроенные инструменты для мониторинга и управления через веб-интерфейс, что упрощает её использование.

8. Сообщества и поддержка

  • Kafka:

Развивается Apache Software Foundation и имеет огромное сообщество пользователей. Kafka активно используется в крупных компаниях и имеет множество open-source инструментов и библиотек.

  • RabbitMQ:

RabbitMQ на базе Erlang с открытым исходным кодом и поддерживается компанией Pivotal (VMware). Сообщество также довольно велико, и RabbitMQ широко используется в коммерческих и open-source проектах.

9. Сложность обучения и эксплуатации

  • Kafka:

Более сложна в настройке и эксплуатации, требует понимания концепций партиционирования, консистентности данных и работы с ZooKeeper (или KRaft). Однако её мощь компенсирует эту сложность.

  • RabbitMQ:

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

Вывод:

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

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

Если Вам интересно, что еще можно найти на канале QA Helper, прочитайте статью: Вместо оглавления. Что вы найдете на канале QA Helper - справочник тестировщика?

Не забудьте подписаться на канал, чтобы не пропустить полезную информацию: QA Helper - справочник тестировщика

Пишите в комментариях какой пункт было бы интересно рассмотреть более подробно.

Обязательно прочитайте: Что должен знать и уметь тестировщик

Также будет интересно почитать: Вопросы которые задают на собеседовании тестировщикам

-2