God eftermiddag, Habr! Jeg vil gerne dele en lærebog-referencebog med viden, som jeg formåede at samle på RabbitMQ og kondensere til korte anbefalinger og konklusioner.
indholdsfortegnelse
RabbitMQ. Del 1. Introduktion. Erlang, AMQP og RPC
RabbitMQ. Del 2. Forståelse af udvekslinger
RabbitMQ. Del 3. Forstå køer og bindinger
RabbitMQ. Del 4. Forstå, hvad budskaber og rammer er
RabbitMQ. Del 5: Udgivelse og forbrug af budskabsydelse
RabbitMQ. Del 6. Oversigt over forbunds- og skovlmodulerne
RabbitMQ. Del 7. Detaljer om Connection og Chanel
RabbitMQ. Del 8. RabbitMQ i .NET
RabbitMQ. Del 9. Overvågning
Kort om AMQP
AMQP (Advanced Message Queuing Protocol) er en åben protokol til transmission af meddelelser mellem systemkomponenter. Grundtanken er, at individuelle undersystemer (eller uafhængige applikationer) kan udveksle beskeder på en vilkårlig måde gennem en AMQP-mægler, som udfører routing, eventuelt garanterer levering, distribuerer datastrømme og abonnerer på de ønskede beskedtyper.
protokol AMQP introducerer tre begreber:
exchange (udvekslingspunkt eller udveksling) - beskeder sendes til det. Udskiftningspunkt distribuerer budskabet i en eller flere køer. Hun dirigerer beskeder til en kø baseret på oprettede links (binding) mellem ham og køen
queue (kø) - en datastruktur på disk eller i RAM, der gemmer links til beskeder og giver kopier af beskeder consumers (til forbrugere)
binding (bindende) - en regel, der fortæller udvekslingspunktet, hvilken kø disse beskeder skal stå i
Erlang udviklet af virksomheden Ericsson i midten af 1980'erne som et distribueret, fejltolerant, realtidssystem til applikationer, der kræver 99,999 % oppetid. Erlang bruges i forskellige industrier og moderne applikationer, f.eks. WhatsApp. Du kan læse mere i artiklen WhatsApp-arkitektur, som Facebook købte for 19 mia
Kort om RabbitMQ
RabbitMQ er en open source-meddelelsesmægler. Det dirigerer beskeder langs alle protokollens grundlæggende principper AMQP beskrevet i specifikationer. RabbitMQ implementerer og supplerer protokollen AMQP.
Hovedidéen med meddelelsesmodellen i RabbitMQ ting er producer (udgiver) sender ikke beskeder direkte til køen. Faktisk, og ganske ofte, ved udgiveren ikke engang, om beskeden overhovedet bliver leveret til nogen kø.
I stedet kan udgiveren kun sende beskeder til børsen. På den ene side modtager børsen beskeder fra udgivere, og på den anden side sender den dem i kø. Udvekslingen skal vide præcis, hvad den skal gøre med den besked, den modtager. Skal det føjes til en bestemt kø? Skal det føjes til flere køer? Eller beskeden skal ignoreres.
Kort arbejde RabbitMQ kan beskrives som følger:
Udgiveren sender en besked til en bestemt børs
En central, der har modtaget en besked, dirigerer den til en eller flere køer i overensstemmelse med de bindende regler mellem den og køen
Køen gemmer en reference til denne besked. Selve beskeden er gemt i RAM eller på disk
Når forbrugeren er klar til at modtage en besked fra køen, opretter serveren en kopi af beskeden via linket og sender
Forbrugeren modtager beskeden og sender en bekræftelse til mægleren
Mægleren fjerner, efter at have modtaget bekræftelse, en kopi af beskeden fra køen. Sletter derefter fra RAM og disk
RPC
Процесс RPC (remote procedure call) ligger til grund for næsten alle interaktioner med kernen RabbitMQ. Eksempelvis indledende drøftelser om klientens vilkår med RabbitMQ, demonstrerer en bestemt proces RPC. Når denne sekvens er fuldført, RabbitMQ vil være klar til at acceptere anmodninger fra kunden:
Også i specifikationen AMQP både klienten og serveren kan udstede kommandoer. Det betyder, at klienten venter på at kommunikere med serveren. Kommandoer er klasser og metoder. For eksempel, Connection.Start – metodekald Start klasse Connection.
Tilslutning og kanaler
For sådan informationsudveksling mellem klient og server, kanaler. Kanaler oprettes indeni specifik forbindelse. Hver kanal er isoleret fra andre kanaler. I det synkrone tilfælde er det ikke muligt at udføre den næste kommando, før der modtages et svar.
For at kunne sende kommandoer parallelt, skal du åbne flere kanaler. Hver kanal opretter en separat Erlang behandle. En forbindelse kan have flere kanaler (multiplexing). For hver kanal er der visse strukturer og objekter i hukommelsen. Derfor, jo flere kanaler der er inden for en forbindelse, jo RabbitMQ bruger mere hukommelse at administrere en sådan forbindelse.
Et simpelt eksempel på at skabe en forbindelse og kanal ved hjælp af 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
}
Det frarådes på det kraftigste at åbne en ny forbindelse for hver operation vil føre til høje omkostninger. Kanaler bør også være vedvarende, men mange protokolfejl får kanalen til at lukke, så kanalens levetid kan være kortere end forbindelsens.
Hvor bruges RabbitMQ?
I forbindelse med mikrotjenester, protokollen AMQP og dens implementering i RabbitMQ ofte brugt til asynkron interaktion mellem tjenester.
I sammenhæng IIOT protokol AMQP og dens implementering i RabbitMQ bruges til dataudveksling mellem servere (server-server). Brug også plugin'et MQTT-plugin RabbitMQ som er en implementering af protokollen MQTT til overførsel af data mellem sensor og server i miljøer med lav hastighed og høj latens (en komplet liste over understøttede protokoller er vist på projektets hjemmeside).
I den næste artikel vil vi begynde at forstå Exchanges mere detaljeret.