Cos’è uno scambio? Cosa sono le chiavi di routing e i binding? Come sono associati tra loro gli scambi e le code? Quando bisogna usarli e come? Questo articolo spiega i diversi tipi di scambi in RabbitMQ e gli scenari su come usarli.
I messaggi non vengono pubblicati direttamente su una coda. Invece, il produttore invia i messaggi ad uno scambio. Gli scambi sono agenti di routing dei messaggi, definiti dall’host virtuale all’interno di RabbitMQ. Uno scambio è responsabile dell’instradamento dei messaggi a diverse code con l’aiuto di attributi di intestazione, binding e chiavi di instradamento.
Abinding è un “link” che si imposta per legare una coda a uno scambio.
La chiave di instradamento è un attributo del messaggio che lo scambio guarda quando decide come instradare il messaggio alle code (a seconda del tipo di scambio).
Scambi, connessioni e code possono essere configurati con parametri come durevole, temporaneo e cancellazione automatica alla creazione. Gli scambi durevoli sopravvivono ai riavvii del server e durano finché non vengono esplicitamente cancellati. Gli scambi temporanei esistono finché RabbitMQ non viene spento. Gli scambi auto-cancellati vengono rimossi una volta che l’ultimo oggetto vincolato viene slegato dallo scambio.
In RabbitMQ, ci sono quattro diversi tipi di scambi che instradano il messaggio in modo diverso usando diversi parametri e impostazioni di binding. I clienti possono creare i propri scambi o usare gli scambi predefiniti che vengono creati quando il server si avvia per la prima volta.
- Il produttore pubblica un messaggio allo scambio.
- Lo scambio riceve il messaggio ed è ora responsabile dell’instradamento del messaggio.
- Il binding deve essere impostato tra la coda e lo scambio. In questo caso, abbiamo dei binding a due diverse code dall’exchange. Lo scambio instrada il messaggio nelle code.
- I messaggi rimangono nella coda finché non vengono gestiti da un consumatore.
- Il consumatore gestisce il messaggio.
Se non hai familiarità con RabbitMQ e il message queueing, leggiRabbitMQ per principianti – cos’è RabbitMQ?prima di leggere di scambi, chiavi di routing, intestazioni e binding.
Scambio diretto
Uno scambio diretto consegna i messaggi alle code in base a una chiave di routing del messaggio. La chiave di instradamento è un attributo del messaggio aggiunto all’intestazione del messaggio dal produttore. Pensate alla chiave di instradamento come a un “indirizzo” che lo scambio sta usando per decidere come instradare il messaggio.Un messaggio va alla coda (o alle code) con la chiave di binding che corrisponde esattamente alla chiave di instradamento del messaggio.
Il tipo di scambio diretto è utile per distinguere i messaggi pubblicati allo stesso scambio usando un semplice identificatore di stringa.
Lo scambio predefinito che i broker AMQP devono fornire per lo scambio diretto è “amq.direct”.
Immaginate che la coda A (create_pdf_queue) nell’immagine sottostante (Figura dello scambio diretto) sia legata a uno scambio diretto (pdf_events) con la chiave vincolantepdf_create.Quando un nuovo messaggio con routing keypdf_create arriva allo scambio diretto, lo scambio lo instrada alla coda in cui labinding_key = routing_key, nel caso della coda A (create_pdf_queue).
Scenario 1
- Scambio: pdf_events
- Coda A: create_pdf_queue
- Chiave di collegamento tra scambio (pdf_events) e coda A (create_pdf_queue): pdf_create
Scenario 2
- Scambio: pdf_events
- Coda B: pdf_log_queue
- Chiave di collegamento tra scambio (pdf_events) e coda B (pdf_log_queue): pdf_log
Esempio
Esempio: Un messaggio con chiave di routing pdf_log viene inviato allo scambio pdf_events e viene indirizzato alla pdf_log_queue perché la chiave di routing (pdf_log) corrisponde alla chiave di binding (pdf_log).
Se la chiave di routing del messaggio non corrisponde a nessuna chiave di binding, il messaggio viene scartato.
Scambio predefinito
Lo scambio predefinito è uno scambio diretto pre-dichiarato senza nome, di solito indicato da una stringa vuota. Quando si usa lo scambio di default, il messaggio viene consegnato alla coda con un nome uguale alla chiave di instradamento del messaggio. Ogni coda è automaticamente legata al default exchange con una chiave di routing che è uguale al nome della coda.
Topic Exchange
Topic exchange instrada i messaggi alle code in base alle corrispondenze jolly tra la chiave di routing e lo schema di routing, che è specificato dal binding della coda. I messaggi sono instradati a una o più code in base a una corrispondenza tra una chiave di routing del messaggio e questo schema.
La chiave di routing deve essere una lista di parole, delimitata da un punto (.). Esempi sonoagreements.usandagreements.eu.stockholmche in questo caso identifica gli accordi che sono impostati per una società con uffici in molte località diverse. Gli schemi di routing possono contenere un asterisco (“*”) per far corrispondere una parola in una posizione specifica della chiave di routing (ad esempio, uno schema di routing di “agreements.*.*.b.*” corrisponde solo alle chiavi di routing dove la prima parola è “agreements” e la quarta parola è “b”). Un simbolo di cancelletto (“#”) indica una corrispondenza di zero o più parole (ad esempio, uno schema di routing di “agreements.eu.berlin.#” corrisponde a qualsiasi chiave di routing che inizia con “agreements.eu.berlin”).
I consumatori indicano a quali argomenti sono interessati (come iscriversi a un feed per un singolo tag). Il consumatore crea una coda e imposta un binding con un dato modello di routing allo scambio. Tutti i messaggi con una chiave di routing che corrispondono allo schema di routing vengono instradati alla coda e vi rimangono finché il consumatore non consuma il messaggio.
Lo scambio predefinito che i broker AMQP devono fornire per lo scambio di argomenti è “amq.topic”.
Scenario 1
L’immagine a destra mostra un esempio in cui il consumatore A è interessato a tutti gli accordi di Berlino.
- Exchange: agreements
- Queueue A: berlin_agreements
- Struttura di routing tra exchange (agreements) e Queue A (berlin_agreements): agreements.eu.berlin.#
- Esempio di chiave di routing del messaggio che corrisponde: agreements.eu.berlin e agreements.eu.berlin.headstore
Scenario 2
Il consumatore B è interessato a tutti gli accordi.
- Scambio: accordi
- Coda B: tutti_accordi
- Schema di routing tra scambio (accordi) e coda B (tutti_accordi): accordi.#
- Esempio di chiave di instradamento dei messaggi che corrisponde: agreements.eu.berlin e agreements.us
Scenario 3
Il consumatore C è interessato a tutti gli accordi per i negozi di testa europei.
- Scambio: accordi
- Coda C: accordi_testamento
- Schema di routing tra scambio (accordi) e coda C (accordi_testamento): accordi.eu.*.headstore
- Esempio di chiavi di routing del messaggio che corrisponderanno: agreements.eu.berlin.headstore e agreements.eu.stockholm.headstore
Esempio
Un messaggio con chiave di routinggreements.Il messaggio viene instradato alla codaberlin_agreements perché lo schema di routing di “agreements.eu.berlin.#” corrisponde alle chiavi di routing che iniziano con “agreements.eu.berlin”. Il messaggio viene anche instradato verso la codaall_agreementsperché la chiave di instradamento (agreements.eu.berlin) corrisponde allo schema di instradamento (agreements.#).
Fanout Exchange
Un fanout exchange copia e instrada un messaggio ricevuto a tutte le code che sono legate ad esso indipendentemente dalle chiavi di instradamento o dalla corrispondenza dello schema come negli scambi diretti e topic. Le chiavi fornite saranno semplicemente ignorate.
Gli scambi fanout possono essere utili quando lo stesso messaggio deve essere inviato a una o più code con consumatori che possono elaborare lo stesso messaggio in modi diversi.
L’immagine a destra (scambio fanout) mostra un esempio in cui un messaggio ricevuto dallo scambio viene copiato e instradato a tutte e tre le code legate allo scambio. Potrebbe essere, ad esempio, un aggiornamento sportivo o meteorologico che dovrebbe essere inviato ad ogni dispositivo mobile collegato quando succede qualcosa.
Lo scambio predefinito che i broker AMQP devono fornire per lo scambio di argomenti è “amq.fanout”.
Scenario 1
- Scambio: sport_news
- Queueue A: coda client mobile A
- Binding: Binding tra lo scambio (sport_news) e la coda A (coda client mobile A)
Esempio
Un messaggio viene inviato allo scambioport_news.Il messaggio viene instradato a tutte le code (coda A, coda B, coda C) perché tutte le code sono legate allo scambio. Le chiavi di routing fornite sono ignorate.
Headers Exchange
Uno scambio di intestazioni instrada i messaggi sulla base di argomenti contenenti intestazioni e valori opzionali. Gli scambi di intestazioni sono molto simili agli scambi di argomenti, ma instradano i messaggi sulla base di valori di intestazione invece che di chiavi di instradamento. Un messaggio corrisponde se il valore dell’intestazione è uguale al valore specificato nel binding.
Un argomento speciale chiamato “x-match”, aggiunto nel binding tra scambio e coda, specifica se tutte le intestazioni devono corrispondere o solo una. O qualsiasi intestazione comune tra il messaggio e il binding conta come corrispondenza, o tutte le intestazioni a cui si fa riferimento nel binding devono essere presenti nel messaggio perché questo corrisponda. La proprietà “x-match” può avere due diversi valori: “any” o “all”, dove “all” è il valore predefinito. Un valore di “all” significa che tutte le coppie di intestazioni (key, value) devono corrispondere, mentre un valore di “any” significa che almeno una delle coppie di intestazioni deve corrispondere. Le intestazioni possono essere costruite usando una gamma più ampia di tipi di dati, integer o hash per esempio, invece di una stringa. Il tipo di scambio delle intestazioni (usato con l’argomento vincolante “any”) è utile per indirizzare i messaggi che contengono un sottoinsieme di criteri noti (non ordinati).
Lo scambio predefinito che i broker AMQP devono fornire per lo scambio di argomenti è “amq.headers”.
Esempio
Scenario 3
Il messaggio 3 viene pubblicato allo scambio con argomenti di intestazione di (key = value): “
Vale la pena notare che in uno scambio di intestazioni, l’ordine effettivo delle coppie chiave-valore nel messaggio è irrilevante.
Dead Letter Exchange
Se non si trova una coda corrispondente per il messaggio, il messaggio viene eliminato in silenzio. RabbitMQ fornisce un’estensione AMQP conosciuta come “Dead Letter Exchange”, che fornisce la funzionalità per catturare i messaggi che non sono consegnabili.
Si prega di inviare un’email a [email protected] se avete suggerimenti sui contenuti mancanti o altri feedback.