RabbitMQ. 1 dalis. Įvadas. Erlangas, AMQP

Laba diena, Habr! Noriu pasidalinti vadovėliu-žinių žinynu, kurį pavyko surinkti RabbitMQ ir apibendrinti trumpose rekomendacijose bei išvadose.

Turinys

  • RabbitMQ. 1 dalis. Įvadas. Erlang, AMQP ir RPC
  • RabbitMQ. 2 dalis. Mainų supratimas
  • RabbitMQ. 3 dalis. Eilių ir surišimų supratimas
  • RabbitMQ. 4 dalis. Supratimas, kas yra pranešimai ir rėmeliai
  • RabbitMQ. 5 dalis. Pranešimų publikavimas ir vartojimo efektyvumas
  • RabbitMQ. 6 dalis. Federacijos ir kastuvo modulių apžvalga
  • RabbitMQ. 7 dalis. Išsami informacija apie ryšį ir Chanel
  • RabbitMQ. 8 dalis. RabbitMQ .NET
  • RabbitMQ. 9 dalis. Stebėsena

Trumpai apie AMQP

AMQP (Advanced Message Queuing Protocol) yra atviras pranešimų perdavimo tarp sistemos komponentų protokolas. Pagrindinė idėja yra ta, kad atskiros posistemės (arba nepriklausomos programos) gali savavališkai keistis pranešimais per AMQP brokerį, kuris atlieka maršrutą, galbūt garantuoja pristatymą, paskirsto duomenų srautus ir užsiprenumeruoja norimus pranešimų tipus.

Protokolas AMQP pristato tris sąvokas:

RabbitMQ. 1 dalis. Įvadas. Erlangas, AMQP

  • exchange (mainos punktas arba mainai) – į jį siunčiami pranešimai. Mainų taškas platina žinią vienoje ar keliose eilėse. Ji nukreipia pranešimus į eilę remiantis sukurtomis nuorodomis (binding) tarp jo ir eilės
  • queue (eilė) – duomenų struktūra diske arba RAM, kuri saugo nuorodas į žinutes ir pateikia pranešimų kopijas consumers (vartotojams)
  • binding (įpareigojantis) – taisyklė, kuri nurodo mainų taškui, į kurią eilę šie pranešimai turi patekti

Protokolas veikia viršuje TCP / IP.

Trumpai apie Erlangą

Projekto šaltinio kodas yra saugykloje adresu GitHub. Architektūra RabbitMQ serveris remiantis Erlangas ir SPIJA.

Erlang sukūrė įmonė Ericsson devintojo dešimtmečio viduryje kaip paskirstyta, gedimams atspari, realaus laiko sistema, skirta programoms, kurioms reikia 1980 % veikimo laiko. Erlang naudojami įvairiose pramonės šakose ir šiuolaikinėse programose, pvz. WhatsApp. Daugiau galite perskaityti straipsnyje „WhatsApp“ architektūra, kurią „Facebook“ įsigijo už 19 mlrd

Trumpai apie RabbitMQ

TriušisMQ yra atvirojo kodo pranešimų tarpininkas. Jis nukreipia pranešimus pagal visus pagrindinius protokolo principus AMQP aprašyta specifikacijos. RabbitMQ įgyvendina ir papildo protokolą AMQP.

Pagrindinė pranešimų modelio idėja RabbitMQ dalykas yra producer (leidėjas) nesiunčia pranešimų tiesiai į eilę. Tiesą sakant, ir gana dažnai, leidėjas net nežino, ar pranešimas apskritai bus pristatytas į kokią nors eilę.

Vietoj to, leidėjas gali siųsti tik pranešimus biržai. Viena vertus, birža gauna pranešimus iš leidėjų, kita vertus, siunčia juos į eiles. Keitimasis turi tiksliai žinoti, ką daryti su gauta žinute. Ar jis turi būti įtrauktas į konkrečią eilę? Ar jis turėtų būti įtrauktas į kelias eiles? Arba žinutė turėtų būti ignoruojama.

