RabbitMQ пояснюється за 5 хвилин або менше

Сьогодні ми розглянемо, як можна прискорити завантаження вебсторінок, перемістивши об’ємні обчислення в асинхронний режим. Це стає напрочуд простим завдяки використанню RabbitMQ.

Стабільність та оперативність роботи програми чи веб-сайту є одними з ключових факторів, що впливають на користувацький досвід. Чи не кожен з нас залишав веб-сторінку, не дочекавшись її повного завантаження через надмірну тривалість очікування?

Що являє собою RabbitMQ?

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

RabbitMQ впроваджує протокол обміну повідомленнями прикладного рівня AMQP, орієнтований на асинхронну передачу повідомлень з гарантованою доставкою. Це досягається через підтвердження отримання повідомлень як від брокера до відправника, так і від отримувачів до брокера.

Як функціонує RabbitMQ?

У спрощеній моделі, RabbitMQ створює черги, в яких накопичуються повідомлення, відправлені виробниками, до моменту їхнього отримання та обробки програмами-споживачами. Це створює основу для розробки розподілених систем, де компоненти системи є незалежними модулями, що обмінюються даними через повідомлення.

Для будь-якої форми комунікації потрібні відправник, повідомлення та одержувач. RabbitMQ займає центральне місце в цьому процесі, виступаючи як сховище, де повідомлення чекають на свого адресата.

Для кращого розуміння механізму роботи, розгляньмо різні типи обмінів, що використовуються в процесі обміну повідомленнями.

Типи обмінів

Коли повідомлення відправляється через RabbitMQ, воно не потрапляє безпосередньо в чергу. Для забезпечення можливості його отримання різними системами, воно спочатку надходить на біржу, яка відповідає за подальшу доставку повідомлень у відповідні черги.

Авторство зображення: CloudAQMP

Існує чотири основних типи обмінів: Direct, Fanout, Topic та Headers.

Прямий обмін (Direct Exchange)

Уявімо ситуацію, коли відправник має надіслати підтвердження про покупку трьом різним отримувачам. Це означає, що система повинна взаємодіяти з трьома іншими системами для завершення процесу покупки.

Оскільки RabbitMQ доставляє повідомлення до кожної черги окремо, виникає потреба в тому, щоб ці інші системи отримували повідомлення цілеспрямовано.

Зазвичай, обмін перенаправляє повідомлення у всі черги, однак, часто виникає необхідність надсилати повідомлення лише в певні черги. Для цього застосовуються різні умови.

Таким чином, повідомлення можна надіслати лише одному споживачеві, замість того, щоб розсилати його всім.

Ключ прив’язки: Для зв’язку черги з біржею необхідно створити прив’язку – свого роду з’єднувач між ними.

Ключ маршрутизації: У процесі прив’язування можна визначити ключ маршрутизації, який служить ідентифікатором для перенаправлення повідомлень до конкретної черги.

Наявність ключів маршрутизації, наприклад, X, Y і Z, дозволяє повідомленню з ключем Y потрапити в чергу Y та бути доставленим відповідному споживачеві.

Таким чином, до однієї біржі може бути підключено кілька черг, кожна з яких має індивідуальні відносини з біржею через ключі маршрутизації.

Обмін Fanout (Fanout Exchange)

Повідомлення, надіслане на біржу типу Fanout, розсилається в усі черги, що підключені до цієї біржі. Таким чином, якщо є 10 черг, кожна з них отримає відправлене повідомлення.

Обмін Topic (Topic Exchange)

Цей тип обміну є одним з найгнучкіших, дозволяючи відправляти повідомлення відповідно до певної теми. На основі ключів маршрутизації можна створювати шаблони для встановлення зв’язків між різними системами.

Наприклад: ключ маршрутизації (x.*); ключ маршрутизації (*.z); ключ маршрутизації (*.y.*).

Що таке AMQP в RabbitMQ?

AMQP (Advanced Message Queuing Protocol) — це відкритий протокол обміну повідомленнями, який визначає спосіб передачі повідомлень між різними програмами. Його можна порівняти з протоколами HTTP і TCP, але з можливістю асинхронної передачі даних.

RabbitMQ обрав реалізацію AMQP з кількох причин. По-перше, цей протокол є стандартом для проміжного програмного забезпечення, на відміну від JMS, який визначає лише API.

