RabbitMQ. Bahagi 2. Pag-unawa sa Pagpapalitan

Exchange β€” exchanger o exchange point. Ang mga mensahe ay ipinadala dito. Exchange namamahagi ng mensahe sa isa o higit pang mga pila. Siya ruta ng mga mensahe sa isang pila batay sa mga nilikhang koneksyon (bindings) sa pagitan niya at ng pila.

Exchange ay hindi Erlang proseso. Para sa mga dahilan ng scalability exchange - ito ay isang linya (link sa isang module na may code kung saan ang routing logic ay namamalagi) sa built-in na database mnesia. Ang 1 libong exchanger ay kumonsumo lamang ng 1MB ng memorya.

Talaan ng nilalaman

  • RabbitMQ. Bahagi 1. Panimula. Erlang, AMQP at RPC
  • RabbitMQ. Bahagi 2. Pag-unawa sa Pagpapalitan
  • RabbitMQ. Bahagi 3. Pag-unawa sa Queues at Bindings
  • RabbitMQ. Bahagi 4. Pag-unawa kung ano ang mga mensahe at frame
  • RabbitMQ. Bahagi 5: Pag-publish ng Mensahe at Pagganap ng Pagkonsumo
  • RabbitMQ. Bahagi 6. Pagsusuri ng mga module ng Federation at Shovel
  • RabbitMQ. Bahagi 7. Mga Detalye tungkol sa Koneksyon at Chanel
  • RabbitMQ. Bahagi 8. RabbitMQ sa .NET
  • RabbitMQ. Bahagi 9. Pagsubaybay

Direktang Pagpapalitan

Direct exchange - ginagamit kapag kailangan maghatid ng mensahe sa mga partikular na pila. Ang mensahe ay nai-publish sa exchanger na may isang tiyak susi sa pagruruta at pumapasok sa lahat ng mga pila na konektado sa exchanger na ito na may katulad na routing key. Ang routing key ay isang string. Ang pagtutugma ay matatagpuan gamit pagsuri ng mga string para sa pagkakapareho.

Graphical na representasyon ng daloy ng mensahe:

RabbitMQ. Bahagi 2. Pag-unawa sa Pagpapalitan

Π’ rabbitmq may konsepto default exchanger. Ito direct exchange walang pangalan. Kung ginamit ang default exchanger, iruruta ang mensahe sa isang queue na may pangalan na katumbas ng susi sa pagruruta ng mensahe.

Pagpapalitan ng Paksa

Topic exchange - katulad direct exchange pinapagana ang selective routing sa pamamagitan ng paghahambing ng routing key. Ngunit, sa kasong ito, ang susi ay ibinigay ayon sa template. Kapag gumagawa ng isang template, gamitin 0 o higit pang mga salita (mga titik AZ ΠΈ az at mga numero 0-9), na pinaghihiwalay ng isang tuldok, gayundin ng mga simbolo * ΠΈ #.

  • * - maaaring mapalitan ng eksakto 1 ang salita
  • # - maaaring palitan ng 0 o higit pang mga salita

Graphical na representasyon ng daloy ng mensahe:

RabbitMQ. Bahagi 2. Pag-unawa sa Pagpapalitan

Mula sa bersyon RabbitMQ 2.4.0 routing algorithm para sa topic exchange nagsimulang magtrabaho hanggang 145 beses na mas mabilis. Nakamit nila ito sa pamamagitan ng pagpapakilala ng isang diskarte subukan ang pagpapatupad, na kinabibilangan ng pagrepresenta ng mga pattern bilang istraktura ng puno. Halimbawa ng mga template a.b.c, a.*.b.c, a.#.c ΠΈ b.b.c ay kinakatawan ng sumusunod na istraktura:

RabbitMQ. Bahagi 2. Pag-unawa sa Pagpapalitan

Ang paghahanap para sa pagtutugma ng isang pattern ay isinasagawa simula sa ugat at nagpapatuloy mula sa itaas hanggang sa ibaba.

Mga Tampok:

  • ang paggamit ng exchanger na ito ay maaaring maging isang magandang pagpipilian para sa posibleng pagbuo ng application sa hinaharap, dahil Ang mga template ay maaaring palaging ipasadya upang ang mensahe ay nai-publish sa parehong paraan direct exchange o fanout exchange
  • mga template na gumagamit * mas mabiliskaysa sa mga template na gumagamit #.
  • topic exchange mas mabagal direct exchange

