RabbitMQ. 1. daļa. Ievads. Erlang, AMQP

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:

RabbitMQ. 1. daļa. Ievads. Erlang, AMQP

  • 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

Protokols darbojas virsū TCP / IP.

Īsi par Erlangu

Projekta pirmkods atrodas repozitorijā vietnē GitHub. Arhitektūra RabbitMQ serveris balstoties uz Erlang un BEAM.

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ē.

RabbitMQ. 1. daļa. Ievads. Erlang, AMQP

Īss darbs RabbitMQ var raksturot šādi:

  1. Izdevējs nosūta ziņojumu konkrētai biržai
  2. 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
  3. Rindā tiek saglabāta atsauce uz šo ziņojumu. Pati ziņojums tiek saglabāts RAM vai diskā
  4. Kad patērētājs ir gatavs saņemt ziņojumu no rindas, serveris izveido ziņojuma kopiju, izmantojot saiti, un nosūta
  5. Patērētājs saņem ziņojumu un nosūta apstiprinājumu brokerim
  6. 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:

RabbitMQ. 1. daļa. Ievads. Erlang, AMQP

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.

RabbitMQ. 1. daļa. Ievads. Erlang, AMQP

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).

Nākamajā rakstā mēs sāksim izprast apmaiņu sīkāk.

atsauces

Avots: www.habr.com

Pievieno komentāru