Перейти до вмісту

RabbitMQ

Очікує на перевірку
Матеріал з Вікіпедії — вільної енциклопедії.
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.com

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

[ред. | ред. код]

У моделі 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

[ред. | ред. код]

RabbitMQ Streams — структура даних для зберігання послідовності повідомлень як журналу з дописуванням у кінець (append-only log). На відміну від звичайної черги, прочитаний запис не вилучається відразу: кілька незалежних споживачів можуть читати ті самі дані, починати з певної позиції (offset) і повторювати читання. Записи видаляються відповідно до політик зберігання, наприклад за терміном або обсягом.[13]

Потоки завжди зберігають дані на диску й підтримують реплікацію. Super streams об'єднують кілька потоків у логічну структуру, розділену на секції (partitions), для паралельного опрацювання. Потоки використовують, зокрема, для запису подій, їхнього повторного читання та передавання великого обсягу повідомлень.[13]

ВластивістьКласична чергаКворумна чергаПотік
Основне призначенняДоставлення повідомленьНадійне репліковане доставленняЖурнал подій із повторним читанням
Реплікація між вузламиНемає (починаючи з 4.0)Є, за алгоритмом RaftЄ
Повторне читання вже оброблених записівНе є звичайною моделлю роботиНе є звичайною моделлю роботиПередбачене архітектурою
Зберігання записівЗалежить від довговічності й властивостей повідомленьНа дискуНа диску з політикою утримання

[7]

Надійність і доставлення

[ред. | ред. код]

Підтвердження публікації та оброблення

[ред. | ред. код]

Для надійного обміну важливо розрізняти підтвердження прийняття повідомлення брокером (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

[ред. | ред. код]

Для PHP поширені два способи використання AMQP 0-9-1:

  • php-amqplib — бібліотека, написана мовою PHP; не вимагає окремого розширення PHP.[27]
  • php-amqp — розширення PHP, що використовує бібліотеку librabbitmq для роботи з брокерами AMQP 0-9-1.[28]

Експлуатація, моніторинг і безпека

[ред. | ред. код]

Для керування 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. 1 2 SpringSource Acquires UK-based Open Source Company Rabbit Technologies. TechCrunch (англ.). 13 квітня 2010. Процитовано 21 жовтня 2026.
  2. 1 2 RabbitMQ 4.4.0. GitHub (англ.). 19 жовтня 2026. Процитовано 21 жовтня 2026.
  3. 1 2 LICENSE. GitHub — rabbitmq/rabbitmq-server (англ.). Процитовано 21 жовтня 2026.
  4. 1 2 3 4 AMQP 0-9-1 Model Explained. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
  5. 1 2 RabbitMQ in Depth (англ.). Manning Publications. Процитовано 21 жовтня 2026.
  6. 1 2 3 4 Which protocols does RabbitMQ support?. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
  7. 1 2 3 4 Queues. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
  8. ↑ Radestock, Matthias; Garnock-Jones, Tony. RabbitMQ: An Implementation of AMQP in Erlang/OTP. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
  9. ↑ Joubert, Emile (14 травня 2013). Proudly part of Pivotal (англ.). Процитовано 21 жовтня 2026.
  10. ↑ Johnson, Rod (13 квітня 2010). SpringSource Hops On Cloud Messaging with RabbitMQ. Spring (англ.). Процитовано 21 жовтня 2026.
  11. ↑ VMware Completes Acquisition of Pivotal (англ.). 30 грудня 2019. Процитовано 21 жовтня 2026.
  12. ↑ Varghese, Harshita (22 листопада 2023). Broadcom closes $69 billion VMware deal after China approval (англ.). Reuters. Процитовано 21 жовтня 2026.
  13. 1 2 3 4 5 Streams and Superstreams (Partitioned Streams). RabbitMQ (англ.). Процитовано 21 жовтня 2026.
  14. 1 2 3 4 5 6 Quorum Queues. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
  15. 1 2 3 4 Reliability Guide. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
  16. ↑ Virtual Hosts. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
  17. 1 2 3 Exchanges. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
  18. ↑ Direct Reply-To. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
  19. 1 2 Classic Queues. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
  20. 1 2 3 4 Consumer Acknowledgements and Publisher Confirms. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
  21. ↑ Dead Letter Exchanges. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
  22. ↑ Clustering Guide. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
  23. ↑ Exchange and Queue Federation. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
  24. ↑ Shovel Plugin. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
  25. 1 2 3 Management Plugin. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
  26. ↑ Client Libraries and Developer Tools. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
  27. ↑ php-amqplib. GitHub (англ.). Процитовано 21 жовтня 2026.
  28. ↑ PHP AMQP bindings. GitHub (англ.). Процитовано 21 жовтня 2026.
  29. ↑ Authentication, Authorisation, Access Control. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
  30. ↑ Installing RabbitMQ. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
  31. ↑ Using the RabbitMQ Cluster Kubernetes Operator. RabbitMQ (англ.). Процитовано 21 жовтня 2026.
  32. ↑ RabbitMQ vs. Apache Kafka. RabbitMQ (англ.). Процитовано 21 жовтня 2026.

Додаткова література

[ред. | ред. код]

Посилання

[ред. | ред. код]