RabbitMQ. Part 2. Cumprendi i scambii

Exchange - scambiatore o puntu di scambiu. I missaghji sò mandati à ellu. Exchange distribuisce u messagiu in una o più file. Ellu indirizza i missaghji à una fila basatu annantu à i ligami creati (bindings) trà ellu è a fila.

Exchange ùn hè micca prucessu Erlang. Per ragioni di scalabilità exchange hè una stringa (un ligame à u modulu cù u codice induve a logica di routing hè) in a basa di dati incrustata mnesia. 1 mila scambiatori cunsuma solu 1MB di memoria.

Indice di cuntenutu

  • RabbitMQ. Parte 1. Introduzione. Erlang, AMQP è RPC
  • RabbitMQ. Part 2. Cumprendi i scambii
  • RabbitMQ. Part 3. Capisce i Queues è Bindings
  • RabbitMQ. Part 4. Trattamentu di ciò chì hè missaghji è frames
  • RabbitMQ. Part 5: Publishing and Consuming Message Performance
  • RabbitMQ. Part 6. Overview of the Federation and Shovel Modules
  • RabbitMQ. Part 7. Details about Connection and Chanel
  • RabbitMQ. Part 8. RabbitMQ in .NET
  • RabbitMQ. Part 9. Monitoring

Scambiu direttu

Direct exchange - usatu quandu hè necessariu trasmette un messagiu à file specifiche. U messagiu hè publicatu à u scambiu cù un specificu chjave di routing è entra in tutte e fila chì sò assuciati cù questu scambiatore cù una chjave di routing simili. A chjave di routing hè una stringa. U matching hè fattu usendu verificate e stringhe per l'uguaglianza.

Rappresentazione grafica di u flussu di missaghju:

RabbitMQ. Part 2. Cumprendi i scambii

В rabbitmq ci hè un cuncettu scambiatore predeterminatu. chistu direct exchange senza nome. Se u scambiu predeterminatu hè utilizatu, allora u messagiu serà indirizzatu à una fila cù un nome uguale à chjave di routing di u messagiu.

Scambiu di tema

Topic exchange - simile direct exchange permette un routing selettivu paragunendu a chjave di routing. Ma, in stu casu, a chjave hè datu per mudellu. Quandu crea un mudellu, aduprate 0 o più parolle (lettere AZ и az è numeri 0-9), siparati da un puntu, è ancu simboli * и #.

  • * - pò esse rimpiazzatu cù esattamente 1 a parolla
  • # - pò esse rimpiazzatu da 0 o più parolle

Rappresentazione grafica di u flussu di missaghju:

RabbitMQ. Part 2. Cumprendi i scambii

Partendu da a versione RabbitMQ 2.4.0 algoritmu di routing per topic exchange cuminciò à travaglià finu à 145 volte più veloce. Anu ottenutu questu implementendu l'approcciu prova l'implementazione, chì implica a rapprisintazioni di mudelli cum'è una struttura d'arburu. Per esempiu, mudelli a.b.c, a.*.b.c, a.#.c и b.b.c serà rapprisintatu da a struttura seguente:

RabbitMQ. Part 2. Cumprendi i scambii

A cuncordanza di u mudellu hè cercata partendu da a radica è andendu da cima à fondu.

Funzioni:

  • l'usu di stu scambiatore pò diventà una bona scelta per u futuru sviluppu di l'app, perchè mudelli ponu sempre esse persunalizati in modu chì u messagiu hè publicatu in modu simile direct exchange o fanout exchange
  • mudelli chì utilizanu * assai più velocecà i mudelli chì utilizanu #.
  • topic exchange più lente direct exchange

Scambiu Fanout

Fanout exchange - tutti i missaghji sò mandati à tutte e fila ancu s'è una chjave di routing hè specificatu in u missaghju.

Funzioni:

  • RabbitMQ ùn funziona micca cù chjavi di routing è mudelli chì hà un effettu pusitivu nantu à u rendiment. Questu hè u più veloce exchange;
  • tutti i cunsumatori deve esse capaci di processà tutti i missaghji;

Rappresentazione grafica di u flussu di missaghju:

RabbitMQ. Part 2. Cumprendi i scambii

Scambiu di Headers

Headers exchange - dirige i missaghji à fila cunnessi basatu annantu à un paragone di coppie di proprietà (chiave, valore). headers ubligatoriu è pruprietà di missaghju simili. headers hè una Dictionary<ключ, значение>.

Sè aghjunghje una chjave speciale à u dizziunariu x-match cun significatu any, allura u missaghju hè instradatu se e coppie (chjave, valore) parzialmente currispondenu. Stu cumpurtamentu hè simile à l'operatore or.

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

Chjave predefinita x-match cuntene un valore all. Questu significa chì u missaghju hè instradatu quandu e coppie (chjave, valore) currispondenu cumpletamente. Stu cumpurtamentu hè simile à l'operatore and.

Rappresentazione grafica di u flussu di missaghju:

RabbitMQ. Part 2. Cumprendi i scambii

Funzioni:

  • flessibilità supplementu
  • overhead computazionale supplementu. Tutti i pariglii (chjavi, valore) di l'attributu headers deve esse classificatu per nome di chjave prima di calculà i valori di routing di missaghju. Più lento chè altri tipi di scambiu.

Scambio Hashing Coerente

Stu scambiatore hè cunnettà si и micca custruitu in в RabbitMQ.

