ConiglioMQ. Parte 2. Comprensione degli scambi

Exchange - scambiatore o punto di scambio. Gli vengono inviati messaggi. Exchange distribuisce il messaggio in una o più code. Lui instrada i messaggi a una coda in base ai collegamenti creati (bindings) tra esso e la coda.

Exchange non è Processo Erlang. Per ragioni di scalabilità exchange è una stringa (collegamento al modulo con il codice in cui si trova la logica di instradamento) nel database integrato memoria. 1mila scambiatori consumeranno solo 1 MB di memoria.

Sommario

Scambio diretto

Direct exchange - usato quando necessario consegnare un messaggio a code specifiche. Il messaggio viene pubblicato sullo scambiatore con uno specifico chiave di instradamento ed entra in tutte le code associate a questo scambiatore con una chiave di instradamento simile. La chiave di routing è una stringa. L'abbinamento viene effettuato utilizzando controllare l'uguaglianza delle stringhe.

Rappresentazione grafica del flusso di messaggi:

ConiglioMQ. Parte 2. Comprensione degli scambi

В rabbitmq c'è un concetto scambiatore predefinito. Essa direct exchange senza nome. Se viene utilizzato lo scambiatore predefinito, il messaggio verrà instradato su una coda con un nome uguale a chiave di instradamento dei messaggi.

Scambio di argomenti

Topic exchange - simile direct exchange abilita il routing selettivo confrontando la chiave di routing. Ma in questo caso la chiave è data per modello. Quando crei un modello, usa 0 o più parole (lettere AZ и az e numeri 0-9), separati da un punto, nonché simboli * и #.

  • * - può essere sostituito con esattamente 1 parola
  • # - può essere sostituito da 0 o più parole

Rappresentazione grafica del flusso di messaggi:

ConiglioMQ. Parte 2. Comprensione degli scambi

A partire dalla versione RabbitMQ 2.4.0 algoritmo di routing per topic exchange ha iniziato a lavorare fino al 145 volte più veloce. Hanno raggiunto questo obiettivo implementando l’approccio prova l'implementazione, che implica la rappresentazione dei modelli come una struttura ad albero. Ad esempio i modelli a.b.c, a.*.b.c, a.#.c и b.b.c sarà rappresentato dalla seguente struttura:

ConiglioMQ. Parte 2. Comprensione degli scambi

La ricerca della corrispondenza del modello viene effettuata partendo dalla radice e procedendo dall'alto verso il basso.

Caratteristiche:

  • l'uso di questo scambiatore può diventare una buona scelta per un possibile sviluppo futuro di app, Perché i modelli possono sempre essere personalizzati in modo che il messaggio venga pubblicato in modo simile direct exchange o fanout exchange
  • modelli che utilizzano * più velocerispetto ai modelli che utilizzano #.
  • topic exchange più lento direct exchange

Scambio di fanout

Fanout exchange - tutti i messaggi vengono recapitati a tutte le code anche se nel messaggio è specificata una chiave di instradamento.

Caratteristiche:

  • RabbitMQ non funziona con chiavi di routing e modelli che ha un effetto positivo sulle prestazioni. Questo è il più veloce exchange;
  • tutti i consumatori devono essere in grado di elaborare tutti i messaggi;

Rappresentazione grafica del flusso di messaggi:

ConiglioMQ. Parte 2. Comprensione degli scambi

Scambio di intestazioni

Headers exchange - instrada i messaggi alle code correlate in base a un confronto di coppie di proprietà (chiave, valore). headers proprietà di messaggio vincolante e simile. headers Rappresenta Dictionary<ключ, значение>.

Se aggiungi una chiave speciale al dizionario x-match con significato any, il messaggio viene instradato se le coppie (chiave, valore) corrispondono parzialmente. Questo comportamento è simile a quello dell'operatore or.

var bindingArguments = new Dictinary<String, Object>();
bindingArguments.add("x-match", "any");

Chiave predefinita x-match contiene un valore all. Ciò significa che il messaggio viene instradato quando le coppie (chiave, valore) corrispondono completamente. Questo comportamento è simile a quello dell'operatore and.

Rappresentazione grafica del flusso di messaggi:

ConiglioMQ. Parte 2. Comprensione degli scambi

Caratteristiche:

  • ulteriore flessibilità
  • ulteriore sovraccarico computazionale. Tutte le coppie (chiave, valore) dell'attributo headers deve essere ordinato per nome chiave prima di calcolare i valori di instradamento dei messaggi. Più lento rispetto ad altri tipi di scambio.

Scambio di hashing coerente

Questo scambiatore è collegare и non integrato в RabbitMQ.

Consistent-hashing exchange (scambio hash-coerente): utilizzato quando sono presenti più code che sono potenziali destinatari di un messaggio e quando è necessario bilanciare il carico tra di esse. Il messaggio è associato alla coda in base al peso (un valore di stringa condizionale da 0 - n).

