Exchange - scambiatore o puntu di scambiu. I missaghji sò mandati à ellu. Exchangedistribuisce 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.
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 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:
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:
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:
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:
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:
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:
À 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:
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.
Sì creazione exchangehè 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à:
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.