Apache Kafka та RabbitMQ є двома поширеними брокерами обміну повідомленнями, які забезпечують відокремлення процесів обміну даними між різними додатками. Розглянемо їхні ключові характеристики та відмінності.
RabbitMQ
RabbitMQ – це брокер з відкритим кодом, призначений для обміну повідомленнями між різними сторонами. Розроблений на Erlang, він відрізняється легкістю та ефективністю. Мова Erlang створена Ericson спеціально для розподілених систем.
Він вважається класичним брокером повідомлень, що базується на патерні “видавець-підписник”. Він підтримує як синхронний, так і асинхронний обмін повідомленнями, в залежності від налаштувань. Також гарантує доставку та впорядкування повідомлень між джерелами та споживачами.
Підтримує протоколи AMQP, STOMP, MQTT, HTTP та WebSocket. Існують три моделі обміну: тематична, розсилання та пряма:
- Обмін повідомленнями за темою, індивідуальний [topic]
- Розсилання повідомлення всім споживачам черги [fanout]
- Пряма доставка повідомлення кожному споживачу [direct]
Компоненти RabbitMQ:
Виробники
Виробники – це додатки, які створюють і надсилають повідомлення в RabbitMQ. Це може бути будь-яка програма, здатна підключитися до RabbitMQ.
Споживачі
Споживачі – це додатки, які отримують та обробляють повідомлення з RabbitMQ. Це також може бути будь-яка програма, що підключається до RabbitMQ.
Обмінники
Обмінники (Exchanges) відповідають за отримання повідомлень від виробників та їхню маршрутизацію до потрібних черг. Існують різні типи обмінників, включаючи прямі, розсильні, тематичні та заголовкові, кожен з яких має свої правила маршрутизації.
Черги
Черги (Queues) – це місця, де зберігаються повідомлення, доки їх не оброблять споживачі. Черги створюються автоматично або через додатки, при публікації повідомлення на біржу.
Зв’язки
Зв’язки (Bindings) визначають взаємозв’язок між обмінниками та чергами. Вони визначають правила маршрутизації, які обмінники використовують для доставки повідомлень до потрібних черг.
Архітектура RabbitMQ
RabbitMQ використовує модель вилучення (pull), де споживачі активно запитують повідомлення від брокера. Повідомлення публікуються на обмінники, які розподіляють їх по чергах на основі ключів маршрутизації.
Архітектура RabbitMQ базується на клієнт-серверній моделі і складається з компонентів, що працюють разом для забезпечення надійної та масштабованої платформи обміну. Концепція AMQP включає обмінники, черги, зв’язки, а також видавців і підписників. Видавці публікують повідомлення на обмінники.
Обмінники приймають ці повідомлення і розподіляють їх по чергах (від 0 до n) на основі правил (зв’язків). Повідомлення, що зберігаються в чергах, потім обробляються споживачами. Спрощена схема управління повідомленнями в RabbitMQ:
Джерело зображення: VMware
- Видавці відправляють повідомлення на обмінник.
- Обмінник передає повідомлення до черг або інших обмінників.
- Після отримання повідомлення, RabbitMQ відправляє підтвердження відправнику.
- Споживачі встановлюють постійне TCP-з’єднання з RabbitMQ і оголошують чергу, з якої вони будуть отримувати повідомлення.
- RabbitMQ направляє повідомлення споживачам.
- Споживачі відправляють підтвердження про успішне або невдале отримання повідомлення.
- Після успішного отримання повідомлення видаляється з черги.
Apache Kafka
Apache Kafka – це розподілене рішення з відкритим кодом для обміну повідомленнями, розроблене LinkedIn на Scala. Він може обробляти повідомлення та зберігати їх за моделлю видавець-підписник з високою масштабованістю та продуктивністю.
Для зберігання отриманих подій або повідомлень, теми розподіляються між вузлами за допомогою розділів. Він поєднує шаблони видавець-підписник і черги повідомлень, а також гарантує порядок повідомлень для кожного споживача.
Kafka спеціалізується на обробці потоків даних у реальному часі з високою пропускною здатністю та низькою затримкою. Це досягається завдяки мінімізації логіки на сервері (брокері) і специфічним деталям реалізації.
Наприклад, Kafka не використовує оперативну пам’ять і відразу записує дані у файлову систему сервера. Завдяки послідовному запису даних досягається продуктивність читання та запису, що наближається до швидкості оперативної пам’яті.
Основні концепції Kafka для забезпечення масштабованості, продуктивності та стійкості до відмов:
Тема
Тема (topic) – це спосіб позначення або категоризації повідомлення. Уявіть шафу з 10 ящиками, де кожен ящик є темою, а шафа – це Apache Kafka. Теми допомагають класифікувати групові повідомлення. В реляційних базах даних аналогією може бути таблиця.
Продюсер
Продюсер – це той, хто підключається до платформи обміну повідомленнями та надсилає одне або кілька повідомлень на певну тему.
Споживач
Споживач – це особа, яка підключається до платформи обміну повідомленнями та отримує повідомлення з певної теми.
Брокер
Брокер в Kafka – це сама платформа Kafka, яка керує темами та способом зберігання повідомлень, журналів тощо.
Кластер
Кластер – це група брокерів, що взаємодіють для кращої масштабованості та відмовостійкості.
Файл журналу
Кожна тема зберігає свої записи у структурованому форматі журналу. Файл журналу містить інформацію про тему.
Розділи
Розділи (partitions) – це рівень поділу повідомлень у темі. Таке розділення забезпечує еластичність, відмовостійкість та масштабованість Kafka. Кожна тема може мати кілька розділів на різних серверах.
Архітектура Apache Kafka
Kafka використовує модель push для доставки повідомлень. Повідомлення активно надсилаються споживачам. Повідомлення публікуються в темах, які поділені та розподілені між брокерами кластера.
Споживачі підписуються на теми та отримують повідомлення, щойно вони з’являються в цих темах.
Кожна тема в Kafka поділена на розділи, де зберігаються події.
Якщо в кластері є кілька брокерів, розділи розподіляються між ними (наскільки це можливо), що дозволяє масштабувати навантаження читання та запису. Для синхронізації кластер використовує ZooKeeper.
Kafka отримує, зберігає та розповсюджує записи. Запис – це дані, створені вузлом системи (подія або інформація). Він відправляється в кластер і зберігається у розділі теми.
Кожен запис має зсув (offset) послідовності, і споживач контролює зсув, який він споживає. Це дозволяє повторно обробляти повідомлення.
Джерело зображення: Вікіпедія
Логіка управління ідентифікатором останнього прочитаного повідомлення або вибір розділу для запису даних, повністю передається клієнту (виробнику чи споживачу).
Окрім виробників і споживачів, є поняття теми, розділу та тиражування.
Тема описує категорію повідомлень. Kafka забезпечує відмовостійкість за допомогою реплікації даних у темі та масштабованість шляхом розподілу теми на кілька серверів.
RabbitMQ проти Kafka
Основні відмінності між Apache Kafka і RabbitMQ полягають у різних моделях доставки повідомлень.
Apache Kafka працює за моделлю витягування (pull), де споживачі самі отримують повідомлення з теми.
RabbitMQ використовує модель push, надсилаючи повідомлення одержувачам. Відмінності Kafka від RabbitMQ:
#1. Архітектура
RabbitMQ використовує традиційну чергу повідомлень на основі брокера, а Kafka – архітектуру розподіленої потокової платформи.
RabbitMQ використовує модель доставки на основі витягування, тоді як Kafka – на основі push.
#2. Збереження повідомлень
RabbitMQ розміщує повідомлення в черзі FIFO і відстежує їхній стан, а Kafka додає повідомлення до журналу (записує на диск), де одержувач відповідає за отримання потрібної інформації з теми.
RabbitMQ видаляє повідомлення після доставки, а Kafka зберігає повідомлення до запланованого очищення журналу.
Kafka зберігає поточний та історичні стани системи і може слугувати надійним джерелом історичних даних, на відміну від RabbitMQ.
#3. Балансування навантаження
Модель доставки повідомлень RabbitMQ зменшує затримку. Однак одержувачі можуть переповнюватися, якщо повідомлення надходять швидше, ніж їх обробляють.
Через те, що кожен одержувач запитує/завантажує різну кількість повідомлень, розподіл роботи може стати нерівномірним, що призведе до затримок і втрати порядку повідомлень.
Щоб запобігти цьому, кожен приймач RabbitMQ має обмеження на кількість накопичених непідтверджених повідомлень. У Kafka балансування навантаження виконується автоматично шляхом перерозподілу одержувачів між розділами теми.
#4. Маршрутизація
RabbitMQ містить чотири способи маршрутизації для постановки в чергу, що забезпечує гнучкість. Kafka реалізує лише один спосіб запису повідомлень на диск без маршрутизації.
#5. Упорядкування повідомлень
RabbitMQ дозволяє підтримувати відносний порядок у групах подій, а Apache Kafka забезпечує простий спосіб підтримувати порядок із масштабованістю, записуючи повідомлення послідовно до журналу (теми).
Характеристика | RabbitMQ | Kafka |
Архітектура | Зберігає повідомлення на диску, підключеному до брокера. | Розподілена архітектура потокової платформи. |
Модель доставки | На основі Pull. | На основі Push. |
Збереження повідомлень | Не зберігає повідомлення. | Зберігає замовлення, записуючи в тему. |
Балансування навантаження | Налаштовує ліміт попередньої вибірки. | Виконується автоматично. |
Маршрутизація | Включає 4 способи маршрутизації. | Має лише 1 спосіб маршрутизації. |
Зовнішні процеси | Не потребує. | Потребує запуску екземпляра Zookeeper. |
Плагіни | Кілька плагінів. | Обмежена підтримка плагінів. |
RabbitMQ і Kafka є широко використовуваними системами обміну повідомленнями, кожна зі своїми перевагами та варіантами використання. RabbitMQ – це гнучка, надійна та масштабована система, яка ідеально підходить для управління чергами повідомлень, що робить її хорошим вибором для програм, які потребують надійної та гнучкої доставки повідомлень.
Kafka – це розподілена потокова платформа для обробки великих обсягів даних у режимі реального часу, що робить її чудовим варіантом для програм, які потребують обробки та аналізу даних у реальному часі.
Основні варіанти використання RabbitMQ:
Електронна комерція
RabbitMQ використовується для керування потоком даних між різними системами електронної комерції, як-от управління запасами, обробка замовлень та платежів. Він обробляє великі обсяги повідомлень та гарантує надійну доставку у правильному порядку.
Охорона здоров’я
У сфері охорони здоров’я RabbitMQ використовується для обміну даними між різними системами, такими як електронні медичні записи (EHR), медичні пристрої та системи підтримки прийняття клінічних рішень. Це допомагає покращити догляд за пацієнтами та зменшити кількість помилок.
Фінансові послуги
RabbitMQ забезпечує обмін повідомленнями в реальному часі між торговими платформами, системами управління ризиками та платіжними шлюзами. Це сприяє швидкій та безпечній обробці транзакцій.
Системи IoT
RabbitMQ використовується в системах IoT для керування потоком даних між різними пристроями та датчиками. Це забезпечує безпечну та ефективну доставку даних навіть в умовах обмеженої пропускної здатності та нестабільного з’єднання.
Kafka – це розподілена потокова платформа, призначена для обробки великих обсягів даних у реальному часі.
Основні випадки використання Kafka
Аналітика в реальному часі
Kafka використовується в аналітичних програмах у реальному часі для обробки та аналізу даних у міру їх створення, дозволяючи компаніям приймати рішення на основі актуальної інформації. Він може обробляти великі обсяги даних та масштабуватися для найвимогливіших програм.
Агрегація журналів
Kafka об’єднує журнали з різних систем, дозволяючи компаніям відстежувати та вирішувати проблеми в реальному часі. Також використовується для зберігання журналів для довгострокового аналізу.
Машинне навчання
Kafka використовується для потокової передачі даних моделям машинного навчання в режимі реального часу, дозволяючи компаніям робити прогнози та вживати заходів на основі актуальної інформації. Це допомагає підвищити точність та ефективність моделей машинного навчання.
Моя думка про RabbitMQ та Kafka
Недоліком широких можливостей RabbitMQ є підвищене споживання ресурсів та зниження продуктивності при великих навантаженнях. У більшості випадків Apache Kafka є кращим інструментом для керування повідомленнями, особливо в складних системах.
Наприклад, для збору та агрегування подій із багатьох систем, враховуючи георезервування, клієнтські метрики, журнали та аналітику, я віддаю перевагу Kafka. Однак, якщо потрібна проста передача повідомлень, RabbitMQ чудово впорається.
Ви також можете дізнатися, як встановити Apache Kafka у Windows та Linux.