Del 4: RabbitMQ Exchanges, routing nøgler og bindinger

Hvad er en udveksling? Hvad er routingnøgler og bindinger? Hvordan er udvekslinger og køer forbundet med hinanden? Hvornår skal jeg bruge dem og hvordan? Denne artikel forklarer de forskellige typer udvekslinger i RabbitMQ og scenarier for, hvordan de kan bruges.

Meddelelser offentliggøres ikke direkte til en kø. I stedet sender producenten meddelelser til en udveksling. Exchanges er besked-routingagenter, der er defineret af den virtuelle vært i RabbitMQ. En udveksling er ansvarlig for at videresende beskederne til forskellige køer ved hjælp af header-attributter, bindinger og routingnøgler.

Bindinger et “link”, som du opretter for at binde en kø til en udveksling.

Routingnøglen er en beskedattribut, som udvekslingen ser på, når den beslutter, hvordan meddelelsen skal dirigeres til køer (afhængigt af udvekslingstypen).

Udvekslinger, forbindelser og køer kan konfigureres med parametre som f.eks. holdbar, midlertidig og automatisk sletning ved oprettelse. Varige udvekslinger overlever genstarter af serveren og varer, indtil de slettes eksplicit. Midlertidige udvekslinger eksisterer, indtil RabbitMQ lukkes ned. Automatisk slettede udvekslinger fjernes, når det sidste bundne objekt er frigjort fra udvekslingen.

I RabbitMQ er der fire forskellige typer udvekslinger, som videresender meddelelsen forskelligt ved hjælp af forskellige parametre og bindingsopsætninger. Klienter kan oprette deres egne udvekslinger eller bruge de foruddefinerede standardudvekslinger, som oprettes, når serveren starter første gang.

  1. Producenten udgiver en meddelelse til udvekslingen.
  2. Udvekslingen modtager meddelelsen og er nu ansvarlig for videresendelsen af meddelelsen.
  3. Binding skal oprettes mellem køen og udvekslingen. I dette tilfælde har vi bindinger til to forskellige køer fra centralen. Udvekslingen dirigerer meddelelsen til køerne.
  4. Meddelelserne forbliver i køen, indtil de håndteres af en forbruger.
  5. Konsumenten håndterer meddelelsen.

Hvis du ikke er bekendt med RabbitMQ og message queueing, kan du læseRabbitMQ for begyndere – hvad er RabbitMQ?før du læser om udvekslinger, routingnøgler, headere og bindinger.

Direkte udveksling

En direkte udveksling leverer meddelelser til køer baseret på en routingnøgle til meddelelser. Rutningsnøglen er en meddelelsesattribut, der tilføjes til meddelelseshovedet af producenten. Tænk på routingnøglen som en “adresse”, som udvekslingen bruger til at beslutte, hvordan meddelelsen skal dirigeres.En meddelelse går til den eller de køer med den bindende nøgle, der passer nøjagtigt til meddelelsens routingnøgle.

Den direkte udvekslingstype er nyttig til at skelne meddelelser, der er offentliggjort til den samme udveksling ved hjælp af en simpel strengidentifikator.

Den standardudveksling, som AMQP-mæglere skal stille til rådighed for den direkte udveksling, er “amq.direct”.

Forestil dig, at kø A (create_pdf_queue) i nedenstående billede (Direct Exchange Figure) er bundet til en direkte udveksling (pdf_events) med bindingsnøglen “binding keypdf_create”.Når en ny meddelelse med routing keypdf_create ankommer til den direkte udveksling, videresender udvekslingen den til den kø, hvor binding_key = routing_key, i dette tilfælde til kø A (create_pdf_queue).

Scenarie 1

  • Udveksling: pdf_events
  • Kø A: create_pdf_queue
  • Bindingsnøgle mellem udveksling (pdf_events) og kø A (create_pdf_queue): pdf_create

Scenarie 2

  • Udveksling: pdf_events
  • Kø B: pdf_log_queue
  • Binding key between exchange (pdf_events) and Queue B (pdf_log_queue): pdf_log

