RabbitMQ. Parte 2. Approfondiamo gli Exchanges

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 è un processo Erlang. Per motivi di scalabilità exchange è una stringa (riferimento al modulo con il codice, dove risiede la logica di instradamento) nel database incorporato mnesia. 1.000 punti di scambio consumeranno solo 1MB di memoria.

Indice

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:

RabbitMQ. Parte 2. Approfondiamo gli Exchanges

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 esattamente 1 una parola
  • # — può essere sostituito con 0 una o più parole

Rappresentazione grafica del flusso di messaggi:

RabbitMQ. Parte 2. Approfondiamo gli Exchanges

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 trie implementation, 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:

RabbitMQ. Parte 2. Approfondiamo gli Exchanges

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 exchange o fanout exchange
  • i modelli utilizzati * molto più velocemente, rispetto ai modelli utilizzati #.
  • topic exchange più lentamente direct exchange

Fanout Exchange

Fanout exchangetutti i messaggi vengono recapitati in tutte le code anche se nel messaggio è stato specificato una chiave di routing.

Caratteristiche:

  • RabbitMQ non funziona con chiavi di routing e modelli che influisce positivamente sulle prestazioni. È il più veloce exchange;
  • tutti i consumatori devono essere in grado di elaborare tutti i messaggi;

Rappresentazione grafica del flusso di messaggi:

RabbitMQ. Parte 2. Approfondiamo gli Exchanges

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:

RabbitMQ. Parte 2. Approfondiamo gli Exchanges

Caratteristiche:

  • ulteriore flessibilità
  • ulteriori sovraccarichi di calcolo. Tutte le coppie (chiave, valore) dell'attributo headers devono 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 è un plugin 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:

RabbitMQ. Parte 2. Approfondiamo gli Exchanges

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:

RabbitMQ. Parte 2. Approfondiamo gli Exchanges

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 RabbitMQ.Client:

//...
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 unico
  • type è il tipo di exchange
  • durable se impostato true, allora exchange sarà permanente. Sarà memorizzato su disco e potrà sopravvivere al riavvio del server/broker. Se il valore false, allora exchange è temporaneo e verrà eliminato quando il server/broker verrà riavviato
  • autoDelete è la cancellazione automatica. Scambio verrà eliminato quando verranno eliminate tutte le code ad esso associate
  • arguments sono argomenti facoltativi. Più spesso, attraverso gli argomenti si impostano alternative 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.

RabbitMQ. Parte 2. Approfondiamo gli Exchanges

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 OperationInterruptedException, 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à:

RabbitMQ. Parte 2. Approfondiamo gli Exchanges

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 di instradamento 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

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster