Scambio — un intermediario o punto di scambio. In esso vengono inviati messaggi. Scambio distribuisce il messaggio in una o più code. Esso instrada i messaggi nella coda in base alle relazioni create (bindings) tra esso e la coda.
Scambio non è . Per motivi di scalabilità exchange è una stringa (riferimento al modulo con il codice, dove risiede la logica di instradamento) nel database incorporato . 1.000 punti di scambio consumeranno solo 1MB di memoria.
Indice
- RabbitMQ. Parte 3. Approfondiamo le Code e i Binding
- RabbitMQ. Parte 4. Approfondiamo cosa sono i messaggi e i frame
- RabbitMQ. Parte 5. Performance di pubblicazione e consumo dei messaggi
- RabbitMQ. Parte 6. Panoramica dei moduli Federation e Shovel
- RabbitMQ. Parte 7. Dettagli su Connessione e Canale
- RabbitMQ. Parte 8. RabbitMQ in .NET
- RabbitMQ. Parte 9. Monitoraggio
Direct Exchange
Direct exchange è utilizzato quando è necessario consegnare un messaggio a code specifiche. Il messaggio è pubblicato nell'exchange con una certa chiave di instradamento e va in tutte le code collegate a questo exchange con la stessa chiave di instradamento. La chiave di instradamento è una stringa. La ricerca di corrispondenza avviene tramite il controllo di equivalenza delle stringhe.
Rappresentazione grafica del flusso di messaggi:

In rabbitmq esiste il concetto di exchange predefinito. Questo è direct exchange senza nome. Se viene utilizzato l'exchange predefinito, il messaggio sarà instradato verso una coda con nome pari alla chiave di instradamento del messaggio.
Topic Exchange
Topic exchange è analogo direct exchange consentendo la instradamento selettivo mediante il confronto della chiave di instradamento. Ma, in questo caso, la chiave è definita da un modello. Nella creazione del modello si utilizzano 0 una o più parole (lettere AZ e az e numeri 0-9), separati da un punto, e anche simboli * e #.
*— può essere sostituito con esattamente1una parola#— può essere sostituito con0una o più parole
Rappresentazione grafica del flusso di messaggi:

A partire dalla versione RabbitMQ 2.4.0 l'algoritmo di instradamento per topic exchange ha cominciato a funzionare fino 145 dieci volte più veloce. Hanno raggiunto questo tramite l'implementazione , che implica la rappresentazione dei modelli come una struttura ad albero. Per esempio i modelli a.b.c, a.*.b.c, a.#.c e b.b.c saranno rappresentati dalla seguente struttura:

La ricerca di corrispondenza del modello avviene partendo dalla radice e seguendo dall'alto verso il basso.
Caratteristiche:
- l'uso di questo exchange può diventare una scelta ideale per un possibile sviluppo futuro dell'applicazione, poiché i modelli possono essere sempre configurati in modo che il messaggio venga pubblicato in modo analogo
direct exchangeofanout exchange - i modelli utilizzati
*molto più velocemente, rispetto ai modelli utilizzati#. topic exchangepiù lentamentedirect exchange
Fanout Exchange
Fanout exchange – tutti i messaggi vengono recapitati in tutte le code anche se nel messaggio è stato specificato una chiave di routing.
Caratteristiche:
RabbitMQnon funziona con chiavi di routing e modelli che influisce positivamente sulle prestazioni. È il più veloceexchange;- tutti i consumatori devono essere in grado di elaborare tutti i messaggi;
Rappresentazione grafica del flusso di messaggi:

Headers Exchange
Headers exchange – instrada messaggi a code collegate sulla base del confronto di coppie (chiave, valore) delle proprietà headers binding e proprietà simili del messaggio. headers rappresenta Dictionary.
Se nel dizionario viene aggiunta una chiave speciale x-match con valore any, il messaggio viene instradato in caso di corrispondenza parziale delle coppie (chiave, valore). Questo comportamento è simile all'operatore or.
var bindingArguments = new Dictinary();
bindingArguments.add("x-match", "any");Per impostazione predefinita, la chiave x-match contiene il valore all. Ciò significa che il messaggio viene instradato in caso di corrispondenza esatta delle coppie (chiave, valore). Questo comportamento è simile all'operatore and.
Rappresentazione grafica del flusso di messaggi:

Caratteristiche:
- ulteriore flessibilità
- ulteriori sovraccarichi di calcolo. Tutte le coppie (chiave, valore) dell'attributo
headersdevono essere ordinate in base al nome della chiave prima di calcolare i valori di routing del messaggio. Più lentamente rispetto ad altri tipi di exchange.
Consistent-Hashing Exchange
Questo scambiatore è e non integrato in RabbitMQ.
Consistent-hashing exchange (exchange con hashing coerente) – viene utilizzato quando ci sono più code che sono potenziali destinatari del messaggio, e quando è necessario bilanciare il carico tra di esse. L'associazione del messaggio alla coda avviene in base al peso (un valore stringa condizionale da 0 - n).
Il peso equivalente delle code indica che in ogni coda arriverà un numero approssimativamente uguale di messaggi (ogni messaggio sarà inserito solo in una coda). Non c'è una garanzia completa di distribuzione uniforme dei messaggi..
Rappresentazione grafica del flusso di messaggi:

Hash viene calcolato sulla base della chiave di routing o della proprietà headers del messaggio. Se tutti i messaggi pubblicati avevano chiavi di routing diverse o headers, la distribuzione avverrà in base al peso. Altrimenti verrà utilizzata una chiave di instradamento oppure headers.
Deve aiutare quando la capacità del consumatore deve crescere più di quanto risolva la soluzione con più consumatori che utilizzano una coda unica.
Combinazione di exchange (E2E)
Il comportamento di tutti gli exchange può essere combinato tramite collegamenti Exchange-to-Exchange (la combinazione degli exchange non è inclusa nella specifica AMQP. Questa è un'estensione del protocollo dallo RabbitMQ).
Rappresentazione grafica del flusso di messaggi:

Grazie a E2E possiamo trovare la configurazione scalabile corretta, che soddisfi sia le esigenze attuali che quelle in crescita.
Creazione dell'Exchange
La creazione di un exchange avviene tramite una richiesta RPC sincrona al server. La richiesta viene effettuata tramite il metodo Exchange.Declare, chiamato con i parametri:
- nome dell'exchange
- tipo di exchange
- altri parametri
Esempio di creazione exchange con l'aiuto :
//...
channel.ExchangeDeclare(
exchange: "my_exchange",
type: "direct",
durable: "false",
autoDelete: "false",
arguments: null
);
//...exchangeè il nome dell'exchange che vogliamo creare. Il nome deve essere unicotypeè il tipo di exchangedurablese impostatotrue, alloraexchangesarà permanente. Sarà memorizzato su disco e potrà sopravvivere al riavvio del server/broker. Se il valorefalse, alloraexchangeè temporaneo e verrà eliminato quando il server/broker verrà riavviatoautoDeleteè la cancellazione automatica.Scambioverrà eliminato quando verranno eliminate tutte le code ad esso associateargumentssono argomenti facoltativi. Più spesso, attraverso gli argomenti si impostanoalternative exchange(exchange alternativo). Se un messaggio non può seguire il percorso originale, può essere inviato a un exchange alternativo per l'instradamento su un altro percorso.

Se la creazione exchange è possibile, il server invierà al client una risposta sincrona RPC una risposta Exchange.DeclareOk. Se la creazione non è possibile (si è verificato un rifiuto della richiesta Exchange.Declare), allora il canale verrà chiuso dal server tramite un comando asincrono Channel.Close e il client riceverà un'eccezione , che conterrà un codice di errore e la sua descrizione.
L'exchange deve essere creato prima della pubblicazione dei messaggi. Se pubblichi un messaggio in un exchange inesistente — RabbitMQ lo eliminerà silenziosamente.
Creazione di un Exchange tramite interfaccia grafica
Accediamo al pannello di amministrazione RabbitMQ come utente guest (username: guest e password: guest). Si prega di notare che l'utente guest può connettersi solo dall'host locale. Ora passiamo alla scheda Exchanges e clicchiamo su Aggiungi un nuovo scambio. Compiliamo le proprietà:

La maggior parte delle proprietà è stata descritta sopra. Qui notiamo che se impostiamo Interno, lo scambio potrà essere utilizzato solo per E2E. Produttore non potrà inviare messaggi a tale scambio.
Conclusione
Quando si sviluppa il sistema, è utile descrivere la topologia utilizzando un grafo. Ma prima di iniziare a costruire il grafo, è importante evidenziare i percorsi con alto traffico, poiché sono proprio questi che richiedono una maggiore larghezza di banda (prestazioni). Successivamente, si può classificare il traffico. E solo dopo si può procedere alla costruzione.
Se nel grafo costruito esiste un insieme finito di chiavi di instradamento, è utile considerare diversi fanout exchange, che sono collegati 1:1 alla chiave di instradamento. Ricordiamo che fanout exchange è il più veloce.
Se il numero di percorsi tende all'infinito, è opportuno prestare attenzione a topic exchange oppure, se il modello non è necessario, si può scegliere scambio diretto, poiché è più veloce topic exchange.
Le combinazioni di varie exchange dovrebbero aiutare a trovare la configurazione scalabile, che risponde sia alle attuali che alle crescenti esigenze del sistema.
Numero exchange e code devono essere minimi rispetto al numero di percorsi.
Nel prossimo articolo inizieremo a esaminare più in dettaglio le Code e i Binding.
Link
Fonte: habr.com