Consistent-hashing exchange (scambiu coherente cù l'hash) - utilizatu quandu ci sò parechje file chì sò potenziali destinatarii di un missaghju è quandu avete bisognu di carica equilibriu trà elli. U messagiu hè assuciatu cù a fila per pesu (un valore di stringa cundizionale da 0 - n).

Peso equivalente di fila - indica chì ogni fila riceverà circa a stessa quantità missaghji (ogni missaghju serà messu in una sola fila). Ùn ci hè micca una guaranzia cumpleta di distribuzione uniforme di missaghji.

Rappresentazione grafica di u flussu di missaghju:

RabbitMQ. Part 2. Cumprendi i scambii

Hash calculatu basatu annantu à a chjave di routing o a pruprietà headers missaghji. Sè tutti i missaghji publicati hannu differente chjave routing, o headers, tandu a distribuzione averà da u pesu. Altrimenti, a chjave di routing serà usata, o headers.

Deve aiutà quandu u throughput di i cunsumatori deve cresce più altu ch'è una suluzione cù parechji cunsumatori chì utilizanu a stessa fila.

Combinazione di scambiatori (E2E)

U cumpurtamentu di tutti i scambiatori pò esse cumminati cù a cumunicazione Scambiu à Scambiu (A cumminazione di scambiatori ùn hè micca inclusa in a specificazione AMQP. Questa hè una estensione di protokollu da u latu RabbitMQ).

Rappresentazione grafica di u flussu di missaghju:

RabbitMQ. Part 2. Cumprendi i scambii

À u detrimentu di E2E pudemu truvà a cunfigurazione scalabile ghjustu chì risponde à e esigenze attuali è crescente.

Crea un scambiu

U scambiu hè creatu cù un sincronu RPC dumanda à u servitore. A dumanda hè fatta cù u metudu Exchange.Declarechjamatu cù parametri:

  • nome di scambiatore
  • tipu di scambiatore
  • altre opzioni

Esempiu di creazione exchange cun l'aiutu di RabbitMQ.Client:

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

  • exchange - u nome di u scambiu chì vulemu creà. U nome deve esse unicu
  • type - tipu di scambiatore
  • durable - se stallatu true, allura exchange serà permanente. Serà guardatu nantu à u discu è puderà sopravvive à un riavviu di u servitore / broker. Se u valore false, allura exchange hè tempurale è serà eliminatu quandu u servitore / broker hè riavviatu
  • autoDelete - eliminazione automatica. Exchange serà sguassatu quandu tutte e file associate sò sguassate
  • arguments sò argumenti opzionali. A maiò spessu, per mezu di l'argumenti stabiliti alternative exchange (scambiatore alternativu). Se un missaghju ùn pò micca passà per a strada originale, pò esse mandatu à un scambiu alternativu per esse instradatu per una strada diversa.

RabbitMQ. Part 2. Cumprendi i scambii

Sì creazione exchange hè possibile, allura u servitore mandarà à u cliente una sincronia RPC risposta Exchange.DeclareOk. Sì creazione hè impussibule (Ci hè statu un rifiutu nantu à a dumanda Exchange.Declare), allora u canale si chjuderà servitore utilizendu un cumandamentu asincronu Channel.Close è u cliente riceverà una eccezzioni OperationInterruptedException, chì cuntene u codice d'errore è a so descrizzione.

Un scambiatore deve esse creatu prima di publicà. Se pubblicate un missaghju à qualchì scambiatore inesistente - RabbitMQ sguassate in silenziu.

Crea una GUI di scambiu

Andà à u panel admin RabbitMQ sottu utilizatore guest (nome d'utilizatore: guest è password: guest). Per piacè nutate chì l'utilizatore guest pò cunnette solu da u locale host. Avà andemu à a tabulazione Exchanges è cliccate nant'à Add a new exchange. Inserite e proprietà:

RabbitMQ. Part 2. Cumprendi i scambii

A maiò parte di e pruprietà sò state descritte sopra. Quì avemu nutatu chì si avemu stabilitu Internal, allura u scambiu pò esse usatu solu per E2E. Producer ùn sarà capaci di mandà missaghji à un tali scambiu.

cunchiusioni

Quandu si sviluppa un sistema, hè cunvenutu di discrìviri a topologia routing usendu un graficu. Ma prima di principià à custruisce un gràficu, vale a pena mette in risaltu i chjassi cù trafficu altu, perchè. anu bisognu throughput più altu (prestazioni). Dopu, pudete classificà u trafficu. E poi cumincià à custruisce.

Sè in u grafficu custruitu ci esiste set finitu chjavi di routing, dunque, vale a pena guardà versu parechji fanout exchange, chì sò 1: 1 in relazione à a chjave di routing. Ricurdativi chì fanout exchange u più veloce.

Se u numeru di rotte tende à l'infinitu, vale a pena attenti topic exchange o, se u mudellu ùn hè micca necessariu, pudete sceglie direct exchnge, perchè ellu hè più veloce topic exchange.

Cumbinazioni di varii exchange duverebbe aiutà à truvà u dirittu. cunfigurazione scalabile, chì risponde à i requisiti di u sistema attuale è crescente.

Numeru di exchange e fila deve esse minimu paragunatu à u numeru di rotte.

In u prossimu articulu, avemu da principià à capisce di più circa Queues and Bindings.

referenze

Source: www.habr.com

Add a comment