Eksempel

Eksempel: pdf_log

Eksempel

Eksempel: En meddelelse med routingnøglen pdf_log sendes til udvekslingspdf_events.Meddelelserne videresendes til pdf_log_queue, fordi routingnøglen (pdf_log) passer til bindingsnøglen (pdf_log).

Hvis meddelelsens routingnøgle ikke passer til nogen bindingsnøgle, kasseres meddelelsen.

Direkte udveksling: En meddelelse går til de køer, hvis bindingsnøgle passer nøjagtigt til meddelelsens routingnøgle.

Standardudveksling

Standardudvekslingen er en foruddeklareret direkte udveksling uden navn, som normalt refereres af en tom streng. Når du bruger standardudveksling, leveres din meddelelse til køen med et navn, der er lig med meddelelsens routingnøgle. Hver kø er automatisk bundet til standardudvekslingen med en routingnøgle, som er den samme som køens navn.

Topic Exchange

Topic exchanges dirigerer meddelelser til køer baseret på wildcard-match mellem routingnøglen og routingmønsteret, som er angivet af købindingen. Meddelelser dirigeres til en eller flere køer baseret på en matchning mellem en vejledningsnøgle for meddelelser og dette mønster.

Vejledningsnøglen skal være en liste af ord, der er afgrænset af et punktum (.). Eksempler eragreements.usogagreements.eu.stockholmsom i dette tilfælde identificerer aftaler, der er oprettet for en virksomhed med kontorer på mange forskellige steder. Rutningsmønstrene kan indeholde en asterisk (“*”) for at matche et ord i en bestemt position i rutningsnøglen (f.eks. kan et rutningsmønster med “agreements.*.*.*.b.*” kun matche rutningsnøgler, hvor det første ord er “agreements” og det fjerde ord er “b”). Et pund-symbol (“#”) angiver et match af nul eller flere ord (f.eks. matcher et routingmønster på “agreements.eu.berlin.#” alle routingnøgler, der begynder med “agreements.eu.berlin”).

Forbrugerne angiver, hvilke emner de er interesserede i (ligesom at abonnere på et feed for et individuelt tag). Forbrugeren opretter en kø og opretter en binding med et givet routingmønster til udvekslingen. Alle meddelelser med en routingnøgle, der passer til routingmønsteret, dirigeres til køen og forbliver der, indtil forbrugeren forbruger meddelelsen.

Den standardudveksling, som AMQP-mæglere skal levere til emneudvekslingen, er “amq.topic”.

Scenarie 1

Billedet til højre viser et eksempel, hvor forbruger A er interesseret i alle aftaler i Berlin.

  • Exchange: agreements
  • Queueue A: berlin_agreements
  • Routingmønster mellem exchange (agreements) og Queue A (berlin_agreements): agreements.eu.berlin.#
  • Eksempel på vejledningsnøgle for meddelelser, der matcher: agreements.eu.berlin og agreements.eu.berlin.headstore

Scenarie 2

Forbruger B er interesseret i alle aftaler.

  • Børs: aftaler
  • Kø B: alle_aftaler
  • Routingmønster mellem udveksling (aftaler) og kø B (alle_aftaler): aftaler.#
  • Eksempel på nøgle til videresendelse af meddelelser, der matcher: agreements.eu.berlin og agreements.us

Topic Exchange: Meddelelser videresendes til en eller flere køer på grundlag af et match mellem en nøgle til videresendelse af meddelelser og videresendelsesmønsteret.

Scenarie 3

Forbruger C er interesseret i alle aftaler for europæiske hovedkontorer.

  • Børsen: aftaler
  • Kø C: headstore_agreements
  • Routingmønster mellem børsen (aftaler) og kø C (headstore_agreements): agreements.eu.*.headstore
  • Eksempel på vejledningsnøgler for meddelelser, der vil matche: agreements.eu.berlin.headstore og agreements.eu.stockholm.headstore

Eksempel

En meddelelse med vejledningsnøgleragreements.eu.berlin sendes til exchangeagreements.Meddelelserne videresendes til køenberlin_agreementsom følge af, at rutemønstret “agreements.eu.berlin.#” passer til de vejledningsnøgler, der begynder med “agreements.eu.berlin”. Meddelelsen videresendes også til køenall_agreements, fordi routingnøglen (agreements.eu.berlin) passer til routingmønsteret (agreements.#).

Fanout Exchange

En fanout exchange kopierer og videresender en modtaget meddelelse til alle køer, der er bundet til den, uanset routingnøgler eller mønstermatchning som med direkte og emneudvekslinger. De angivne nøgler vil simpelthen blive ignoreret.

Fanout-udvekslinger kan være nyttige, når den samme meddelelse skal sendes til en eller flere køer med forbrugere, der kan behandle den samme meddelelse på forskellige måder.

Billedet til højre (Fanout-udveksling) viser et eksempel, hvor en meddelelse, der er modtaget af udvekslingen, kopieres og videresendes til alle tre køer, der er bundet til udvekslingen. Det kunne f.eks. være sports- eller vejropdateringer, der skal sendes ud til hver enkelt tilsluttet mobilenhed, når der sker noget.

Den standardudveksling, som AMQP-mæglere skal stille til rådighed for emneudvekslingen, er “amq.fanout”.

Fanout Exchange: Den modtagne meddelelse videresendes til alle køer, der er bundet til udvekslingen.

Scenarie 1

  • Udveksling: sport_news
  • Kø A: Mobil klientkø A
  • Binding: Binding mellem udveksling (sport_news) og kø A (mobilklientkø A)

Eksempel

En meddelelse sendes til udvekslingenport_news.meddelelsen videresendes til alle køer (kø A, kø B og kø C), fordi alle køer er bundet til udvekslingen. Forudsatte routingnøgler ignoreres.

Headers Exchange

En headers exchange dirigerer meddelelser baseret på argumenter, der indeholder headers og valgfrie værdier. Headers-udvekslinger ligner meget emneudvekslinger, men dirigerer meddelelser baseret på header-værdier i stedet for routingnøgler. En meddelelse matcher, hvis værdien af overskriften er lig med den værdi, der er angivet ved bindingen.

Et særligt argument ved navn “x-match”, der tilføjes i bindingen mellem udveksling og kø, angiver, om alle overskrifter skal matche eller kun én. Enten tæller enhver fælles header mellem meddelelsen og bindingen som et match, eller også skal alle de headere, der henvises til i bindingen, være til stede i meddelelsen for at den skal matche. Egenskaben “x-match” kan have to forskellige værdier: “any” eller “all”, hvor “all” er standardværdien. En værdi på “all” betyder, at alle headerpar (key, value) skal passe, mens en værdi på “any” betyder, at mindst ét af headerparrene skal passe. Overskrifter kan konstrueres ved hjælp af et bredere udvalg af datatyper, f.eks. heltal eller hash, i stedet for en streng. Udvekslingstypen headers (anvendt med bindingsargumentet “any”) er nyttig til at dirigere meddelelser, der indeholder en delmængde af kendte (uordnede) kriterier.

Den standardudveksling, som AMQP-mæglere skal levere til emneudvekslingen, er “amq.headers”.

Eksempel

Scenarie 3

Meddelelse 3 offentliggøres til udvekslingen med header-argumenter på (key = value): “

Det er værd at bemærke, at i en header-udveksling er den faktiske rækkefølge af nøgle-værdiparrene i meddelelsen irrelevant.

Død brevudveksling

Hvis der ikke kan findes nogen matchende kø for meddelelsen, droppes meddelelsen stille og roligt. RabbitMQ indeholder en AMQP-udvidelse kendt som “Dead Letter Exchange”, som giver funktionaliteten til at opfange meddelelser, der ikke kan leveres.

Skriv til os på [email protected] hvis du har forslag om manglende indhold eller anden feedback.

Guide – RabbitMQ for begyndere

Er du tilfreds med denne artikel? Glem ikke at dele den med andre. 😉

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.