God ettermiddag, Habr! Jeg vil dele en lærebok-referansebok med kunnskap som jeg klarte å samle på RabbitMQ og kondensere til korte anbefalinger og konklusjoner.
innholdsfortegnelsen
RabbitMQ. Del 1. Introduksjon. Erlang, AMQP og RPC
RabbitMQ. Del 2. Forstå utvekslinger
RabbitMQ. Del 3. Forstå køer og bindinger
RabbitMQ. Del 4. Forstå hva meldinger og rammer er
RabbitMQ. Del 5: Publisering og forbruk av meldingsytelse
RabbitMQ. Del 6. Oversikt over forbunds- og spademodulene
RabbitMQ. Del 7. Detaljer om Connection og Chanel
RabbitMQ. Del 8. RabbitMQ i .NET
RabbitMQ. Del 9. Overvåking
Kort om AMQP
AMQP (Advanced Message Queuing Protocol) er en åpen protokoll for overføring av meldinger mellom systemkomponenter. Grunntanken er at individuelle undersystemer (eller uavhengige applikasjoner) kan utveksle meldinger på en vilkårlig måte gjennom en AMQP-megler, som utfører ruting, muligens garanterer levering, distribuerer datastrømmer og abonnerer på ønskede meldingstyper.
Protokoll AMQP introduserer tre konsepter:
exchange (utvekslingspunkt eller utveksling) - meldinger sendes til den. Byttepunkt distribuerer melding i en eller flere køer. Hun ruter meldinger til en kø basert på de opprettede forbindelsene (binding) mellom ham og køen
queue (kø) - en datastruktur på disk eller i RAM som lagrer lenker til meldinger og gir kopier av meldinger consumers (til forbrukere)
binding (bindende) - en regel som forteller utvekslingspunktet hvilken kø disse meldingene skal gå inn i
Erlang utviklet av selskapet Ericsson på midten av 1980-tallet som et distribuert, feiltolerant, sanntidssystem for applikasjoner som krever 99,999 % oppetid. Erlang brukes i ulike bransjer og moderne applikasjoner, f.eks. WhatsApp. Du kan lese mer i artikkelen WhatsApp-arkitektur, som Facebook kjøpte for 19 milliarder dollar
Kort om RabbitMQ
Kanin MQ er en åpen kildekode-meldingsmegler. Den ruter meldinger langs alle de grunnleggende prinsippene i protokollen AMQP beskrevet i spesifikasjoner. RabbitMQ implementerer og supplerer protokollen AMQP.
Hovedideen til meldingsmodellen i RabbitMQ tingen er producer (utgiver) sender ikke meldinger direkte til køen. Faktisk, og ganske ofte, vet ikke utgiveren engang om meldingen vil bli levert til noen kø i det hele tatt.
I stedet kan utgiveren bare sende meldinger til sentralen. På den ene siden mottar sentralen meldinger fra utgivere, og på den andre siden sender den dem til køer. Utvekslingen må vite nøyaktig hva den skal gjøre med meldingen den mottar. Bør det legges til en bestemt kø? Bør det legges til flere køer? Eller meldingen bør ignoreres.
Kort arbeid RabbitMQ kan beskrives som følger:
Utgiveren sender en melding til en bestemt børs
En sentral, etter å ha mottatt en melding, ruter den til en eller flere køer i samsvar med de bindende reglene mellom den og køen
Køen lagrer en referanse til denne meldingen. Selve meldingen lagres i RAM eller på disk
Når forbrukeren er klar til å motta en melding fra køen, lager serveren en kopi av meldingen via lenken og sender
Forbrukeren mottar meldingen og sender bekreftelse til megleren
Megleren, etter å ha mottatt bekreftelse, fjerner en kopi av meldingen fra køen. Sletter deretter fra RAM og disk
RPC
prosessen RPC (fjernprosedyrekall) ligger til grunn for nesten alle interaksjoner med kjernen RabbitMQ. For eksempel innledende diskusjoner om klientens vilkår med RabbitMQ, demonstrerer en viss prosess RPC. Når denne sekvensen er fullført, RabbitMQ vil være klar til å akseptere forespørsler fra klienten:
Også i spesifikasjonen AMQP både klienten og serveren kan utstede kommandoer. Dette betyr at klienten venter på å kommunisere med serveren. Kommandoer er klasser og metoder. For eksempel, Connection.Start – metodekall Start klasse Connection.
Tilkobling og kanaler
For slik informasjonsutveksling mellom klient og server, kanaler. Kanaler opprettes innenfor spesifikk forbindelse. Hver kanal er isolert fra andre kanaler. I det synkrone tilfellet er det ikke mulig å utføre neste kommando før et svar er mottatt.
For å kunne sende kommandoer parallelt, må du åpne flere kanaler. Hver kanal oppretter en separat Erlang prosess. Én tilkobling kan ha flere kanaler (multiplexing). For hver kanal er det visse strukturer og objekter i minnet. Derfor, jo flere kanaler det er innenfor en forbindelse, jo RabbitMQ bruker mer minne å administrere en slik forbindelse.
Et enkelt eksempel på å opprette en forbindelse og kanal ved hjelp av 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 sterkeste å åpne en ny forbindelse for hver operasjon vil føre til høye kostnader. Kanaler bør også være vedvarende, men mange protokollfeil fører til at kanalen lukkes, så levetiden til kanalen kan være kortere enn tilkoblingens levetid.
Hvor brukes RabbitMQ?
I sammenheng med mikrotjenester, protokollen AMQP og dens implementering i RabbitMQ ofte brukt til asynkron interaksjon mellom tjenester.
I konteksten IIOT protokoll AMQP og dens implementering i RabbitMQ brukes til datautveksling mellom servere (server-server). Bruk også plugin MQTT-plugin RabbitMQ som er en implementering av protokollen MQTT for overføring av data mellom sensor og server i miljøer med lav hastighet og høy latens (en fullstendig liste over støttede protokoller er oppført på prosjektnettsted).
I den neste artikkelen vil vi begynne å forstå Exchanges mer detaljert.