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

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

Таблица на съдържанието

  • RabbitMQ. Част 1. Въведение. Erlang, AMQP и RPC
  • RabbitMQ. Част 2. Разбиране на борсите
  • RabbitMQ. Част 3. Разбиране на опашки и свързвания
  • 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. Въведение. Erlang, AMQP

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

Протоколът се изпълнява TCP / IP.

Накратко за Erlang

Изходният код на проекта се намира в хранилището на GitHub. Архитектура rabbitmq-сървър базиран на Ерланг и 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. Опашката съхранява връзка към това съобщение. Самото съобщение се съхранява в RAM или на диск
  4. Веднага след като потребителят е готов да получи съобщение от опашката, сървърът създава копие на съобщението чрез препратка и изпраща
  5. Потребителят получава съобщението и изпраща потвърждение на брокера
  6. Брокерът, след като получи потвърждение, премахва копие на съобщението от опашката. След това изтрива от RAM и от диска

RPC

процес RPC (извикване на отдалечена процедура) лежи в основата на почти всички взаимодействия с ядрото 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 плъгин RabbitMQ което е изпълнение на протокола MQTT за прехвърляне на данни между сензор и сървър в среди с ниска скорост и висока латентност (за пълен списък на поддържаните протоколи вж. сайт на проекта).

В следващата статия ще започнем да разбираме по-подробно борсите.

Позоваването

Източник: www.habr.com

Добавяне на нов коментар