Специфікація AMQP розроблена міжнародним консорціумом, до складу якого входять такі великі компанії, як Red Hat, Cisco Systems і Microsoft. По-друге, AMQP забезпечує сумісність, дозволяючи будь-якій програмі, що його реалізує, взаємодіяти з AMQP-брокером.

AMQP не є єдиним протоколом, який використовується RabbitMQ. На зображенні нижче представлені інші протоколи, мови та API, які підтримуються RabbitMQ.

Ключові особливості RabbitMQ

Окрім можливості інтеграції різних програм за допомогою асинхронних повідомлень, RabbitMQ має ряд інших функцій, які зробили його популярним у світі брокерів обміну повідомленнями:

Надійне зберігання

RabbitMQ надає ряд функцій, що гарантують доставку повідомлень. Зокрема, він забезпечує зберігання повідомлень у разі відсутності активних споживачів. Споживачі, зі свого боку, підтверджують отримання повідомлень, що гарантує їх успішну обробку.

У випадку невдалої обробки, RabbitMQ дозволяє повернути повідомлення в чергу для обробки іншим споживачем або повторної обробки тим самим споживачем після відновлення.

RabbitMQ також гарантує порядок доставки повідомлень, забезпечуючи їх обробку в тій же послідовності, в якій вони надходять у чергу.

Кластеризація

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

Високодоступні черги

У RabbitMQ черги можна реплікувати на різних вузлах кластера, що забезпечує безперебійну роботу навіть у разі збою окремих вузлів. Брокер продовжує отримувати повідомлення від відправників та доставляти їх відповідним споживачам.

Гнучка маршрутизація

RabbitMQ дозволяє визначати гнучкі правила маршрутизації, які можуть включати шаблони, для перенаправлення повідомлень між біржами та чергами за допомогою прив’язок.

Підтримка різних протоколів

Окрім AMQP, RabbitMQ підтримує STOMP, MQTT та HTTP через відповідні плагіни. Також впроваджено механізми аутентифікації та контролю доступу для кожного компонента брокера.

Приклади використання RabbitMQ на практиці

Ключові сфери застосування RabbitMQ – забезпечення асинхронності між програмами, зменшення залежності між ними, розповсюдження сповіщень та контроль черги завдань у фоновому режимі.

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

Після обробки замовлення, повідомлення про продаж можна перенаправити в центр розподілу та відділ рахунків-фактур. Таким чином, процес виконується асинхронно, але при цьому, одну дію можна відправити до декількох черг одночасно.

З огляду на попередній приклад, така функціональність є корисною, коли клієнт робить покупку, і товар потребує підготовки до відправлення, транспортування та виставлення рахунків. Кожен з цих етапів є окремою системою, і RabbitMQ слугує для пересилання повідомлень між ними.

Альтернативи RabbitMQ:

RabbitMQ, незважаючи на свою простоту, має кілька альтернатив, серед яких:

#1. IronMQ

IronMQ – це високопродуктивне програмне забезпечення для організації черги повідомлень. Воно характеризується високою доступністю, надійністю та гарантує доставку повідомлень. IronMQ вважається потужним хмарним рішенням для сучасних архітектур додатків.

Він підтримує черги push, черги pull і довгі опитування, що дозволяє довше зберігати запити на опитування. Він також використовує декілька центрів обробки даних з високою доступністю, що полегшує масштабування.

Ви можете розгортати IronMQ у хмарі, на загальному або виділеному обладнанні, або локально. Він також має ряд клієнтських бібліотек із зрозумілою документацією.

#2. Apache Kafka

Kafka – це платформа для потокової обробки подій. За своєю суттю, Kafka є реплікованим, розподіленим журналом.

Вона є ідеальним рішенням для мікросервісів, що керуються подіями, або великомасштабних додатків для обробки потоків, а також для асинхронного копіювання подій в кластері для відмовостійкості та високої доступності.

#3. Apache ActiveMQ

ActiveMQ – це багатопротокольний брокер повідомлень на основі Java. Він дозволяє інтегрувати додатки з використанням протоколу AMQP на прикладному рівні.

ActiveMQ реалізує ряд протоколів для інтеграції, таких як JMS (для Java) та Stomp (для PHP та інших).

Крім того, Amazon надає керовану версію ActiveMQ під назвою Amazon MQ, що спрощує використання сервісу.

Заключні слова

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

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

Ви також можете розглянути різні платформи для надійного хостингу RabbitMQ для вашої програми.