Hyvää iltapäivää, Habr! Haluan jakaa oppikirja-tietokirjan, jonka olen onnistunut keräämään RabbitMQ ja tiivistää lyhyiksi suosituksiksi ja johtopäätöksiksi.
sisällysluettelo
RabbitMQ. Osa 1. Johdanto. Erlang, AMQP ja RPC
RabbitMQ. Osa 2. Vaihdon ymmärtäminen
RabbitMQ. Osa 3. Jonojen ja sidosten ymmärtäminen
RabbitMQ. Osa 4. Viestien ja kehysten ymmärtäminen
RabbitMQ. Osa 5: Viestien julkaisu ja kuluttaminen
RabbitMQ. Osa 6. Yleiskatsaus liittämiseen ja lapiomoduuliin
RabbitMQ. Osa 7. Tiedot Connectionista ja Chanelista
RabbitMQ. Osa 8. RabbitMQ .NET:ssä
RabbitMQ. Osa 9. Valvonta
Lyhyesti AMQP:stä
AMQP (Advanced Message Queuing Protocol) on avoin protokolla viestien välittämiseen järjestelmäkomponenttien välillä. Perusajatuksena on, että yksittäiset alijärjestelmät (tai itsenäiset sovellukset) voivat vaihtaa viestejä mielivaltaisella tavalla AMQP-välittäjän kautta, joka suorittaa reitityksen, mahdollisesti takaa toimituksen, jakaa tietovirtoja ja tilaa halutut viestityypit.
protokolla AMQP esittelee kolme käsitettä:
exchange (vaihtopiste tai vaihto) - siihen lähetetään viestejä. Vaihtopiste jakaa viestin yhdessä tai useammassa jonossa. Hän reitittää viestit jonoon luotujen linkkien perusteella (binding) hänen ja jonon välillä
queue (jono) - levyllä tai RAM-muistissa oleva tietorakenne tallentaa linkkejä viesteihin ja antaa kopioita viesteistä consumers (kuluttajille)
binding (sitova) - sääntö, joka kertoo vaihtopisteelle, mihin jonoon näiden viestien tulee mennä
Erlang yrityksen kehittämä Ericsson 1980-luvun puolivälissä hajautettu, vikasietoinen, reaaliaikainen järjestelmä sovelluksille, jotka vaativat 99,999 % käyttöaikaa. Erlang käytetään eri teollisuudenaloilla ja nykyaikaisissa sovelluksissa, mm. WhatsApp. Voit lukea lisää artikkelista WhatsApp-arkkitehtuuri, jonka Facebook osti 19 miljardilla dollarilla
Lyhyesti RabbitMQ:sta
RabbitMQ on avoimen lähdekoodin viestivälittäjä. Se reitittää viestit protokollan kaikkia perusperiaatteita pitkin AMQP kuvattu kohdassa tekniset tiedot. RabbitMQ toteuttaa ja täydentää protokollaa AMQP.
Viestimallin pääidea sisään RabbitMQ asia on producer (julkaisija) ei lähetä viestejä suoraan jonoon. Itse asiassa, ja melko usein, julkaisija ei edes tiedä, toimitetaanko viesti ollenkaan mihinkään jonoon.
Sen sijaan julkaisija voi lähettää vain viestejä keskukselle. Toisaalta keskus vastaanottaa viestejä julkaisijoilta ja toisaalta lähettää ne jonoihin. Pörssin on tiedettävä tarkalleen, mitä tehdä vastaanottamansa viestin kanssa. Pitäisikö se lisätä tiettyyn jonoon? Pitäisikö se lisätä useisiin jonoihin? Tai viesti tulee jättää huomiotta.
Lyhyt työ RabbitMQ voidaan kuvata seuraavasti:
Kustantaja lähettää viestin tiettyyn vaihtoon
Vastaanotettuaan viestin keskus reitittää sen yhteen tai useampaan jonoon sen ja jonon välisten sitovien sääntöjen mukaisesti
Jono tallentaa viittauksen tähän viestiin. Itse viesti on tallennettu RAM-muistiin tai levylle
Kun kuluttaja on valmis vastaanottamaan viestin jonosta, palvelin luo viestistä kopion linkin kautta ja lähettää
Kuluttaja vastaanottaa viestin ja lähettää vahvistuksen välittäjälle
Välittäjä, saatuaan vahvistuksen, poistaa kopion viestistä jonosta. Poistaa sitten RAM-muistista ja levyltä
RPC
prosessi RPC (etämenettelykutsu) on lähes kaikkien vuorovaikutusten taustalla ytimen kanssa RabbitMQ. Esimerkiksi alustavia keskusteluja asiakkaan ehdoista RabbitMQ, osoittaa tietyn prosessin RPC. Kun tämä sarja on valmis, RabbitMQ on valmis ottamaan vastaan asiakkaan pyyntöjä:
Myös erittelyssä AMQP sekä asiakas että palvelin voivat antaa komentoja. Tämä tarkoittaa, että asiakas odottaa yhteydenpitoa palvelimen kanssa. Komennot ovat luokkia ja menetelmiä. Esimerkiksi, Connection.Start - menetelmäkutsu Start luokka Connection.
Yhteys ja kanavat
Tällaista tiedonvaihtoa varten asiakkaan ja palvelimen välillä kanavia. Kanavat luodaan sisällä tietty yhteys. Jokainen kanava on eristetty muista kanavista. Synkronisessa tapauksessa ei ole mahdollista suorittaa seuraavaa komentoa ennen kuin vastaus on vastaanotettu.
Jotta voit lähettää komentoja rinnakkain, sinun on avattava useita kanavia. Jokainen kanava luo erillisen Erlang käsitellä asiaa. Yhdellä yhteydellä voi olla useita kanavia (multiplexing). Jokaiselle kanavalle on muistissa tiettyjä rakenteita ja objekteja. Siksi mitä enemmän kanavia yhteyden sisällä on, sitä RabbitMQ käyttää enemmän muistia hallita tällaista yhteyttä.
Yksinkertainen esimerkki yhteyden ja kanavan luomisesta käyttämällä 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
}
Uuden yhteyden avaamista jokaiselle toiminnolle ei suositella johtaa korkeisiin kustannuksiin. Kanavien tulee myös olla pysyviä, mutta monet protokollavirheet aiheuttavat kanavan sulkeutumisen, joten kanavan käyttöikä voi olla lyhyempi kuin yhteyden.
Missä RabbitMQ:ta käytetään?
Mikropalvelujen yhteydessä protokolla AMQP ja sen täytäntöönpano vuonna RabbitMQ käytetään usein asynkroninen vuorovaikutus palveluiden välillä.
Yhteydessä IIOT protokollaa AMQP ja sen täytäntöönpano vuonna RabbitMQ käytetään tiedonvaihtoon palvelimien välillä (palvelin-palvelin). Käytä myös laajennusta MQTT Plugin RabbitMQ joka on protokollan toteutus MQTT tiedon siirtämiseen anturin ja palvelimen välillä hitaissa, korkean viiveen ympäristöissä (täydellinen luettelo tuetuista protokollista on lueteltu osoitteessa projektisivusto).
Seuraavassa artikkelissa alamme ymmärtää vaihtoja yksityiskohtaisemmin.