Sveiki, Habr! VÄlos dalÄ«ties ar manu apmÄcÄ«bu-rokasgrÄmatu, kuru esmu izstrÄdÄjis, pamatojoties uz RabbitMQ un apkopojis Ä«sÄs rekomendÄcijÄs un secinÄjumos.
Saturs
- RabbitMQ. 1. daļa. Ievads. Erlang, AMQP un RPC
- RabbitMQ. 2. daļa. ApskatÄm Exchanges
- RabbitMQ. 3. daļa. ApskatÄm Rindas un Bindings
- RabbitMQ. 4. daļa. SÄkam izprast, kas ir ziÅas un ietvari
- RabbitMQ. 5. daļa. ZiÅu publicÄÅ”anas un patÄriÅa veiktspÄja
- RabbitMQ. 6. daļa. Moduļu Federation un Shovel pÄrskats
- RabbitMQ. 7. daļa. DetalizÄti par Savienojumu un KanalizÄciju
- RabbitMQ. 8. daļa. RabbitMQ .NET vidÄ
- RabbitMQ. 9. daļa. Uzraudzība
ÄŖsi par AMQP
AMQP (Advanced Message Queuing Protocol) ir atvÄrts protokols ziÅu pÄrsÅ«tīŔanai starp sistÄmas komponentiem. GalvenÄ ideja ir tÄda, ka atseviŔķas apakÅ”sistÄmas (vai neatkarÄ«gas lietojumprogrammas) var apmainÄ«ties ar ziÅÄm, izmantojot AMQP brokeri, kas nodroÅ”ina marÅ”rutÄÅ”anu, iespÄjams, garantÄ piegÄdi, datu plÅ«smu sadalīŔanu, abonÄÅ”anu uz nepiecieÅ”amajiem ziÅu veidiem.
Protokols AMQP ievieÅ” trÄ«s jÄdzienus:

apmaiÅa(apmaiÅas punkts vai apmaiÅa) ā tajÄ tiek nosÅ«tÄ«tas ziÅas. ApmaiÅas punkts izdala ziÅu ieliek vienÄ vai vairÄkÄs rindÄs. Tas marÅ”rutÄ ziÅas rindÄ balstoties uz izveidotajÄm saitÄm (binding) starp to un rinduqueue(rinda) ā datu struktÅ«ra uz diskÄ vai operatÄ«vajÄ atmiÅÄ, kas uzglabÄ ziÅu saites un nodod ziÅu kopijasconsumers(patÄrÄtÄjiem)binding(saistīŔana) ā noteikums, kas norÄda apmaiÅas punktam, uz kuru no rindÄm Ŕīs ziÅas jÄnonÄk
Protokols darbojas virs .
ÄŖsi par Erlang
Projekta avota kods atrodas repozitorijÄ uz . ArhitektÅ«ra balstÄs uz un BEAM.
Erlangtika izstrÄdÄta uzÅÄmumÄEricsson1980. gadu vidÅ« kÄ sadalÄ«ta, noturÄ«ga, reÄllaika sistÄma lietojumprogrammÄm, kas prasa bezatliktÄ«go darbÄ«bu 99,999%.Erlangtiek izmantota dažÄdÄs nozarÄs un mÅ«sdienu lietojumprogrammÄm, piemÄram:
ÄŖsi par RabbitMQ
ā tas ir atvÄrtÄ koda ziÅu brokeris. Tas marÅ”rutÄ ziÅas saskaÅÄ ar visiem pamatprincipiem protokola aprakstÄ«ts . RabbitMQ Ä«steno un papildina protokolu AMQP.
GalvenÄ ideja ziÅu apmaiÅas modelÄ« RabbitMQ ir tÄda, ka producer (izdevÄjs) neizsÅ«ta ziÅas tieÅ”i rindÄ. PatiesÄ«bÄ un diezgan bieži izdevÄjs pat nezina, vai ziÅa vispÄr tiks piegÄdÄta kÄdÄ rindÄ.
TÄ vietÄ izdevÄjs var nosÅ«tÄ«t ziÅojumus tikai uz apmaiÅu. No vienas puses, apmaiÅa saÅem ziÅojumus no izdevÄjiem, bet no otras puses ā 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 tam jÄbÅ«t pievienotam vairÄkÄm rindÄm? Vai ziÅojums ir jÄignorÄ?