RabbitMQ. 1 dalis. Įvadas. Erlangas, AMQP

Trumpas darbas RabbitMQ galima apibūdinti taip:

  1. Leidėjas siunčia pranešimą konkrečiai biržai
  2. Birža, gavusi pranešimą, nukreipia jį į vieną ar daugiau eilių pagal įpareigojančias taisykles tarp jos ir eilės
  3. Eilėje saugoma nuoroda į šį pranešimą. Pats pranešimas yra saugomas RAM arba diske
  4. Kai vartotojas yra pasirengęs gauti pranešimą iš eilės, serveris per nuorodą sukuria pranešimo kopiją ir išsiunčia
  5. Vartotojas gauna pranešimą ir išsiunčia patvirtinimą brokeriui
  6. Brokeris, gavęs patvirtinimą, pašalina pranešimo kopiją iš eilės. Tada ištrina iš RAM ir disko

RSC

procesas RPC (nuotolinės procedūros skambutis) yra beveik visų sąveikų su branduoliu pagrindas RabbitMQ. Pavyzdžiui, pradinės diskusijos apie kliento sąlygas su RabbitMQ, parodo tam tikrą procesą RPC. Kai ši seka bus baigta, RabbitMQ bus pasirengę priimti užklausas iš kliento:

RabbitMQ. 1 dalis. Įvadas. Erlangas, AMQP

Taip pat specifikacijoje AMQP tiek klientas, tiek serveris gali duoti komandas. Tai reiškia, kad klientas laukia ryšio su serveriu. Komandos yra klasės ir metodai. Pavyzdžiui, Connection.Start – metodo iškvietimas Start klasė Connection.

Ryšys ir kanalai

Norėdami keistis informacija tarp kliento ir serverio, kanalus. Kanalai sukuriami viduje specifinis ryšys. Kiekvienas kanalas yra izoliuotas nuo kitų kanalų. Sinchroniniu atveju kitos komandos vykdyti negalima, kol negaunamas atsakymas.

Kad galėtumėte siųsti komandas lygiagrečiai, turite atidaryti kelis kanalus. Kiekvienas kanalas sukuria atskirą Erlang procesas. Vienas ryšys gali turėti kelis kanalus (multipleksavimas). Kiekvienam kanalui atmintyje yra tam tikros struktūros ir objektai. Todėl kuo daugiau kanalų yra jungtyje, tuo RabbitMQ naudoja daugiau atminties valdyti tokį ryšį.

RabbitMQ. 1 dalis. Įvadas. Erlangas, AMQP

Paprastas pavyzdys, kaip sukurti ryšį ir kanalą naudojant 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 
}

Labai nerekomenduojama atidaryti naują ryšį kiekvienai operacijai sukels didelių išlaidų. Kanalai taip pat turėtų būti nuolatiniai, tačiau dėl daugelio protokolo klaidų kanalas užsidaro, todėl kanalo tarnavimo laikas gali būti trumpesnis nei ryšio.

Kur naudojamas RabbitMQ?

Mikropaslaugų kontekste protokolas AMQP ir jo įgyvendinimas RabbitMQ dažnai naudojamas asinchroninė sąveika tarp paslaugų.

Kontekste IIOT protokolas AMQP ir jo įgyvendinimas RabbitMQ naudojamas duomenų mainams tarp serverių (serveris-serveris). Taip pat naudokite papildinį MQTT įskiepis RabbitMQ kuri yra protokolo įgyvendinimas MQTT duomenims perduoti tarp jutiklio ir serverio mažos spartos, didelės delsos aplinkoje (visas palaikomų protokolų sąrašas pateiktas projekto svetainė).

Kitame straipsnyje mes pradėsime išsamiau suprasti mainus.

Nuorodos

Šaltinis: www.habr.com

Добавить комментарий