Добър ден, Хабр! Искам да споделя учебник-справочник за знанията, които успях да събера по RabbitMQ и да ги съкратя в кратки препоръки и изводи.
Съдържание
- RabbitMQ. Част 1. Въведение. 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 въвежда три понятия:

exchange(точка на обмен или обмен) — там се изпращат съобщения. Точката на обмен разпределя съобщението в една или повече опашки. Тя маршрутизира съобщения в опашка на базата на създадените връзки (binding) между нея и опашкатаqueue(опашка) — структура от данни на диска или в оперативната памет, която съхранява линкове към съобщения и предоставя копия на съобщениятаconsumers(потребители)binding(привързване) — правило, което съобщава на точката на обмен в коя от опашките тези съобщения трябва да попаднат
Протоколът работи върху .
Кратко за Erlang
Изходният код на проекта се намира в репозитория на . Архитектурата е изградена върху и BEAM.
Erlangразработен от компаниятаEricssonв средата на 1980-те години като разпределена, устойчива на отказ система в реално време за приложения, изискващи безотказна работа 99,999%.Erlangприлага се в различни индустрии и съвременни приложения, например в
Кратко за RabbitMQ
– това е брокер на съобщения с отворен код. Той маршрутизира съобщенията според основните принципи на протокола описани в . RabbitMQ реализира и допълва протокола AMQP.
Основната идея на моделът за обмен на съобщения в RabbitMQ е, че producer (издател) не изпраща съобщения директно в опашката. Всъщност, доста често издателят дори не знае дали съобщението ще бъде доставено в някоя опашка.
Вместо това, издателят може да изпраща съобщения само към обмена. От една страна, обменът получава съобщения от издателите, а от друга страна — ги изпраща в опашките. Обменът трябва точно да знае какво да прави с полученото съобщение. Трябва ли то да бъде добавено в определена опашка? Трябва ли да бъде добавено в няколко опашки? Или съобщението трябва да се игнорира.

Работата RabbitMQ може да бъде описана по следния начин:
- Издателят изпраща съобщение на определен обмен
- Обменът, получавайки съобщението, го маршрутизира към една или повече опашки в съответствие с правилата за връзка между него и опашката
- Опашката съхранява връзка към това съобщение. Самото съобщение се съхранява в оперативната памет или на диска
- След като потребителят е готов да получи съобщение от опашката, сървърът създава копие на съобщението по връзката и го изпраща
- Потребителят получава съобщението и изпраща потвърждение на брокера
- Брокерът, получавайки потвърждението, изтрива копието на съобщението от опашката. След това изтрива от оперативната памет и от диска
RPC
Процесс лежи в основата на практически всички взаимодействия с ядрото RabbitMQ. Например, началните обсъждания на условията с клиента RabbitMQ, демонстрира определен процес RPC. След като тази последователност приключи, RabbitMQ ще бъде готов да приема заявки от клиента:

Също така в спецификацията AMQP както клиентът, така и сървърът могат да извикват команди. Това означава, че клиентът очаква взаимодействие със сървъра. Командите - това са класове и методи. Например, Connection.Start – повикване на метода Стартирай клас Connection.
Подключение и канали
За такъв обмен на информация между клиента и сървъра се използват канали. Каналите се създават в контекста на определено свързване. Всеки канал е изолиран от другите канали. В синхронния случай не е възможно да се извърши следващата команда, докато не се получи отговор.
За да имате възможност да изпращате команди паралелно, трябва да отворите няколко канала. Всеки канал създава отделен Erlang процес. Едно свързване може да има множество канали (). За всеки канал съществуват определени структури и обекти в паметта. Следователно, колкото повече канали има в рамките на свързването, толкова повече памет използва RabbitMQ за управление на такова свързване.

Прост пример за създаване на връзка и канал с помощта на :
// ...
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 се използват за обмен на данни между сървъри (сървър-сървър). Използва се и плъгинът който представлява реализация на протокола за предаване на данни между сензор и сървър в среда с ниски скорости и висока латентност (пълният списък на поддържаните протоколи е изброен на ).
В следващата статия ще започнем да разглеждаме по-подробно Exchanges.
Връзки
Източник: habr.com