DarboÅ”anÄs Ä«sumÄ RabbitMQ var tikt raksturota Å”Ädi:
- IzdevÄjs nosÅ«ta ziÅojumu noteiktai apmaiÅai
- ApmaiÅa, saÅemot ziÅojumu, marÅ”rutÄ to uz vienu vai vairÄkÄm rindÄm saskaÅÄ ar piesaistes noteikumiem starp to un rindu
- Rinda glabÄ atsauci uz Å”o ziÅojumu. Pats ziÅojums tiek glabÄts operatÄ«vajÄ atmiÅÄ vai diskÄ
- Kad patÄrÄtÄjs ir gatavs saÅemt ziÅojumu no rindas, serveris izveido ziÅojuma kopiju pÄc atsauces un nosÅ«ta
- PatÄrÄtÄjs saÅem ziÅojumu un nosÅ«ta brokerim apstiprinÄjumu
- Brokeris, saÅemot apstiprinÄjumu, izdzÄÅ” ziÅojuma kopiju no rindas. PÄc tam izdzÄÅ” to no operatÄ«vÄs atmiÅas un no diska
RPC
Process ir pamats praktiski visÄm mijiedarbÄ«bÄm ar kodolu RabbitMQ. PiemÄram, sÄkotnÄjÄs sarunas par klienta nosacÄ«jumiem ar RabbitMQ, demonstrÄ noteiktu procesu RPC. Kad Ŕī secÄ«ba tiks pabeigta, RabbitMQ bÅ«s gatavs pieÅemt pieprasÄ«jumus no klienta:

TÄpat specifikÄcijÄ AMQP gan klients, gan serveris var izsaukt komandas. Tas nozÄ«mÄ, ka klients gaida mijiedarbÄ«bu ar serveri. Komandas ir klasÄm un metodÄm. PiemÄram, Connection.Start ā metodes izsaukums Start klase Connection.
Savienojums un kanÄli
Å Ädai informÄcijas apmaiÅai starp klientu un serveri tiek izmantoti kanÄli. KanÄli tiek izveidoti noteikta savienojuma ietvaros . Katrs kanÄls ir izolÄts no citiem kanÄliem. SinhronizÄtÄ gadÄ«jumÄ nav iespÄjams izpildÄ«t nÄkamo komandu, pirms nav saÅemta atbilde.Lai varÄtu nosÅ«tÄ«t komandas paralÄli, jÄnopenÅ” vairÄkus kanÄlus. Katrs kanÄls izveido atseviŔķu
procesu. Vienam savienojumam var bÅ«t daudzi kanÄli ( Erlang multiplexingvairÄk atmiÅas izmanto RabbitMQ Å”Ädas savienojuma pÄrvaldÄ«bai. VienkÄrÅ”s piemÄrs savienojuma un kanÄla izveidoÅ”anai, izmantojot

VienkÄrÅ”s piemÄrs, kÄ izveidot savienojumu un kanÄlu, izmantojot :
// ...
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
}Jaunu savienojumu atvÄrt katrai operÄcijai ir stingri ieteicams neizdarÄ«t, jo tas izraisÄ«s lielas izmaksas. KanÄliem arÄ« jÄbÅ«t pastÄvÄ«giem, taÄu daudzas protokola kļūdas noved pie kanÄla slÄgÅ”anas, tÄdÄļ kanÄla kalpoÅ”anas laiks var bÅ«t Ä«sÄks nekÄ savienojumam.
Kur tiek izmantots RabbitMQ?
Mikroservisu kontekstÄ protokolu AMQP un tÄ realizÄciju RabbitMQ bieži izmanto, lai veiktu asinkronu mijiedarbÄ«bu starp pakalpojumiem.
KontekstÄ IIOT protokols AMQP un tÄ realizÄciju RabbitMQ to izmanto datu apmaiÅai starp serveriem (serveris-serverim). ArÄ« izmanto papildinÄjumu kas ir protokola realizÄcija datu nodoÅ”anai starp sensoru un serveri zemu Ätrumu vidÄ ar augstu latentumu (pilns atbalstÄ«to protokolu saraksts norÄdÄ«ts ).
NÄkamajÄ rakstÄ sÄksim dziļÄk izpÄtÄ«t Exchanges.
Saites
Avots: habr.com
