Del 4: RabbitMQ-utbyten, routingnycklar och bindningar

Vad är ett utbyte? Vad är routningsnycklar och bindningar? Hur är utbyten och köer associerade med varandra? När ska jag använda dem och hur? Den här artikeln förklarar de olika typerna av utbyten i RabbitMQ och scenarier för hur de kan användas.

Meddelanden publiceras inte direkt till en kö. Istället skickar producenten meddelanden till ett utbyte. Exchanges är förmedlare av meddelanden som definieras av den virtuella värden i RabbitMQ. Ett utbyte ansvarar för att dirigera meddelanden till olika köer med hjälp av headerattribut, bindningar och routingnycklar.

Bindningär en ”länk” som du ställer in för att binda en kö till ett utbyte.

Ruttningsnyckelär ett meddelandeattribut som växeln tittar på när den bestämmer hur meddelandet ska dirigeras till köer (beroende på typ av växel).

Utbyten, anslutningar och köer kan konfigureras med parametrar som till exempeldurable, temporary ochauto deleteupon creation. Hållbara utbyten överlever omstarter av servern och finns kvar tills de raderas uttryckligen. Temporära utbyten existerar tills RabbitMQ stängs av. Auto-deleted exchanges tas bort när det sista bundna objektet är obundet från exchangen.

I RabbitMQ finns det fyra olika typer av exchanges som dirigerar meddelandet på olika sätt med hjälp av olika parametrar och bindningsuppsättningar. Klienter kan skapa egna exchanges eller använda de fördefinierade standard exchanges som skapas när servern startar för första gången.

  1. Producenten publicerar ett meddelande till exchange.
  2. Utbytescentralen tar emot meddelandet och ansvarar nu för routningen av meddelandet.
  3. Bindningar måste sättas upp mellan kön och exchange. I det här fallet har vi bindningar till två olika köer från växeln. Utbytet dirigerar meddelandet till köerna.
  4. Meddelandena stannar i kön tills de hanteras av en konsument.
  5. Konsumenten hanterar meddelandet.

Om du inte är bekant med RabbitMQ och meddelande-köer kan du läsaRabbitMQ för nybörjare – vad är RabbitMQ?innan du läser om utbyten, routningsnycklar, rubriker och bindningar.

Direktutbyte

Ett direktutbyte levererar meddelanden till köer baserat på en routningsnyckel för meddelanden. Routingnyckeln är ett meddelandeattribut som läggs till i meddelandehuvudet av producenten. Tänk på routningsnyckeln som en ”adress” som växeln använder för att bestämma hur meddelandet ska dirigeras.Ett meddelande går till den eller de köer med den bindningsnyckel som exakt matchar meddelandets routningsnyckel.

Den direkta växlingstypen är användbar för att särskilja meddelanden som publicerats till samma växel med hjälp av en enkel strängidentifierare.

Den standardutväxling som AMQP-mäklare måste tillhandahålla för direktutväxling är ”amq.direct”.

Föreställ dig att kö A (create_pdf_queue) i bilden nedan (Figur för direktutväxling) är bunden till en direktutväxling (pdf_events) med bindningsnyckelnpdf_create.När ett nytt meddelande med routing keypdf_create anländer till den direkta växeln, dirigerar växeln det till den kö där binding_key = routing_key, i detta fall till kö A (create_pdf_queue).

Scenario 1

  • Utbyte: pdf_events
  • Kö A: create_pdf_queue
  • Bindningsnyckel mellan utbyte (pdf_events) och kö A (create_pdf_queue): pdf_create

Scenario 2

  • Utbyte: pdf_events
  • Kö B: pdf_log_queue
  • Bindningsnyckel mellan utbyte (pdf_events) och kö B (pdf_log_queue): pdf_log

Exempel

Exempel: Meddelandet skickas till utbytetpdf_events.Meddelandet dirigeras till pdf_log_queue eftersom routningsnyckeln (pdf_log) stämmer överens med bindningsnyckeln (pdf_log).

Om routningsnyckeln för meddelandet inte stämmer överens med någon bindningsnyckel, kasseras meddelandet.

Direktutbyte:

Standardutbyte

Standardutbytet är ett fördeklarerat direktutbyte utan namn, som vanligtvis refereras till av en tom sträng. När du använder standardutbytet levereras ditt meddelande till kön med ett namn som är lika med meddelandets routningsnyckel. Varje kö är automatiskt bunden till standardutbytet med en routningsnyckel som är densamma som namnet på kön.

Topic Exchange

Topic exchanges dirigerar meddelanden till köer baserat på wildcardmatchningar mellan routningsnyckeln och routningsmönstret, som specificeras av köbindningen. Meddelanden dirigeras till en eller flera köer baserat på en matchning mellan en routningsnyckel för meddelanden och det här mönstret.

