RabbitMQ. Частина 1. Introduction. Erlang, AMQP

Доброго дня, Хабре! Хочу поділитися підручником-довідником знань, які мені вдалося зібрати за RabbitMQ та стиснути в короткі рекомендації та висновки.

Зміст

  • RabbitMQ. Частина 1. Introduction. Erlang, AMQP та RPC
  • RabbitMQ. Частина 2. Розбираємось з Exchanges
  • RabbitMQ. Частина 3. Розбираємося з Queues та Bindings
  • RabbitMQ. Частина 4. Розбираємося з тим, що таке повідомлення та кадри
  • RabbitMQ. Частина 5. Продуктивність публікації та споживання повідомлень
  • RabbitMQ. Частина 6. Огляд модулів Federation та Shovel
  • RabbitMQ. Частина 7. Докладно про Connection та Chanel
  • RabbitMQ. Частина 8. RabbitMQ у .NET
  • RabbitMQ. Частина 9. Моніторинг

Коротко про AMQP

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

протокол AMQP вводить три поняття:

RabbitMQ. Частина 1. Introduction. Erlang, AMQP

  • exchange (точка обміну або обмін) — до неї надсилаються повідомлення. Точка обміну розподіляє повідомлення в одну чи кілька черг. Вона маршрутизує повідомлення в чергу на основі створених зв'язків (binding) між ним та чергою
  • queue (черга) - структура даних на диску або в оперативній пам'яті, яка зберігає посилання на повідомлення та віддає копії повідомлень consumers (споживачам)
  • binding (Прив'язка) - правило, яке повідомляє точці обміну в яку з черг ці повідомлення мають потрапляти

Протокол працює поверх TCP / IP.

Коротко про Erlang

Вихідний код проекту знаходиться в репозиторії на GitHub. Архітектура RabbitMQ-server заснована на Ерланг та BEAM.

Erlang розроблений компанією Ericsson в середині 1980-х як розподілена, стійка до відмови, система реального часу для додатків, що вимагають безвідмовної роботи 99,999%. Erlang застосовується в різних галузях і сучасних додатках, наприклад, WhatsApp. Детальніше можна прочитати у статті архітектура WhatsApp, яку Facebook купив за $19 мільярдів

Коротко про RabbitMQ

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

Основна ідея моделі обміну повідомленнями в RabbitMQ полягає в тому що producer (видавець) не надсилає повідомлення безпосередньо у чергу. Насправді й досить часто видавець навіть не знає, чи повідомлення взагалі буде доставлене в якусь чергу.

Натомість видавець може надсилати повідомлення лише на обмін. З одного боку, обмін отримує повідомлення від видавців, з другого — відправляє їх у черги. Обмін повинен точно знати, що робити з отриманим повідомленням. Чи має бути додано до певної черги? Чи має бути додано до кількох черг? Або повідомлення потрібно ігнорувати.

RabbitMQ. Частина 1. Introduction. Erlang, AMQP

Коротко роботу RabbitMQ можна описати так:

  1. Видавець надсилає повідомлення певному обміну
  2. Обмін, отримавши повідомлення, маршрутизує його в одну або кілька черг відповідно до правил прив'язки між ним та чергою
  3. Черга зберігає посилання цього повідомлення. Саме повідомлення зберігається в оперативній пам'яті або на диску
  4. Як тільки споживач готовий отримати повідомлення з черги, сервер створює копію повідомлення за посиланням та відправляє
  5. Споживач отримує повідомлення та надсилає брокеру підтвердження
  6. Брокер, отримавши підтвердження, видаляє копію повідомлення з черги. Потім видаляє з оперативної пам'яті та з диска

RPC

Процес RPC (remote procedure call) лежить в основі практично всіх взаємодій із ядром RabbitMQ. Наприклад, початкові обговорення умов клієнта з RabbitMQ, демонструє певний процес RPC. Як тільки ця послідовність завершиться, RabbitMQ буде готовий приймати запити від клієнта:

RabbitMQ. Частина 1. Introduction. Erlang, AMQP

Також у специфікації AMQP і клієнт та сервер можуть викликати команди. Це означає, що клієнт очікує на взаємодію з сервером. Команди - це класи та методи. Наприклад, Connection.Start – виклик методу Start класу Connection.

Підключення та канали

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

Для того, щоб мати можливість відправляти команди, паралельно доводиться відкривати кілька каналів. Кожен канал створює окремий Erlang процес. Одне підключення може мати безліч каналів (мультиплексування). Для кожного каналу існують деякі структури та об'єкти у пам'яті. Тому чим більше каналів є в рамках з'єднання, тим більше пам'яті використовує RabbitMQ для керування таким з'єднанням.

RabbitMQ. Частина 1. Introduction. Erlang, AMQP

Простий приклад створення підключення та каналу за допомогою RabbitMQ.Client:

// ...
private void TryConnect()
{
    var factory = new ConnectionFactory() 
    {
        HostName = "host_name",
        UserName = "user_name",
        Password = "p@ssword",
        // Включение автоматичекого восстановления
        // соединения после сбоев сети 
        AutomaticRecoveryEnabled = true
    };
    _connection = factory.CreateConnection();
}
// ...
public void CreateChanel()
{
    _channel = _connection.CreateModel();
    // other options 
}

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

Де використовується RabbitMQ?

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

В контексті IIOT протокол AMQP та його реалізацію в RabbitMQ використовують для обміну даними між серверами (сервер-сервер). Також використовують плагін MQTT Plugin RabbitMQ є реалізацією протоколу MQTT для передачі даних між датчиком і сервером в низькошвидкісних середовищах з високою затримкою (повний перелік протоколів, що підтримуються, перерахований на сайті проекту).

У наступній статті почнемо розбиратися докладніше із Exchanges.

Посилання

Джерело: habr.com

Додати коментар або відгук