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

обменник(точка за обмен или обмен) — в нея се изпращат съобщения. Точката за обмен разделяет сообщение в една или повече опашки. Тя маршрутизирует сообщения в очередь на основе созданных связей (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 – извикване на метода 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