Fanout Exchange

Fanout exchange - lahat ng mensahe ay naihatid sa lahat ng pila kahit na ang isang routing key ay tinukoy sa mensahe.

Mga Tampok:

  • RabbitMQ ay hindi gumagana sa mga routing key at template na may positibong epekto sa pagiging produktibo. Ito ang pinakamabilis exchange;
  • lahat ng mga mamimili ay dapat na maproseso ang lahat ng mga mensahe;

Graphical na representasyon ng daloy ng mensahe:

RabbitMQ. Bahagi 2. Pag-unawa sa Pagpapalitan

Pagpapalitan ng mga Header

Headers exchange - ruta ng mga mensahe sa nauugnay na mga pila batay sa paghahambing ng (key, value) na mga pares ng property headers mga binding at katulad na katangian ng mensahe. headers ay isang Dictionary<ΠΊΠ»ΡŽΡ‡, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅>.

Kung nagdagdag ka ng espesyal na susi sa diksyunaryo x-match may kahulugan any, pagkatapos ay iruruta ang mensahe kung mayroong bahagyang tugma ng (key, value) na mga pares. Ang pag-uugali na ito ay katulad ng operator or.

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

Default na key x-match naglalaman ng halaga all. Nangangahulugan ito na ang mensahe ay iruruta kung eksaktong tumutugma ang mga pares ng (key, value). Ang pag-uugali na ito ay katulad ng operator and.

Graphical na representasyon ng daloy ng mensahe:

RabbitMQ. Bahagi 2. Pag-unawa sa Pagpapalitan

Mga Tampok:

  • karagdagang flexibility
  • karagdagang computational overhead. Lahat ng (key, value) na pares ng isang attribute headers dapat pagbukud-bukurin ayon sa pangalan ng key bago kalkulahin ang mga halaga ng pagruruta ng mensahe. Mas mabagal kaysa sa iba pang uri ng palitan.

Consistent-Hashing Exchange

Ang exchanger na ito ay isaksak ΠΈ hindi built in Π² RabbitMQ.

Consistent-hashing exchange (palitan na may pare-parehong pag-hash) - ginagamit kapag may ilang mga pila na potensyal na tatanggap ng isang mensahe, at kapag kailangan mong balansehin ang pagkarga sa pagitan ng mga ito. Ang koneksyon ng isang mensahe sa queue ay nangyayari ayon sa timbang (conditional string value mula sa 0 - n).

Katumbas na bigat ng mga pila - nagsasaad na ang bawat pila ay makakatanggap humigit-kumulang sa parehong halaga mga mensahe (bawat mensahe ay ilalagay lamang sa isang pila). Walang kumpletong garantiya ng pare-parehong pamamahagi ng mga mensahe.

Graphical na representasyon ng daloy ng mensahe:

RabbitMQ. Bahagi 2. Pag-unawa sa Pagpapalitan

Hash kinakalkula batay sa routing key o property headers mga mensahe. Kung ang lahat ng nai-publish na mensahe ay may iba't ibang routing key o headers, pagkatapos ang pamamahagi ay magaganap ayon sa timbang. Kung hindi, ang routing key ay gagamitin o headers.

Dapat makatulong kapag kailangang lumaki ang throughput ng consumer kaysa sa isang solusyon na may maraming consumer gamit ang isang queue.

Pinagsasama-sama ang mga exchanger (E2E)

Ang pag-uugali ng lahat ng mga exchanger ay maaaring pagsamahin gamit ang komunikasyon Exchange-to-Exchange (Ang pagsasama-sama ng mga exchanger ay hindi kasama sa detalye AMQP. Ito ay isang extension ng protocol mula sa gilid RabbitMQ).

Graphical na representasyon ng daloy ng mensahe:

RabbitMQ. Bahagi 2. Pag-unawa sa Pagpapalitan

Sa halagang E2E mahahanap natin ang tamang scalable na configuration para matugunan ang kasalukuyan at lumalaking mga kinakailangan.

Lumikha ng Exchange

