God dag, Habr! Jeg ønsker å dele en håndbok-guide med kunnskapene jeg har klart å samle om RabbitMQ og komprimere dem til korte anbefalinger og konklusjoner.
Innholdsfortegnelse
- RabbitMQ. Del 2. Vi går gjennom Exchanges
- RabbitMQ. Del 4. Hva er meldinger og rammer?
- RabbitMQ. Del 3. Vi går gjennom Køer og Bindinger
- RabbitMQ. Del 4. La oss se nærmere på hva som er meldinger og rammer
- RabbitMQ. Del 6. Oversikt over modulene Federation og Shovel
- RabbitMQ. Del 7. Detaljert om Connection og Channel
- RabbitMQ. Del 8. RabbitMQ i .NET
- RabbitMQ. Del 9. Overvåking
- Midlertidige køer
Kort om AMQP
AMQP (Advanced Message Queuing Protocol) – en åpen protokoll for meldingsoverføring mellom systemkomponenter. Hovedideen er at separate undersystemer (eller uavhengige applikasjoner) kan utveksle meldinger på en vilkårlig måte gjennom en AMQP-broker, som utfører ruting, muligens garanterer levering, distribusjon av datastreams, og abonnement på de nødvendige type meldingene.
Protokoll AMQP introducerer tre begreper:

exchange(utvekslingspunkt eller utveksling) – her sendes meldingene. Utvekslingspunktet fordeler meldingen til en eller flere køer. Den ruter meldingene til køen basert på de etablerte forbindelsene (binding) mellom den og køenkø(kø) – en datakonstruksjon på disk eller i RAM, som lagrer referanser til meldinger og gir kopier av meldingeneforbrukere(til forbrukere)binding(binding) – en regel som informerer utvekslingspunktet om hvilken av køene meldingene skal sendes til
Protokollen fungerer på toppen av .
Kort om Erlang
Kildekoden til prosjektet finnes i depotet på . Arkitekturen er basert på og BEAM.
Erlanger utviklet av selskapetEricssonpå midten av 1980-tallet som et distribuert, feilbestandig sanntidssystem for applikasjoner som krever driftsikkerhet på 99,999%.Erlangbrukt i ulike industrier og moderne applikasjoner, for eksempel i
Kort om RabbitMQ
– en meldingsbroker med åpen kildekode. Den rutet meldinger i henhold til alle de grunnleggende prinsippene for protokollen beskrevet i . RabbitMQ implementerer og supplerer protokollen AMQP.
Hovedideen bak meldingsutvekslingsmodellen i RabbitMQ er at producer (utgiver) ikke sender meldinger direkte til køen. I virkeligheten vet ofte ikke utgiveren engang om meldingen vil bli levert til noen kø.
I stedet kan utgiveren kun sende meldinger til en utveksling. På den ene siden får utvekslingen meldinger fra utgivere, og på den andre siden sender den dem til køene. Utvekslingen må vite nøyaktig hva den skal gjøre med den mottatte meldingen. Skal den legges til i en spesifikk kø? Skal den legges til i flere køer? Eller skal meldingen ignoreres?

Kort oppsummert kan arbeidet RabbitMQ beskrives som følger:
- Utgiveren sender en melding til en spesifikk utveksling
- Utvekslingen, når den mottar meldingen, rutinerer den til en eller flere køer i henhold til binderegler mellom den og køen
- Køen lagrer en referanse til denne meldingen. Selve meldingen lagres i minnet eller på disk
- Når forbrukeren er klar til å motta meldingen fra køen, oppretter serveren en kopi av meldingen ved hjelp av referansen og sender den
- Forbrukeren mottar meldingen og sender en bekreftelse til megleren
- Megleren, etter å ha mottatt bekreftelsen, fjerner kopi av meldingen fra køen. Deretter fjerner den fra minnet og fra disken
RPC
Prosessen ligger til grunn for praktisk talt all interaksjon med kjernen RabbitMQ. For eksempel har innledende diskusjoner om vilkårene for klienten med RabbitMQ, demonstrerer en spesifikk prosess RPC. Når denne sekvensen er fullført, RabbitMQ vil være klar til å ta imot forespørsel fra klienten:

Også i spesifikasjonen AMQP kan både klient og server kalle kommandoer. Dette betyr at klienten forventer interaksjon med serveren. Kommandoer er klasser og metoder. For eksempel, Connection.Start – kaller en metode Start klassen Connection.
Tilslutning og kanaler
For slik informasjonsutveksling mellom klienten og serveren brukes kanaler. Kanaler opprettes innenfor en bestemt tilslutning. Hver kanal er isolert fra andre kanaler. I synkrone tilfeller er det ikke mulig å utføre neste kommando før en respons er mottatt.
For å kunne sende kommandoer parallelt må man åpne flere kanaler. Hver kanal oppretter en egen Erlang prosess. Én tilslutning kan ha mange kanaler (). Hver kanal har noen strukturer og objekter i minnet. Derfor, jo flere kanaler som finnes innenfor en tilslutning, jo mer minne bruker RabbitMQ for å håndtere slike tilkoblinger.

Et enkelt eksempel på opprettelse av tilkobling og kanal ved hjelp av :
// ...
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 anbefales på det sterkeste ikke å åpne en ny tilkobling for hver operasjon, da dette vil føre til store kostnader.Kanaler må også være permanente, men mange protokollfeil fører til at kanalen lukkes, så levetiden til kanalen kan være kortere enn tilkoblingen.
Hvor brukes RabbitMQ?
I sammenheng med mikrotjenester brukes protokollen AMQP og dens implementering i RabbitMQ ofte for asynkron kommunikasjon mellom tjenester.
I sammenheng med IIOT protokollen AMQP og dens implementering i RabbitMQ brukes for datadelings mellom servere (server-til-server). Det brukes også en plugin som er en implementering av protokollen for datatransmisjon mellom sensor og server i lavhastighetsmiljøer med høy forsinkelse (fullstendig liste over støttede protokoller er oppført på ).
I neste artikkel begynner vi å se nærmere på Exchanges.
Lenker
Kilde: habr.com
