ConillMQ. Part 2. Comprensió dels intercanvis

Exchange — intercanviador o punt d'intercanvi. S'hi envien missatges. Exchange distribueix el missatge en una o més cues. Ell encamina els missatges a una cua basat en les connexions creades (bindings) entre ell i la cua.

Exchange no ho és Procés Erlang. Per raons d'escalabilitat exchange - aquesta és una línia (enllaç a un mòdul amb codi on es troba la lògica d'encaminament) a la base de dades integrada mnèsia. 1 intercanviadors només consumiran 1 MB de memòria.

Taula de continguts

Intercanvi directe

Direct exchange - S'utilitza quan cal lliurar el missatge a cues específiques. El missatge es publica a l'intercanviador amb un missatge específic clau d'encaminament i entra a totes les cues que estan connectades a aquest intercanviador amb una clau d'encaminament similar. La clau d'encaminament és una cadena. La concordança es troba utilitzant comprovant l'equivalència de les cadenes.

Representació gràfica del flux de missatges:

ConillMQ. Part 2. Comprensió dels intercanvis

В rabbitmq hi ha un concepte intercanviador per defecte. El direct exchange sense nom. Si s'utilitza l'intercanviador predeterminat, el missatge s'enviarà a una cua amb un nom igual a clau d'encaminament de missatges.

Intercanvi de temes

Topic exchange – similars direct exchange permet l'encaminament selectiu comparant la clau d'encaminament. Però, en aquest cas, la clau està donada segons la plantilla. Quan creeu una plantilla, feu servir 0 o més paraules (lletres AZ и az i números 0-9), separats per un punt, així com símbols * и #.

  • * - es pot substituir per exactament 1 Sòl
  • # - es pot substituir per 0 o més paraules

Representació gràfica del flux de missatges:

ConillMQ. Part 2. Comprensió dels intercanvis

Des de la versió RabbitMQ 2.4.0 algorisme d'encaminament per topic exchange va començar a treballar fins 145 vegades més ràpid. Ho van aconseguir introduint un enfocament provar la implementació, que implica representar patrons com una estructura d'arbre. Per exemple plantilles a.b.c, a.*.b.c, a.#.c и b.b.c es representarà amb la següent estructura:

ConillMQ. Part 2. Comprensió dels intercanvis

La cerca de la concordança d'un patró es duu a terme a partir de l'arrel i procedint de dalt a baix.

Característiques:

  • l'ús d'aquest intercanviador pot arribar a ser una bona opció per al possible desenvolupament futur de l'aplicació, perquè Les plantilles sempre es poden personalitzar perquè el missatge es publiqui de la mateixa manera direct exchange o fanout exchange
  • plantilles que utilitzen * molt més ràpidque les plantilles que utilitzen #.
  • topic exchange més lent direct exchange

Intercanvi de fanouts

Fanout exchange - tots els missatges s'entreguen a totes les cues encara que s'especifiqui una clau d'encaminament al missatge.

Característiques:

  • RabbitMQ no funciona amb claus i plantilles d'encaminament que té un efecte positiu en la productivitat. Aquest és el més ràpid exchange;
  • tots els consumidors han de poder processar tots els missatges;

Representació gràfica del flux de missatges:

ConillMQ. Part 2. Comprensió dels intercanvis

Intercanvi de capçaleres

Headers exchange - Encamina els missatges a les cues associades basant-se en la comparació de parells de propietats (clau, valor). headers enllaços i propietats de missatge similars. headers és un Dictionary<ключ, значение>.

Si afegiu una clau especial al diccionari x-match amb significat any, llavors el missatge s'encamina si hi ha una coincidència parcial de parells (clau, valor). Aquest comportament és similar al de l'operador or.

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

Clau per defecte x-match conté el valor all. Això vol dir que el missatge s'encamina si els parells (clau, valor) coincideixen exactament. Aquest comportament és similar al de l'operador and.

Representació gràfica del flux de missatges:

ConillMQ. Part 2. Comprensió dels intercanvis

Característiques:

  • flexibilitat addicional
  • sobrecàrrega computacional addicional. Tots els parells (clau, valor) d'un atribut headers s'han d'ordenar pel nom de la clau abans de calcular els valors d'encaminament dels missatges. Més lent que altres tipus d'intercanvi.

Intercanvi de hashing coherent

Aquest intercanviador és connectar и no incorporat в RabbitMQ.

Consistent-hashing exchange (intercanvi amb hashing coherent): s'utilitza quan hi ha diverses cues que són receptors potencials d'un missatge i quan necessiteu equilibrar la càrrega entre elles. La connexió d'un missatge amb la cua es produeix per pes (valor de cadena condicional de 0 - n).