Ang paglikha ng isang exchanger ay nangyayari gamit ang synchronous RPC kahilingan sa server. Ang kahilingan ay ginawa gamit ang pamamaraan Exchange.Declaretinatawag na may mga parameter:

  • pangalan ng exchanger
  • uri ng exchanger
  • iba pang mga parameter

Halimbawa ng paglikha exchange sa tulong RabbitMQ.Client:

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

  • exchange β€” ang pangalan ng exchanger na gusto naming likhain. Ang pangalan ay dapat na natatangi
  • type - uri ng exchanger
  • durable - kung naka-install true, Pagkatapos exchange magiging permanente. Ito ay maiimbak sa disk at maaaring makaligtas sa pag-restart ng server/broker. Kung ang halaga false, Pagkatapos exchange ay pansamantala at tatanggalin kapag ang server/broker ay na-reboot
  • autoDelete - awtomatikong pag-alis. Exchange ay tatanggalin kapag ang lahat ng mga pila na nauugnay dito ay tinanggal
  • arguments - mga opsyonal na argumento. Kadalasan, tinutukoy nila sa pamamagitan ng mga argumento alternative exchange (alternatibong exchanger). Kung ang isang mensahe ay hindi maaaring maglakbay kasama ang orihinal na ruta, maaari itong ipadala sa isang kahaliling exchanger upang iruta sa ibang landas.

RabbitMQ. Bahagi 2. Pag-unawa sa Pagpapalitan

Kung ang paglikha exchange marahil, pagkatapos ay ipapadala ng server ang kliyente ng sabaysabay RPC sagutin Exchange.DeclareOk. Kung ang paglikha ay imposible (tinanggihan ang kahilingan Exchange.Declare) pagkatapos magsasara ang channel server gamit ang isang asynchronous na utos Channel.Close at ang kliyente ay makakatanggap ng eksepsiyon OperationInterruptedException, na maglalaman ng error code at paglalarawan nito.

Dapat gumawa ng exchanger bago mag-post ng mga mensahe. Kung nag-publish ka ng mensahe sa ilang hindi umiiral na exchanger - RabbitMQ tahimik na tatanggalin ito.

Paglikha ng Exchange sa pamamagitan ng GUI

Pumunta sa admin panel RabbitMQ sa ilalim ng gumagamit guest (username: guest at password: guest). Mangyaring tandaan na ang gumagamit guest maaari lamang kumonekta mula sa localhost. Ngayon pumunta tayo sa tab Exchanges at mag-click sa Add a new exchange. Punan ang mga katangian:

RabbitMQ. Bahagi 2. Pag-unawa sa Pagpapalitan

Karamihan sa mga katangian ay inilarawan sa itaas. Dito natin tandaan na kung itinakda natin Internal, kung gayon ang palitan ay magagamit lamang para sa E2E. Producer ay hindi makakapagpadala ng mga mensahe sa naturang palitan.

Konklusyon

Kapag bumubuo ng isang sistema, ito ay maginhawa upang ilarawan ang topology pagruruta gamit ang isang graph. Ngunit bago ka magsimulang bumuo ng isang graph, sulit na i-highlight ang mga landas na may mataas na trapiko, dahil sila ang nagdedemand mas mataas na throughput (pagganap). Susunod, maaari mong uriin ang trapiko. At pagkatapos lamang magsimulang magtayo.

Kung sa nabuong graph ay mayroon may hangganan na hanay mga routing key, pagkatapos ay sulit na tumingin sa ilan fanout exchange, na 1:1 na nauugnay sa routing key. Naaalala namin iyon fanout exchange ang pinakamabilis.

Kung ang bilang ng mga ruta may posibilidad na infinity, pagkatapos ay dapat mong bigyang pansin topic exchange o, kung hindi kailangan ang template, maaari kang pumili direct exchnge, dahil mas mabilis siya topic exchange.

Mga kumbinasyon ng iba't ibang exchange dapat makatulong sa iyo na mahanap ang tama nasusukat na pagsasaayos, na nakakatugon sa kasalukuyan at lumalagong mga kinakailangan ng system.

Numero exchange at ang mga pila ay dapat na minimal kumpara sa bilang ng mga ruta.

Sa susunod na artikulo ay sisimulan nating maunawaan ang mga Queue at Bindings nang mas detalyado.

sanggunian

Pinagmulan: www.habr.com

Magdagdag ng komento