Goeiemiddei, Habr! Ik wol in learboek-referinsjeboek fan kennis diele wêrop ik slagge om te sammeljen RabbitMQ en kondinsearje yn koarte oanbefellings en konklúzjes.
Ynhâldsopjefte
RabbitMQ. Diel 1. Ynlieding. Erlang, AMQP en RPC
RabbitMQ. Diel 2. Understanding Exchanges
RabbitMQ. Diel 3. Ferstean wachtrijen en bindingen
RabbitMQ. Diel 4. Begryp wat berjochten en frames binne
RabbitMQ. Diel 5: Publisearjen en konsumearje berjochtprestaasjes
RabbitMQ. Diel 6. Oersjoch fan de Federaasje en Shovel Modules
RabbitMQ. Diel 7. Details oer Ferbining en Chanel
RabbitMQ. Diel 8. RabbitMQ yn .NET
RabbitMQ. Diel 9. Monitoring
Koart oer AMQP
AMQP (Advanced Message Queuing Protocol) is in iepen protokol foar it ferstjoeren fan berjochten tusken systeemkomponinten. It basisidee is dat yndividuele subsystemen (as selsstannige applikaasjes) berjochten op in willekeurige manier útwikselje kinne fia in AMQP-makelaar, dy't routing útfiert, mooglik levering garandearret, datastreamen ferspriedt en abonnearret op de winske berjochttypen.
Protokol AMQP yntrodusearret trije begripen:
exchange (wikselpunt of útwikseling) - berjochten wurde stjoerd nei it. Wisselpunt ferspraat it berjocht yn ien of mear wachtrigen. Sy stjoert berjochten nei in wachtrige basearre op oanmakke keppelings (binding) tusken him en de wachtrige
queue (wachtrige) - in gegevens struktuer op skiif of yn RAM dat bewarret keppelings nei berjochten en jout kopyen fan berjochten consumers (oan konsuminten)
binding (binend) - in regel dy't fertelt it útwikselpunt yn hokker wachtrige dizze berjochten moatte gean
Erlang ûntwikkele troch it bedriuw Ericsson yn 'e midden fan' e jierren '1980 as in ferspraat, fouttolerant, real-time systeem foar applikaasjes dy't 99,999% uptime nedich binne. Erlang brûkt yn ferskate yndustry en moderne tapassingen, f.eks. WhatsApp. Jo kinne mear lêze yn it artikel WhatsApp-arsjitektuer, dy't Facebook kocht foar $ 19 miljard
Koart oer RabbitMQ
Konyn MQ is in iepen boarne berjochtmakelaar. It rûtes berjochten lâns alle basisprinsipes fan it protokol AMQP beskreaun yn spesifikaasjes. RabbitMQ ymplemintearret en oanfolling it protokol AMQP.
It haadidee fan it messagingmodel yn RabbitMQ ding is producer (útjouwer) stjoert gjin berjochten direkt nei de wachtrige. Yn feite, en frij faak, de útjouwer wit net iens oft it berjocht sil wurde levere oan alle wachtrige.
Ynstee dêrfan kin de útjouwer allinich berjochten stjoere nei de útwikseling. Oan 'e iene kant ûntfangt de útwikseling berjochten fan útjouwers, en oan' e oare kant stjoert it se nei wachtrige. De útwikseling moat krekt witte wat te dwaan mei it berjocht dat it krijt. Moat it tafoege wurde oan in spesifike wachtrige? Moat it tafoege wurde oan meardere wachtrigen? Of it berjocht moat wurde negearre.
Koarte wurk RabbitMQ kin as folget beskreaun wurde:
De útjouwer stjoert in berjocht nei in spesifike útwikseling
In útwikseling, nei't in berjocht ûntfongen is, stjoert it nei ien of mear wachtrigen yn oerienstimming mei de binende regels tusken har en de wachtrige
De wachtrige bewarret in ferwizing nei dit berjocht. It berjocht sels wurdt opslein yn RAM of op skiif
As de konsumint ree is om in berjocht út 'e wachtrige te ûntfangen, makket de tsjinner in kopy fan it berjocht fia de keppeling en stjoert
De konsumint ûntfangt it berjocht en stjoert befêstiging nei de makelder
De makelder, by ûntfangst fan befêstiging, ferwideret in kopy fan it berjocht út 'e wachtrige. Dan wisket út RAM en skiif
CPR
proses RPC (oprop op ôfstân) leit oan hast alle ynteraksjes mei de kearn RabbitMQ. Bygelyks, earste diskusjes oer de betingsten fan de klant mei RabbitMQ, toant in bepaald proses RPC. Sadree't dizze folchoarder is foltôge, RabbitMQ sil ree wêze om oanfragen fan 'e kliïnt te akseptearjen:
Ek yn 'e spesifikaasje AMQP sawol de client as de tsjinner kinne kommando's útjaan. Dit betsjut dat de kliïnt wachtet om te kommunisearjen mei de tsjinner. Kommando's binne klassen en metoaden. Bygelyks, Connection.Start - metoade oprop Start klasse Connection.
Ferbining en kanalen
Foar sokke ynformaasje-útwikseling tusken kliïnt en tsjinner, kanalen. Kanalen wurde makke binnen spesifike ferbining. Elk kanaal is isolearre fan oare kanalen. Yn it syngroane gefal is it net mooglik om it folgjende kommando út te fieren oant in antwurd ûntfongen is.
Om kommando's parallel te stjoeren, moatte jo ferskate kanalen iepenje. Elk kanaal makket in aparte Erlang proses. Ien ferbining kin meardere kanalen hawwe (multiplexing). Foar elk kanaal binne d'r bepaalde struktueren en objekten yn it ûnthâld. Dêrom, de mear kanalen binne der binnen in ferbining, de RabbitMQ brûkt mear ûnthâld om sa'n ferbining te behearjen.
In ienfâldich foarbyld fan it meitsjen fan in ferbining en kanaal mei help 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
}
It iepenjen fan in nije ferbining foar elke operaasje wurdt sterk ûntmoedige as dit sil liede ta hege kosten. Kanalen moatte ek persistint wêze, mar in protte protokolflaters feroarsaakje it kanaal te sluten, sadat it libben fan it kanaal koarter wêze kin as dy fan 'e ferbining.
Wêr wurdt RabbitMQ brûkt?
Yn 'e kontekst fan mikrotsjinsten, it protokol AMQP en de útfiering dêrfan yn RabbitMQ faak brûkt foar asynchrone ynteraksje tusken tsjinsten.
Yn de kontekst IIOT protokol AMQP en de útfiering dêrfan yn RabbitMQ brûkt foar gegevensútwikseling tusken servers (server-tsjinner). Brûk ek de plugin MQTT Plugin RabbitMQ dat is in ymplemintaasje fan it protokol MQTT foar it oerdragen fan gegevens tusken sensor en tsjinner yn omjouwings mei lege snelheid, hege latency (in folsleine list mei stipe protokollen is fermeld op projekt webside).
Yn it folgjende artikel sille wy begjinne te begripen Exchanges yn mear detail.