RabbitMQ. Част 1. Въведение. Erlang, AMQP

Добър ден, Хабр! Искам да споделя справочник с знания, които успях да събера по RabbitMQ и да ги стисна в кратки препоръки и заключения.

Съдържание

  • RabbitMQ. Часть 1. Введение. Erlang, AMQP и RPC
  • RabbitMQ. Част 2. Разглеждаме Exchanges
  • RabbitMQ. Часть 3. Разбираемся с очередями и привязками
  • RabbitMQ. Част 4. Разглеждаме какво представляват съобщенията и фреймовете.
  • RabbitMQ. Часть 5. Производительность публикации и потребления сообщений
  • RabbitMQ. Часть 6. Обзор модулей Federation и Shovel
  • RabbitMQ. Часть 7. Подробно про Connection и Chanел
  • RabbitMQ. Часть 8. RabbitMQ в .NET
  • RabbitMQ. Часть 9. Мониторинг

Кратко за AMQP

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

Протокол AMQP въвежда три понятия:

RabbitMQ. Част 1. Въведение. Erlang, AMQP

  • обменник (точка за обмен или обмен) — в нея се изпращат съобщения. Точката за обмен разделяет сообщение в една или повече опашки. Тя маршрутизирует сообщения в очередь на основе созданных связей (binding) между нея и опашката
  • queue (опашка) — структура от данни на диска или в оперативната памет, която съхранява линкове към съобщенията и предоставя копия на съобщенията consumers (консуматорите)
  • binding (привързване) — правило, което уведомява точката за обмен в коя от опашките тези съобщения трябва да попадат.

Протоколът работи над TCP/IP.

Кратко за Erlang

Изходният код на проекта се намира в хранилището на GitHub. Архитектурата RabbitMQ-server е основана на Erlang и BEAM.

Erlang разработен от компанията Ericsson в средата на 1980-те години като разпределена, отказоустойчива, система в реално време за приложения, изискващи безотказна работа 99,999%. Erlang приложими в различни отрасли и съвременни приложения, например в WhatsApp. Повече информация можете да прочетете в статията архитектура на WhatsApp, която Facebook купи за 19 милиарда долара.

Кратко за RabbitMQ

RabbitMQ – това е брокер на съобщения с отворен код. Той маршрутизира съобщенията според основните принципи на протокола AMQP описани в спецификация. RabbitMQ реализира и допълва протокола. AMQP.

Основната идея на модела за обмен на съобщения в RabbitMQ е, че producer (издател) не изпраща съобщения директно в опашката. Всъщност, и много често издателят дори не знае дали съобщението изобщо ще бъде доставено в някоя опашка.

Вместо това издателят може да изпраща съобщения само на обмена. От една страна, обменът получава съобщения от издателите, а от друга страна — ги изпраща в опашките. Обменът трябва точно да знае какво да прави с полученото съобщение. Трябва ли да бъде добавено в определена опашка? Трябва ли да бъде добавено в няколко опашки? Или съобщението трябва да бъде игнорирано.

RabbitMQ. Част 1. Въведение. Erlang, AMQP

Работата в кратце RabbitMQ може да бъде описана по следния начин:

  1. Издателят изпраща съобщение на определен обмен
  2. Обменът, получавайки съобщението, маршрутизира го в една или няколко опашки в съответствие с правилата за свързване между него и опашката
  3. Опашката съхранява връзка към това съобщение. Самото съобщение се съхранява в оперативната памет или на диска
  4. Щом потребителят е готов да получи съобщение от опашката, сървърът създава копие на съобщението по връзката и го изпраща
  5. Потребителят получава съобщението и изпраща потвърждение на брокера
  6. Брокерът, получавайки потвърждението, изтрива копието на съобщението от опашката. След това изтрива от оперативната памет и от диска

RPC

Процес RPC (remote procedure call) е в основата на почти всички взаимодействия с ядрото RabbitMQ. Например, началните обсъждания на условията на клиента с RabbitMQ, демонстрира определен процес RPC. Щом последователността приключи, RabbitMQ той ще бъде готов да приема запитвания от клиента:

RabbitMQ. Част 1. Въведение. Erlang, AMQP

Също така в спецификацията AMQP както клиентът, така и сървърът могат да извикват команди. Това означава, че клиентът очаква взаимодействие със сървъра. Командите са класове и методи. Например, Connection.Start – извикване на метода Start клас Connection.

Подключване и канали

За такова обменяне на информация между клиента и сървъра се използват канали. Каналите се създават в рамките на определено свързване. Всеки канал е изолиран от другите канали. В синхронния случай не е възможно да се извърши следващата команда, докато не бъде получен отговор.

За да може да изпраща команди паралелно, е необходимо да се отворят няколко канала. Всеки канал създава отделен Erlang процес. Едно свързване може да има множество канали (мултиплексиране). За всеки канал съществуват определени структури и обекти в паметта. Затова колкото повече канали има в рамките на свързването, толкова повече памет използва RabbitMQ за управление на такова свързване.

RabbitMQ. Част 1. Въведение. 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

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster