Scambio — un exchange o un punto di scambio. Qui vengono inviati i messaggi. Scambio distribuisce il messaggio in una o più code. Esso instrada i messaggi alla coda sulla base delle relazioni create (bindings) tra di esso e la coda.
Scambio non è . Per motivi di scalabilità exchange — è una stringa (un collegamento al modulo di codice, dove si trova la logica di instradamento) nel database incorporato . 1.000 exchange consumeranno solo 1MB di memoria.
Indice
- RabbitMQ. Parte 3. Approfondiamo Queues e Bindings
- RabbitMQ. Parte 4. Analizziamo cosa sono i messaggi e i frame
- RabbitMQ. Parte 5. Performance di pubblicazione e consumo dei messaggi
- RabbitMQ. Parte 6. Panoramica sui moduli Federation e Shovel
- RabbitMQ. Parte 7. Dettagli su Connection e Channel
- RabbitMQ. Parte 8. RabbitMQ in .NET
- RabbitMQ. Parte 9. Monitoraggio
Scambio Diretto
Scambio diretto — viene utilizzato quando è necessario consegnare un messaggio a code specifiche.Il messaggio viene pubblicato nell'exchange con un chiave di instradamento e arriva a tutte le code collegate a questo exchange tramite la stessa chiave di instradamento. La chiave di instradamento è una stringa. La corrispondenza avviene tramite il controllo di equivalenza delle stringhe..
Rappresentazione grafica del flusso dei messaggi:

In rabbitmq esiste il concetto di exchange di default. Questa direct exchange senza nome. Se viene utilizzato l'exchange di default, il messaggio verrà instradato alla coda con un nome uguale alla chiave di instradamento del messaggio..
Scambio per Argomento
Topic exchange – simile a direct exchange consente l'implementazione di instradamento selettivo attraverso il confronto della chiave di instradamento. Tuttavia, in questo caso, la chiave è definita da un modello. Durante la creazione del modello si utilizzano 0 una o più parole (lettere AZ e az e numeri 0-9), separate da un punto, oltre a simboli * e #.
*— può essere sostituito con esattamente1una parola#— può essere sostituito con0una o più parole
Rappresentazione grafica del flusso dei messaggi:

A partire dalla versione RabbitMQ 2.4.0 l'algoritmo di instradamento per il topic exchange ha iniziato a funzionare fino a 145 volte più veloce. Questo è stato ottenuto implementando l'approccio , che implica rappresentare i modelli sotto forma di una struttura ad albero. Ad esempio, i modelli a.b.c, a.*.b.c, a.#.c e b.b.c saranno rappresentati dalla seguente struttura:

La ricerca di corrispondenza con il modello avviene dall'alto verso il basso, partendo dalla radice.
Caratteristiche:
- l'uso di questo exchange potrebbe rivelarsi una buona scelta per un possibile futuro sviluppo dell'applicazione, poiché i modelli possono sempre essere configurati in modo che il messaggio venga pubblicato analogamente a
direct exchangeofanout exchange - modelli che utilizzano
*molto più veloce, rispetto ai modelli che utilizzano#. il topic exchangepiù lentamentedirect exchange
Fanout Exchange
Fanout exchange – tutti i messaggi vengono consegnati a tutte le code anche se nel messaggio è stata definita una chiave di instradamento.
Caratteristiche:
RabbitMQnon funziona con le chiavi di routing e i 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 dei messaggi:

Headers Exchange
Headers exchange invia i messaggi nelle code correlate sulla base del confronto delle coppie (chiave, valore) delle proprietà headers binding e proprietà simili del messaggio. headers è rappresentato da Dictionary.
Se si aggiunge una chiave speciale al dizionario x-match con il valore any, il messaggio viene instradato in caso di corrispondenza parziale delle coppie (chiave, valore). Questo comportamento è analogo all'operatore or.
var bindingArguments = new Dictionary();
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 completa delle coppie (chiave, valore). Questo comportamento è analogo all'operatore and.
Rappresentazione grafica del flusso dei messaggi:

Caratteristiche:
- flessibilità aggiuntiva
- costi aggiuntivi di calcolo. Tutte le coppie (chiave, valore) dell'attributo
headersdevono essere ordinate per nome della chiave prima di calcolare i valori di routing del messaggio. Più lento rispetto ad altri tipi di exchange.
Consistent-Hashing Exchange
Questo exchange è e non incorporato in RabbitMQ.
Consistent-hashing exchange (exchange con hash concordato) – utilizzato quando ci sono più code che sono potenziali destinatari del messaggio e quando è necessario bilanciare il carico tra di esse. La connessione del messaggio alla coda avviene in base al peso (un valore di stringa condizionale da 0 - n).
Il peso equivalente delle code indica che in ciascuna coda arriverà circa lo stesso numero di messaggi (ogni messaggio sarà posizionato in una sola coda). Non c'è alcuna garanzia completa di distribuzione uniforme dei messaggi.
Rappresentazione grafica del flusso dei messaggi:

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

Attraverso E2E , possiamo trovare la configurazione scalabile appropriata che soddisfi sia le esigenze attuali che quelle crescenti.
Creazione Exchange
La creazione di un exchange avviene tramite una declarazione sincrona richiesta RPC al server. La richiesta viene effettuata utilizzando il metodo Exchange.Declare, chiamato con i seguenti parametri:
- nome dell'exchange
- tipo di exchange
- altri parametri
Esempio di creazione exchange con l'aiuto di :
//...
channel.ExchangeDeclare(
exchange: "my_exchange",
type: "direct",
durable: "false",
autoDelete: "false",
arguments: null
);
//...exchange— nome dell'exchange che desideriamo creare. Il nome deve essere unicotype— tipo di exchangedurable— se impostatotrue, alloraexchangesarà persistente. Sarà memorizzato su disco e potrà sopravvivere al riavvio del server/broker. Se il valorefalse, alloraexchangeè temporaneo e sarà rimosso quando il server/broker verrà riavviatoautoDelete— cancellazione automatica.Scambioverrà rimosso quando tutte le code correlate verranno eliminateargomenti— argomenti facoltativi. Più spesso, attraverso gli argomenti si impostanoalternative exchange(exchange alternativo). Se il messaggio non può seguire il percorso iniziale, può essere inviato a un exchange alternativo per la routizzazione su un altro percorso.

Se la creazione exchange è possibile, il server invierà al cliente una risposta sincrona richiesta RPC risposta Exchange.DeclareOk. Se la creazione non è possibile (si è verificato un errore nella richiesta Exchange.Declare), allora il canale verrà chiuso da parte del server avviene tramite un comando asincrono Channel.Close e il cliente riceverà un'eccezione , che conterrà il codice di errore e la sua descrizione.
L'exchange deve essere creato prima di pubblicare i messaggi. Se pubblichi un messaggio in un exchange che non esiste — RabbitMQ verrà silenziosamente rimosso.
Creazione di un Exchange tramite interfaccia grafica
Accediamo al pannello di amministrazione RabbitMQ con l'utente guest (username: guest e password: guest). Si prega di notare che l'utente guest può collegarsi solo dall'host locale. Procediamo ora alla scheda Exchanges e facciamo clic su Aggiungi un nuovo exchange. Compiliamo le proprietà:

La maggior parte delle proprietà è stata descritta in precedenza. Qui notiamo che se imposti Interno, l'exchange potrà essere utilizzato solo per E2E. Producer non sarà in grado di inviare messaggi a tale exchange.
Conclusione
Quando sviluppi il sistema, è utile descrivere la topologia utilizzando un grafo. Ma prima di iniziare a costruire il grafo, è importante evidenziare i percorsi ad alto traffico, poiché sono quelli che richiedono una maggiore capacità di trasmissione (prestazioni). Successivamente, puoi classificare il traffico. E poi procedere con la costruzione.
Se nel grafo costruito esiste un insieme finito di chiavi di instradamento, allora vale la pena considerare diverse fanout exchange, che sono collegate 1:1 con la chiave di instradamento. Ricordiamo che fanout exchange è il più veloce.
Se il numero di percorsi tende all'infinito, allora è opportuno prestare attenzione a il topic exchange o, se il modello non è necessario, puoi scegliere direct exchange, poiché è più veloce il topic exchange.
Combinazioni di diversi exchange dovrebbero aiutare a trovare la soluzione giusta. configurazione scalabile, che soddisfa sia le esigenze attuali che quelle in crescita del sistema.
Quantità exchange e le code devono essere minime rispetto al numero di route.
Nell'articolo successivo, inizieremo a esplorare più in dettaglio le Code e i Bindings.
Link
Fonte: habr.com