Pes equivalent de les cues - indica que cada cua rebrà aproximadament la mateixa quantitat missatges (cada missatge es col·locarà només en una cua). No hi ha una garantia completa de distribució uniforme dels missatges.

Representació gràfica del flux de missatges:

ConillMQ. Part 2. Comprensió dels intercanvis

Hash calculat en funció de la clau o propietat d'encaminament headers missatges. Si tots els missatges publicats tinguessin claus d'encaminament diferents o headers, aleshores la distribució es produirà per pes. En cas contrari, s'utilitzarà la clau d'encaminament o headers.

Hauria d'ajudar quan el rendiment dels consumidors ha de créixer més que una solució amb diversos consumidors que utilitzen una única cua.

Intercanviadors combinats (E2E)

El comportament de tots els intercanviadors es pot combinar mitjançant la comunicació Intercanvi a intercanvi (la combinació d'intercanviadors no s'inclou a l'especificació AMQP. Aquesta és una extensió del protocol des del costat RabbitMQ).

Representació gràfica del flux de missatges:

ConillMQ. Part 2. Comprensió dels intercanvis

A costa de E2E podem trobar la configuració escalable adequada per satisfer els requisits actuals i creixents.

Crear Exchange

La creació d'un intercanviador es produeix mitjançant síncrons RPC petició al servidor. La sol·licitud es fa mitjançant el mètode Exchange.Declarecridat amb paràmetres:

  • nom de l'intercanviador
  • tipus d'intercanviador
  • altres paràmetres

Exemple de creació exchange mitjançant RabbitMQ.Client:

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

  • exchange — el nom de l'intercanviador que volem crear. El nom ha de ser únic
  • type - tipus d'intercanviador
  • durable - si està instal·lat true, Llavors exchange serà permanent. S'emmagatzemarà al disc i pot sobreviure a un reinici del servidor/agent. Si el valor false, Llavors exchange és temporal i s'eliminarà quan es reiniciï el servidor/agent
  • autoDelete - eliminació automàtica. Exchange s'eliminarà quan s'eliminin totes les cues associades
  • arguments - arguments opcionals. Molt sovint, especifiquen mitjançant arguments alternative exchange (intercanviador alternatiu). Si un missatge no pot viatjar per la ruta original, es pot enviar a un intercanviador alternatiu per ser encaminat per un camí diferent.

ConillMQ. Part 2. Comprensió dels intercanvis

Si creació exchange potser, aleshores el servidor enviarà al client un síncron RPC resposta Exchange.DeclareOk. Si creació és impossible (la sol·licitud va ser denegada Exchange.Declare) doncs el canal es tancarà servidor mitjançant una ordre asíncrona Channel.Close i el client rebrà una excepció OperationInterruptedException, que contindrà el codi d'error i la seva descripció.

S'ha de crear un intercanviador abans de publicar missatges. Si publiqueu un missatge a algun intercanviador inexistent - RabbitMQ l'eliminarà en silenci.

Creació d'Exchange mitjançant GUI

Aneu al tauler d'administració RabbitMQ sota usuari guest (nom d'usuari: guest i contrasenya: guest). Tingueu en compte que l'usuari guest només es pot connectar des de localhost. Ara anem a la pestanya Exchanges i feu clic a Add a new exchange. Ompliu les propietats:

ConillMQ. Part 2. Comprensió dels intercanvis

La majoria de les propietats s'han descrit anteriorment. Aquí observem que si establim Internal, llavors l'intercanvi només es pot utilitzar per E2E. Producer no podrà enviar missatges a aquest intercanvi.

Conclusió

Quan es desenvolupa un sistema, és convenient descriure la topologia encaminament utilitzant un gràfic. Però abans de començar a construir un gràfic, val la pena destacar els camins amb molt trànsit, perquè són ells els que demanen rendiment més elevat (rendiment). A continuació, podeu classificar el trànsit. I només llavors començar a construir.

Si al gràfic construït n'hi ha conjunt finit tecles d'encaminament, llavors val la pena mirar-ne diverses fanout exchange, que són 1:1 relacionats amb la clau d'encaminament. Ho recordem fanout exchange el més ràpid.

Si el nombre de rutes tendeix a l'infinit, llavors hauríeu de parar atenció topic exchange o, si la plantilla no és necessària, podeu seleccionar-la direct exchnge, perquè ell és més ràpid topic exchange.

Combinacions de diferents exchange hauria d'ajudar-te a trobar el correcte configuració escalable, que compleix els requisits del sistema actuals i creixents.

Nombre exchange i les cues han de ser mínimes en comparació amb el nombre de rutes.

En el següent article començarem a entendre les cues i els enllaços amb més detall.

Referències

Font: www.habr.com

Afegeix comentari