Routningsnyckeln måste vara en lista med ord, avgränsad av en punkt (.). Exempel äragreements.usochagreements.eu.stockholmsom i det här fallet identifierar avtal som upprättats för ett företag med kontor på många olika platser. Rutningsmönstren kan innehålla en asterisk (”*”) för att matcha ett ord i en viss position i rutningsnyckeln (t.ex. matchar ett rutningsmönster ”agreements.*.*.*.b.*” endast rutningsnycklar där det första ordet är ”agreements” och det fjärde ordet är ”b”). En pund-symbol (”#”) anger en matchning av noll eller fler ord (t.ex. matchar ett routningsmönster ”agreements.eu.berlin.#” alla routningsnycklar som börjar med ”agreements.eu.berlin”).

Konsumenterna anger vilka ämnen de är intresserade av (som att prenumerera på ett flöde för en enskild tagg). Konsumenten skapar en kö och upprättar en bindning med ett givet routningsmönster till utbytet. Alla meddelanden med en routningsnyckel som matchar routningsmönstret dirigeras till kön och stannar där tills konsumenten konsumerar meddelandet.

Den standardutväxling som AMQP-mäklare måste tillhandahålla för ämnesutbytet är ”amq.topic”.

Scenario 1

Bilden till höger visar ett exempel där konsument A är intresserad av alla avtal i Berlin.

  • Exchange: agreements
  • Queueue A: berlin_agreements
  • Routingmönster mellan exchange (agreements) och Queue A (berlin_agreements): agreements.eu.berlin.#
  • Exempel på en nyckel för routning av meddelanden som matchar: agreements.eu.berlin och agreements.eu.berlin.headstore

Scenario 2

Konsument B är intresserad av alla avtal.

  • Exchange: agreements
  • Queueue B: all_agreements
  • Routingmönster mellan exchange (agreements) och Queue B (all_agreements): agreements.#
  • Exempel på nyckeln för routning av meddelanden som matchar: agreements.eu.berlin och agreements.us

Temautbyte:

Scenario 3

Konsument C är intresserad av alla avtal för europeiska huvudkontor.

  • Exchange: agreements
  • Queueue C: headstore_agreements
  • Routing pattern between exchange (agreements) and Queue C (headstore_agreements): agreements.eu.*.headstore
  • Exempel på nycklar för routning av meddelanden som matchar: agreements.eu.berlin.headstore och agreements.eu.stockholm.headstore

Exempel

Ett meddelande med rutningsnyckelagreements.eu.berlin skickas till exchangeagreements.Meddelandena dirigeras till köberlin_agreements eftersom routningsmönstret ”agreements.eu.berlin.#” matchar de routningsnycklar som börjar med ”agreements.eu.berlin”. Meddelandet dirigeras också till könall_agreements eftersom routningsnyckeln (agreements.eu.berlin) matchar routningsmönstret (agreements.#).

Fanout Exchange

En fanout exchange kopierar och dirigerar ett mottaget meddelande till alla köer som är bundna till den, oavsett routningsnycklar eller mönstermatchning, som vid direkt- och ämnesutbyten. De nycklar som tillhandahålls ignoreras helt enkelt.

Fanout exchanges kan vara användbara när samma meddelande måste skickas till en eller flera köer med konsumenter som kan behandla samma meddelande på olika sätt.

Bilden till höger (Fanout Exchange) visar ett exempel där ett meddelande som tas emot av växeln kopieras och dirigeras till alla tre köer som är bundna till växeln. Det kan till exempel vara sport- eller väderuppdateringar som ska skickas ut till varje ansluten mobil enhet när något händer.

Den standardutväxling som AMQP-mäklare måste tillhandahålla för ämnesutbytet är ”amq.fanout”.

Fanout Exchange: Det mottagna meddelandet dirigeras till alla köer som är bundna till utbytet.

Scenario 1

  • Exchange: sport_news
  • Kö A: Mobil klientkö A
  • Binding: Binding between the exchange (sport_news) and Queue A (Mobile client queue A)

Exempel

Ett meddelande skickas till exchangesport_news.Meddelandet skickas till alla köer (Queue A, Queue B, Queue C) eftersom alla köer är bundna till exchange. Tillhandahållna routningsnycklar ignoreras.

Headers Exchange

En headers exchange dirigerar meddelanden baserat på argument som innehåller headers och valfria värden. Headers-utbyten är mycket lika ämnesutbyten, men dirigerar meddelanden baserat på header-värden i stället för routningsnycklar. Ett meddelande matchar om värdet i rubriken är lika med det värde som anges vid bindningen.

Ett särskilt argument med namnet ”x-match”, som läggs till i bindningen mellan växel och kö, anger om alla rubriker måste matcha eller bara en. Antingen räknas alla gemensamma rubriker mellan meddelandet och bindningen som en matchning, eller så måste alla rubriker som refereras i bindningen finnas i meddelandet för att det ska matcha. Egenskapen ”x-match” kan ha två olika värden: ”any” eller ”all”, där ”all” är standardvärdet. Värdet ”all” innebär att alla headerpar (key, value) måste stämma överens, medan värdet ”any” innebär att minst ett av headerparen måste stämma överens. Rubriker kan konstrueras med hjälp av ett större antal datatyper, t.ex. heltal eller hash, i stället för strängar. Utbytestypen headers (som används med bindningsargumentet ”any”) är användbar för att styra meddelanden som innehåller en delmängd av kända (oordnade) kriterier.

Det standardutbyte som AMQP-mäklare måste tillhandahålla för ämnesutbytet är ”amq.headers”.

Exempel

Scenario 3

Meddelande 3 publiceras till utbytet med header-argument av (nyckel = värde): ”

Det är värt att notera att i ett huvudutbyte är den faktiska ordningen på nyckel-värdeparen i meddelandet irrelevant.

Döda brevutbyte

Om det inte går att hitta någon matchande kö för meddelandet, släpps meddelandet tyst. RabbitMQ tillhandahåller ett AMQP-tillägg som kallas ”Dead Letter Exchange”, vilket ger funktionalitet för att fånga upp meddelanden som inte kan levereras.

E-posta oss på [email protected] om du har förslag om saknat innehåll eller annan feedback.

Guide – RabbitMQ för nybörjare

Gillar du den här artikeln? Glöm inte att dela den med andra. 😉

Lämna ett svar

Din e-postadress kommer inte publiceras.