Labdien, Habr! Es vēlos dalīties ar mācību grāmatu-uzziņu grāmatu, kuru man izdevās apkopot RabbitMQ un apkopot īsos ieteikumos un secinājumos.
Satura
RabbitMQ. 1. daļa. Ievads. Erlang, AMQP un RPC
RabbitMQ. 2. daļa. Izpratne par apmaiņām
RabbitMQ. 3. daļa. Izpratne par rindām un saistījumiem
RabbitMQ. 4. daļa. Izpratne par ziņojumiem un rāmjiem
RabbitMQ. 5. daļa: Ziņojumu publicēšana un izmantošana
RabbitMQ. 6. daļa. Federācijas un lāpstas moduļu pārskats
RabbitMQ. 7. daļa. Sīkāka informācija par savienojumu un Chanel
RabbitMQ. 8. daļa. RabbitMQ .NET
RabbitMQ. 9. daļa. Uzraudzība
Īsi par AMQP
AMQP (Advanced Message Queuing Protocol) ir atvērts protokols ziņojumu pārsūtīšanai starp sistēmas komponentiem. Pamatideja ir tāda, ka atsevišķas apakšsistēmas (vai neatkarīgas lietojumprogrammas) var apmainīties ar ziņojumiem patvaļīgā veidā, izmantojot AMQP brokeri, kas veic maršrutēšanu, iespējams, garantē piegādi, izplata datu plūsmas un abonē vēlamos ziņojumu veidus.
Protokols AMQP ievieš trīs jēdzienus:
exchange (apmaiņas punkts vai maiņas punkts) - uz to tiek nosūtīti ziņojumi. Maiņas punkts izplata ziņu vienā vai vairākās rindās. Viņa maršrutē ziņojumus uz rindu pamatojoties uz izveidotajām saitēm (binding) starp viņu un rindu
queue (rinda) - datu struktūra diskā vai RAM, kas saglabā saites uz ziņojumiem un izsniedz ziņojumu kopijas consumers (patērētājiem)
binding (saistošs) - noteikums, kas norāda apmaiņas punktam, kurā rindā šiem ziņojumiem jāiet
Erlang izstrādājis uzņēmums Ericsson 1980. gadu vidū kā izkliedēta, pret defektiem izturīga, reāllaika sistēma lietojumprogrammām, kurām nepieciešams 99,999% darbības laiks. Erlang izmanto dažādās nozarēs un mūsdienu lietojumos, piem. WhatsApp. Vairāk varat lasīt rakstā WhatsApp arhitektūra, ko Facebook iegādājās par 19 miljardiem dolāru
Īsi par RabbitMQ
RabbitMQ ir atvērtā koda ziņojumu brokeris. Tas maršrutē ziņojumus saskaņā ar visiem protokola pamatprincipiem AMQP aprakstīts specifikācijas. RabbitMQ ievieš un papildina protokolu AMQP.
Ziņojumapmaiņas modeļa galvenā ideja RabbitMQ lieta ir producer (izdevējs) nesūta ziņojumus tieši uz rindu. Faktiski un diezgan bieži izdevējs pat nezina, vai ziņojums vispār tiks nogādāts kādā rindā.
Tā vietā izdevējs var sūtīt tikai ziņojumus biržai. No vienas puses, apmaiņa saņem ziņojumus no izdevējiem, no otras puses, tā nosūta tos rindās. Apmaiņai precīzi jāzina, ko darīt ar saņemto ziņojumu. Vai tas jāpievieno konkrētai rindai? Vai tas jāpievieno vairākām rindām? Vai arī ziņojums ir jāignorē.
Īss darbs RabbitMQ var raksturot šādi:
Izdevējs nosūta ziņojumu konkrētai biržai
Birža, saņemot ziņojumu, maršrutē to uz vienu vai vairākām rindām saskaņā ar saistošajiem noteikumiem starp to un rindu
Rindā tiek saglabāta atsauce uz šo ziņojumu. Pati ziņojums tiek saglabāts RAM vai diskā
Kad patērētājs ir gatavs saņemt ziņojumu no rindas, serveris izveido ziņojuma kopiju, izmantojot saiti, un nosūta
Patērētājs saņem ziņojumu un nosūta apstiprinājumu brokerim
Brokeris, saņemot apstiprinājumu, noņem ziņojuma kopiju no rindas. Pēc tam izdzēš no RAM un diska
RPC
process RPC (attālās procedūras izsaukums) ir gandrīz visu mijiedarbību ar kodolu pamatā RabbitMQ. Piemēram, sākotnējās diskusijas par klienta noteikumiem ar RabbitMQ, parāda noteiktu procesu RPC. Kad šī secība ir pabeigta, RabbitMQ būs gatavs pieņemt pieprasījumus no klienta:
Arī specifikācijā AMQP gan klients, gan serveris var izdot komandas. Tas nozīmē, ka klients gaida, lai sazinātos ar serveri. Komandas ir klases un metodes. Piemēram, Connection.Start – metodes izsaukums Start klase Connection.
Savienojums un kanāli
Šādai informācijas apmaiņai starp klientu un serveri, kanālus. Kanāli tiek izveidoti iekšā konkrēts savienojums. Katrs kanāls ir izolēts no citiem kanāliem. Sinhronā gadījumā nākamo komandu nav iespējams izpildīt, kamēr nav saņemta atbilde.
Lai komandas varētu nosūtīt paralēli, ir jāatver vairāki kanāli. Katrs kanāls izveido atsevišķu Erlang process. Vienam savienojumam var būt vairāki kanāli (multipleksēšana). Katram kanālam atmiņā ir noteiktas struktūras un objekti. Tāpēc, jo vairāk kanālu ir savienojumā, jo RabbitMQ izmanto vairāk atmiņas lai pārvaldītu šādu savienojumu.
Vienkāršs piemērs savienojuma un kanāla izveidei, izmantojot 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
}
Jauna savienojuma atvēršana katrai darbībai nav ieteicama radīs lielas izmaksas. Kanāliem arī jābūt pastāvīgiem, taču daudzu protokola kļūdu dēļ kanāls tiek aizvērts, tāpēc kanāla kalpošanas laiks var būt īsāks nekā savienojuma kalpošanas laiks.
Kur tiek izmantots RabbitMQ?
Mikropakalpojumu kontekstā protokols AMQP un tā ieviešana RabbitMQ bieži izmanto asinhronā mijiedarbība starp pakalpojumiem.
Kontekstā IIOT protokols AMQP un tā ieviešana RabbitMQ izmanto datu apmaiņai starp serveriem (serveris-serveris). Izmantojiet arī spraudni MQTT spraudnis RabbitMQ kas ir protokola īstenošana MQTT datu pārsūtīšanai starp sensoru un serveri zema ātruma, liela latentuma vidēs (pilns atbalstīto protokolu saraksts ir norādīts vietnē projekta vietne).