RabbitMQ
| Тип | Брокер повідомлень, Проміжне програмне забезпечення |
|---|---|
| Розробники | Команда RabbitMQ (Broadcom) |
| Перший випуск | лютий 2007[1] |
| Стабільний випуск | 4.4.0 (19 жовтня 2026 (0 років)[2]) |
| Операційна система | багатоплатформне |
| Мова програмування | Erlang |
| Ліцензія | Mozilla Public License 2.0[3] |
| Репозиторій | https://github.com/rabbitmq/rabbitmq-server |
| Вебсайт | www |
RabbitMQ — вільний брокер повідомлень із відкритим початковим кодом, призначений для обміну повідомленнями між компонентами програмних систем. Він приймає повідомлення від програм-відправників, маршрутизує їх та передає одержувачам, а за потреби зберігає в чергах до моменту оброблення. Такий підхід використовують для асинхронної взаємодії сервісів, розподілення фонових завдань та інтеграції застосунків, зокрема в розподілених системах.[4][5]
RabbitMQ спочатку розробляли як реалізацію протоколу AMQP 0-9-1. Сучасні випуски також підтримують AMQP 1.0, MQTT, STOMP та спеціалізований протокол потокового передавання RabbitMQ Stream Protocol. Сервер написаний мовою Erlang із використанням платформи Erlang/OTP. Він підтримує декілька типів черг, кластери, реплікацію даних для визначених структур зберігання, підтвердження повідомлень та систему плагінів.[6][7]
Розробка RabbitMQ почалася у Великій Британії як спільний проєкт компаній LShift та CohesiveFT. Компанію Rabbit Technologies Ltd. засновано в лютому 2007 року; того ж місяця відбувся перший публічний випуск брокера. Його створювали як відкриту реалізацію стандарту AMQP, що мала забезпечити взаємодію програм, незалежну від конкретної мови програмування та операційної системи.[1][8]
У квітні 2010 року Rabbit Technologies придбала SpringSource, яка тоді належала VMware. Проєкт залишився відкритим. У 2013 році його розвиток перейшов до компанії Pivotal Software.[9] Після поглинання Pivotal компанією VMware у 2019 році RabbitMQ розвивали в продуктовій лінійці VMware Tanzu. У листопаді 2023 року американська корпорація Broadcom завершила придбання компанії VMware за приблизно 69 млрд доларів США. Внаслідок цього RabbitMQ, який раніше входив до портфеля VMware Tanzu, перейшов під контроль Broadcom.[10][11][12]
Спочатку RabbitMQ передусім реалізовував модель черг і точок обміну AMQP 0-9-1. Надалі з'явилися засоби передавання повідомлень між брокерами, кворумні черги, побудовані на розподіленому консенсусі, та RabbitMQ Streams — потоки повідомлень із можливістю повторного читання.[13][14] Від версії 4.0, випущеної 2024 року, AMQP 1.0 став основним протоколом поряд з AMQP 0-9-1; з цієї ж серії вилучено механізм дзеркальних класичних черг.[6][14]
19 жовтня 2026 року оприлюднено RabbitMQ 4.4.0. Серед його змін — підтримка відкладеного доставлення повідомлень кворумними чергами за вказаним часом доставлення.[2]
Початковий код сервера й основних плагінів поширюється за ліцензією Mozilla Public License 2.0. Поряд із відкритим проєктом існують комерційні пропозиції підтримки та розгортання RabbitMQ.[3]
У системі, де програми викликають одна одну безпосередньо, відправник запиту зазвичай залежить від доступності одержувача. RabbitMQ додає між ними окремий програмний компонент — брокер повідомлень. Виробник публікує повідомлення брокеру, а споживач отримує його незалежно від того, чи працював він у момент публікації. Повідомлення може очікувати в черзі; однак його збереження після збою залежить від типу черги та налаштувань надійності.[15]
Наприклад, після оформлення замовлення інтернет-магазин може створити повідомлення про нову покупку. Окремі служби опрацьовують оплату, складські операції або надсилання повідомлень покупцеві. За допомогою RabbitMQ можна розподілити завдання між працівниками або передати одну подію кільком незалежним службам — залежно від обраної схеми маршрутизації.[4]
У моделі AMQP 0-9-1 взаємодія організована за допомогою таких об'єктів:[4]
- Виробник (producer, publisher) — застосунок, який створює та публікує повідомлення.
- Повідомлення (message) — одиниця переданої інформації з даними та службовими властивостями. Дані можуть бути текстовими або двійковими, наприклад у форматі JSON чи XML.
- Точка обміну (exchange) — об'єкт, який приймає опубліковане повідомлення й за правилами маршрутизації спрямовує його до черг, потоків або інших точок обміну.
- Черга (queue) — структура для утримання повідомлень, які належить передати споживачам. У звичайній черзі успішно підтверджене повідомлення після оброблення вилучається.
- Споживач (consumer) — застосунок, який отримує повідомлення та обробляє їх.
- Прив'язка (binding) — зв'язок між точкою обміну та місцем призначення, іноді з умовою маршрутизації.
- Ключ маршрутизації (routing key) — рядок, що його публікатор передає разом із повідомленням. За певних типів точок обміну цей рядок визначає потрібні місця призначення.
Точки обміну, черги й прив'язки існують у межах віртуального хоста (virtual host, vhost). Віртуальні хости розділяють простори імен, налаштування та права доступу різних застосунків, але не означають фізично відокремленого обладнання або окремого процесу RabbitMQ.[16]
На відміну від простої черги, до якої відправник звертається безпосередньо, модель AMQP 0-9-1 дозволяє публікувати повідомлення в точку обміну й налаштовувати доставлення без зміни відправника. Основні типи точок обміну:[17]
| Тип | Правило маршрутизації | Типовий приклад |
|---|---|---|
| Direct | До всіх прив'язаних черг, ключ прив'язки яких точно збігається з ключем повідомлення. | Розподіл завдань за конкретною назвою або категорією. |
| Fanout | До всіх прив'язаних місць призначення незалежно від ключа. | Поширення однієї події кільком службам. |
| Topic | За шаблоном ключа маршрутизації: * відповідає одному компоненту, # — довільній кількості компонентів. | Відбір подій за темою та її частинами. |
| Headers | За значеннями заголовків повідомлення. | Відбір за набором атрибутів повідомлення. |
Наприклад, прив'язка orders.created.* до точки обміну topic відбиратиме ключі orders.created.eu й orders.created.us, але не orders.cancelled.eu. При цьому одна подія може потрапити до кількох черг, якщо задовольняє умови відповідних прив'язок.[17]
За замовчуванням RabbitMQ створює точку обміну direct з порожньою назвою, до якої кожна черга автоматично прив'язується за власним іменем. Це дає змогу публікувати повідомлення в конкретну чергу, використовуючи її назву як ключ маршрутизації.[17]
- Розподіл роботи (work queue): кілька споживачів отримують повідомлення зі спільної черги, і зазвичай кожне повідомлення дістається одному з них.
- Публікація — підписка (publish/subscribe): повідомлення передаються кільком незалежним одержувачам, зазвичай через окремі черги.
- Маршрутизація за темами: підписники отримують лише повідомлення, ключі яких відповідають заданим шаблонам.
- Запит — відповідь (request/reply): застосунок надсилає запит та одержує відповідь іншим повідомленням. RabbitMQ має для цього, зокрема, механізм Direct Reply-To.[4][18]
Класичні черги (classic queues) — початковий тип черг RabbitMQ. Вони підтримують звичайне доставлення повідомлень, підтвердження від споживача, обмеження часу життя й, за відповідної конфігурації, пріоритети. Починаючи з версії 4.0 вони не реплікуються між вузлами. Тому кластер із кількох вузлів не забезпечує автоматично збереження вмісту класичної черги після виходу з ладу її вузла.[19]
Кворумні черги (quorum queues) призначені для реплікованого зберігання повідомлень. Вони застосовують алгоритм Raft — механізм розподіленого консенсусу, за яким репліки узгоджують послідовність записів. Один вузол виконує роль лідера, а для безпечного підтвердження запису необхідна більшість реплік.[14]
Наприклад, кворумна черга з трьома репліками може продовжувати роботу після відмови однієї з них за умови збереження зв'язку між двома іншими. За втрати більшості така черга перестає приймати операції, для яких потрібен кворум. Реплікація підвищує стійкість до відмов, але створює додаткові навантаження на мережу й диски.[14]
RabbitMQ Streams — структура даних для зберігання послідовності повідомлень як журналу з дописуванням у кінець (append-only log). На відміну від звичайної черги, прочитаний запис не вилучається відразу: кілька незалежних споживачів можуть читати ті самі дані, починати з певної позиції (offset) і повторювати читання. Записи видаляються відповідно до політик зберігання, наприклад за терміном або обсягом.[13]
Потоки завжди зберігають дані на диску й підтримують реплікацію. Super streams об'єднують кілька потоків у логічну структуру, розділену на секції (partitions), для паралельного опрацювання. Потоки використовують, зокрема, для запису подій, їхнього повторного читання та передавання великого обсягу повідомлень.[13]
| Властивість | Класична черга | Кворумна черга | Потік |
|---|---|---|---|
| Основне призначення | Доставлення повідомлень | Надійне репліковане доставлення | Журнал подій із повторним читанням |
| Реплікація між вузлами | Немає (починаючи з 4.0) | Є, за алгоритмом Raft | Є |
| Повторне читання вже оброблених записів | Не є звичайною моделлю роботи | Не є звичайною моделлю роботи | Передбачене архітектурою |
| Зберігання записів | Залежить від довговічності й властивостей повідомлень | На диску | На диску з політикою утримання |
Для надійного обміну важливо розрізняти підтвердження прийняття повідомлення брокером (publisher confirms) й підтвердження оброблення повідомлення споживачем (consumer acknowledgements). Перше сигналізує відправникові, що брокер прийняв відповідальність за публікацію відповідно до властивостей місця призначення; друге дозволяє брокеру вважати конкретну доставку завершеною. Підтвердження публікації не засвідчує виконання бізнес-операції одержувачем.[20]
Якщо споживач працює з ручними підтвердженнями і його з'єднання розривається до підтвердження, брокер може повернути непідтверджене повідомлення до черги й доставити його іншому споживачеві. Отже, програми мають передбачати повторне надходження тих самих повідомлень.[20]
У RabbitMQ довговічність черги (durable queue) та стійкість повідомлення (persistent message) — різні налаштування. Для класичної черги, щоб повідомлення могло пережити перезапуск, важливі і довговічність черги, і спосіб публікації повідомлення. Кворумні черги використовують зберігання повідомлень на диску. Проте сама наявність дискового запису не скасовує необхідності належних підтверджень та врахування можливих відмов обладнання.[15][19][14]
Для прикладної системи можна організувати доставлення не більш як один раз (at-most-once) або щонайменше один раз (at-least-once). Другий підхід допускає дублікати після збою. RabbitMQ не гарантує автоматично, що зовнішня дія — наприклад списання коштів чи запис у базу даних — відбудеться рівно один раз. Для цього розробники застосовують, зокрема, ідемпотентні операції або дедуплікацію подій.[15][20]
Для відокремлення повідомлень, які не вдалося обробити звичайним способом, RabbitMQ підтримує точки обміну недоставлених повідомлень (dead-letter exchanges, DLX). До них повідомлення можуть бути скеровані після відхилення без повторного повернення, спливу строку життя, перевищення обмеження довжини черги або допустимого числа доставлень у кворумній черзі.[21]
RabbitMQ також підтримує керування попереднім вибиранням повідомлень (prefetch), обмеження їхнього часу життя й повторне доставлення. Ці засоби допомагають уникнути неконтрольованого накопичення непідтверджених повідомлень і визначати поведінку програми під час збоїв.[20][7]
Звичайні черги переважно працюють за принципом FIFO («першим надійшло — першим вибуло»). Однак паралельне опрацювання різними споживачами, пріоритети та повторні доставки можуть змінювати фактичний порядок завершення роботи. Якщо потрібна одна активна програма-споживач на чергу, можна застосувати режим Single Active Consumer.[7]
RabbitMQ можна розгортати як Комп'ютерний кластер із кількох вузлів. Учасники кластера спільно використовують метадані про користувачів, віртуальні хости, черги й точки обміну. Клієнт може під'єднатися до одного вузла, а працювати з ресурсом, розташованим на іншому. Водночас кластеризація не означає автоматичної реплікації всіх повідомлень: вона залежить від типу черги або потоку.[22]
Для взаємодії незалежних кластерів і брокерів використовують плагіни Federation і Shovel. Federation дає змогу об'єднувати маршрути передавання між віддаленими чергами й точками обміну, не створюючи спільного кластера. Shovel передає повідомлення з визначеного джерела до визначеного місця призначення, наприклад під час перенесення даних між брокерами.[23][24]
RabbitMQ підтримує кілька протоколів, які призначені для різних моделей застосування:[6]
| Протокол | Особливості |
|---|---|
| AMQP 0-9-1 | Первісний протокол RabbitMQ: модель точок обміну, черг і прив'язок. |
| AMQP 1.0 | Інший стандартизований протокол із відмінною мережевою структурою і моделлю взаємодії. Входить до основних протоколів RabbitMQ від версії 4.0. |
| MQTT | Легкий протокол публікації й підписки, який часто використовують в Інтернеті речей. |
| STOMP | Текстовий протокол обміну повідомленнями. |
| RabbitMQ Stream Protocol | Двійковий протокол, спеціалізований для запису й читання потоків RabbitMQ Streams. |
AMQP 0-9-1 та AMQP 1.0, попри спільну назву, не є сумісними на рівні формату мережевих повідомлень. Окремі протоколи в RabbitMQ реалізовано основним сервером, інші — плагінами. Для клієнтів, які працюють через браузер, доступні варіанти з WebSocket. HTTP використовується для адміністрування через API, але не замінює повністю засоби звичайної взаємодії через протоколи обміну повідомленнями.[6][25]
Для роботи з брокером існують клієнтські бібліотеки на мовах Java, C# (.NET), Python, JavaScript, Go, Ruby, PHP, Erlang та інших. Це дозволяє використовувати брокер між компонентами, написаними різними мовами.[26]
Для PHP поширені два способи використання AMQP 0-9-1:
Для керування RabbitMQ існують утиліти командного рядка rabbitmqctl, rabbitmq-diagnostics і rabbitmq-plugins. Плагін RabbitMQ Management надає вебінтерфейс та HTTP API, у яких можна переглядати черги, з'єднання, права доступу, кількість повідомлень і статистику передавання.[25]
Для збирання метрик та оповіщення про проблеми використовується інтеграція із системою Prometheus; дані можуть відображатися засобами Grafana. RabbitMQ підтримує TLS, автентифікацію та налаштування дозволів користувачів у межах віртуальних хостів. За замовчуванням обліковий запис guest має обмеження на віддалене підключення.[25][29]
Брокер працює в Linux, Windows та macOS, може розгортатися як системна служба або в контейнерному середовищі, зокрема через Docker і Kubernetes. Для Kubernetes існує RabbitMQ Cluster Operator.[30][31]
RabbitMQ використовують для асинхронної взаємодії мікросервісів, виконання фонових завдань, передавання подій між компонентами й інтеграції інформаційних систем. Черги зручні для розподілу завдань між кількома робочими процесами; обмін за шаблоном publish/subscribe — для сповіщення незалежних служб; потоки — для накопичення та повторного читання подій.[5][13]
Утім, RabbitMQ не усуває необхідності проєктувати поведінку системи в умовах збоїв. Якщо виробники надсилають повідомлення швидше, ніж споживачі їх обробляють, черги можуть зростати; це створює навантаження на пам'ять, диски та мережу. Робота з відмовами вимагає керування повторними доставленнями, ресурсними обмеженнями й підтвердженнями. Репліковані структури стійкіші до окремих відмов, але потребують додаткових ресурсів і можуть втрачати доступність за відсутності кворуму.[15][14]
До засобів обміну повідомленнями зі спорідненими завданнями належать Apache ActiveMQ, Apache Kafka, Amazon SQS та ØMQ (ZeroMQ). Вони відрізняються архітектурою: наприклад, Apache Kafka орієнтована на розподілені журнали подій, тоді як ØMQ — на бібліотечні примітиви обміну повідомленнями без обов'язкового окремого центрального брокера. RabbitMQ поєднує маршрутизацію повідомлень через точки обміну з чергами та власним механізмом потокового зберігання.[32][13]
- 1 2 SpringSource Acquires UK-based Open Source Company Rabbit Technologies. TechCrunch (англ.). 13 квітня 2010. Процитовано 21 жовтня 2026.
- 1 2 RabbitMQ 4.4.0. GitHub (англ.). 19 жовтня 2026. Процитовано 21 жовтня 2026.
- 1 2 LICENSE. GitHub — rabbitmq/rabbitmq-server (англ.). Процитовано 21 жовтня 2026.
- 1 2 3 4 AMQP 0-9-1 Model Explained. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
- 1 2 RabbitMQ in Depth (англ.). Manning Publications. Процитовано 21 жовтня 2026.
- 1 2 3 4 Which protocols does RabbitMQ support?. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
- 1 2 3 4 Queues. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
- ↑ Radestock, Matthias; Garnock-Jones, Tony. RabbitMQ: An Implementation of AMQP in Erlang/OTP. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
- ↑ Joubert, Emile (14 травня 2013). Proudly part of Pivotal (англ.). Процитовано 21 жовтня 2026.
- ↑ Johnson, Rod (13 квітня 2010). SpringSource Hops On Cloud Messaging with RabbitMQ. Spring (англ.). Процитовано 21 жовтня 2026.
- ↑ VMware Completes Acquisition of Pivotal (англ.). 30 грудня 2019. Процитовано 21 жовтня 2026.
- ↑ Varghese, Harshita (22 листопада 2023). Broadcom closes $69 billion VMware deal after China approval (англ.). Reuters. Процитовано 21 жовтня 2026.
- 1 2 3 4 5 Streams and Superstreams (Partitioned Streams). RabbitMQ (англ.). Процитовано 21 жовтня 2026.
- 1 2 3 4 5 6 Quorum Queues. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
- 1 2 3 4 Reliability Guide. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
- ↑ Virtual Hosts. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
- 1 2 3 Exchanges. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
- ↑ Direct Reply-To. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
- 1 2 Classic Queues. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
- 1 2 3 4 Consumer Acknowledgements and Publisher Confirms. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
- ↑ Dead Letter Exchanges. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
- ↑ Clustering Guide. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
- ↑ Exchange and Queue Federation. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
- ↑ Shovel Plugin. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
- 1 2 3 Management Plugin. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
- ↑ Client Libraries and Developer Tools. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
- ↑ php-amqplib. GitHub (англ.). Процитовано 21 жовтня 2026.
- ↑ PHP AMQP bindings. GitHub (англ.). Процитовано 21 жовтня 2026.
- ↑ Authentication, Authorisation, Access Control. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
- ↑ Installing RabbitMQ. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
- ↑ Using the RabbitMQ Cluster Kubernetes Operator. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
- ↑ RabbitMQ vs. Apache Kafka. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
- Videla, Alvaro; Williams, Jason J. W. RabbitMQ in Action: Distributed Messaging for Everyone. — Manning, 2012. — 312 с. — ISBN 978-1-935182-97-9. Сторінка видавництва.
- Roy, Gavin M. RabbitMQ in Depth. — Manning, 2017. — 264 с. — ISBN 978-1-61729-100-5. Сторінка видавництва.
- Офіційний сайт RabbitMQ (англ.)
- Документація RabbitMQ (англ.)
- Початковий код RabbitMQ на GitHub (англ.)
- Навчальні матеріали RabbitMQ (англ.)