Peso equivalente delle code: indica che ciascuna coda riceverà circa lo stesso importo messaggi (ogni messaggio verrà inserito in una sola coda). Non esiste una garanzia completa di distribuzione uniforme dei messaggi.

Rappresentazione grafica del flusso di messaggi:

ConiglioMQ. Parte 2. Comprensione degli scambi

Hash calcolato in base alla chiave o alla proprietà di routing headers messaggi. Se tutti i messaggi pubblicati avessero chiavi di instradamento diverse, o headers, allora la distribuzione avverrà in peso. In caso contrario, verrà utilizzata la chiave di routing, o headers.

Dovrebbe essere utile quando il throughput dei consumatori deve aumentare rispetto a una soluzione con più consumatori che utilizzano la stessa coda.

Combinazione di scambiatori (E2E)

Il comportamento di tutti gli scambiatori può essere combinato tramite la comunicazione Da scambio a scambio (la combinazione di scambiatori non è inclusa nella specifica AMQP. Questa è un'estensione del protocollo laterale RabbitMQ).

Rappresentazione grafica del flusso di messaggi:

ConiglioMQ. Parte 2. Comprensione degli scambi

attraverso E2E possiamo trovare la giusta configurazione scalabile che soddisfi sia i requisiti attuali che quelli in crescita.

Crea uno scambio

Lo scambiatore viene creato utilizzando un sistema sincrono RPC richiesta al server. La richiesta viene effettuata utilizzando il metodo Exchange.Declare, chiamato con parametri:

  • nome dello scambiatore
  • tipo di scambiatore
  • altre opzioni

Esempio di creazione exchange con RabbitMQ.Client:

//...
channel.ExchangeDeclare(
    exchange: "my_exchange",
    type: "direct",
    durable: "false",
    autoDelete: "false",
    arguments: null
);
//...

  • exchange - il nome dello scambiatore che vogliamo creare. Il nome deve essere univoco
  • type - tipologia di scambiatore
  • durable - se installato truepoi exchange sarà permanente. Verrà archiviato su disco e sarà in grado di sopravvivere al riavvio del server/broker. Se il valore falsepoi exchange è temporaneo e verrà rimosso al riavvio del server/broker
  • autoDelete - cancellazione automatica. Exchange verrà eliminato quando tutte le code associate verranno eliminate
  • arguments sono argomenti facoltativi. Molto spesso, attraverso gli argomenti impostati alternative exchange (scambiatore alternativo). Se un messaggio non può seguire il percorso originale, può essere inviato a uno scambio alternativo per essere instradato lungo un percorso diverso.

ConiglioMQ. Parte 2. Comprensione degli scambi

Se la creazione exchange forse, quindi il server invierà al client un file sincrono RPC risposta Exchange.DeclareOk. Se la creazione impossibile (c'è stato un rifiuto sulla richiesta Exchange.Declare) poi il canale si chiuderà server utilizzando un comando asincrono Channel.Close e il client riceverà un'eccezione OperationInterruptedException, che conterrà il codice di errore e la relativa descrizione.

È necessario creare uno scambiatore prima della pubblicazione. Se pubblichi un messaggio a uno scambiatore inesistente - RabbitMQ rimuoverlo silenziosamente.

Creare una GUI di Exchange

Vai al pannello di amministrazione RabbitMQ sotto utente guest (nome utente: guest e parola d'ordine: guest). Si prega di notare che l'utente guest può connettersi solo da localhost. Passiamo ora alla scheda Exchanges e fare clic su Add a new exchange. Compila le proprietà:

ConiglioMQ. Parte 2. Comprensione degli scambi

La maggior parte delle proprietà sono state descritte sopra. Qui notiamo che se impostiamo Internal, lo scambio può essere utilizzato solo per E2E. Producer non sarà in grado di inviare messaggi a tale scambio.

conclusione

Quando si sviluppa un sistema, è conveniente descriverne la topologia instradamento utilizzando un grafico. Ma prima di iniziare a costruire un grafico, vale la pena evidenziare i percorsi ad alto traffico, perché. richiedono rendimento più elevato (prestazione). Successivamente, puoi classificare il traffico. E poi iniziare a costruire.

Se nel grafico costruito esiste insieme finito chiavi di instradamento, quindi, vale la pena considerarne diverse fanout exchange, che sono correlati 1:1 alla chiave di routing. Ricordati che fanout exchange il più veloce.

Se il numero di percorsi tende all'infinito, vale la pena prestare attenzione topic exchange oppure, se il modello non è necessario, puoi scegliere tu direct exchnge, Perché è più veloce topic exchange.

Combinazioni di vario exchange dovrebbe aiutarti a trovare quello giusto. configurazione scalabile, che soddisfa sia i requisiti di sistema attuali che quelli in crescita.

numero exchange e le code dovrebbero essere minime rispetto al numero di percorsi.

Nel prossimo articolo inizieremo a capire di più su code e associazioni.

riferimenti

Fonte: habr.com

Aggiungi un commento