RabbitMQ. Sehemu ya 2. Kuelewa Mabadilishano

Exchange - kibadilishaji au sehemu ya kubadilishana. Ujumbe hutumwa kwake. Exchange inasambaza ujumbe katika foleni moja au zaidi. Yeye huelekeza ujumbe kwenye foleni kulingana na miunganisho iliyoundwa (bindings) kati yake na foleni.

Exchange sio Mchakato wa Erlang. Kwa sababu za scalability exchange - huu ni mstari (kiunga cha moduli iliyo na nambari ambapo mantiki ya uelekezaji iko) kwenye hifadhidata iliyojengwa mnesia. Vibadilishaji elfu 1 vitatumia kumbukumbu ya MB 1 tu.

Meza ya yaliyomo

Kubadilishana moja kwa moja

Direct exchange - kutumika wakati inahitajika kuwasilisha ujumbe kwa foleni maalum. Ujumbe unachapishwa kwa kibadilishaji na maalum ufunguo wa kuelekeza na huingia kwenye foleni zote ambazo zimeunganishwa kwa kibadilishaji hiki kwa kutumia ufunguo sawa wa kuelekeza. Kitufe cha kuelekeza ni kamba. Kulinganisha kunapatikana kwa kutumia kuangalia masharti kwa usawa.

Uwakilishi wa mchoro wa mtiririko wa ujumbe:

RabbitMQ. Sehemu ya 2. Kuelewa Mabadilishano

Π’ rabbitmq kuna dhana kibadilishaji chaguo-msingi. Ni direct exchange hakuna jina. Ikiwa kibadilishaji chaguo-msingi kinatumiwa, ujumbe utaelekezwa kwenye foleni yenye jina sawa na ufunguo wa kuelekeza ujumbe.

Kubadilishana Mada

Topic exchange - sawa direct exchange huwezesha uelekezaji wa kuchagua kwa kulinganisha ufunguo wa kuelekeza. Lakini, katika kesi hii, ufunguo hutolewa kulingana na template. Wakati wa kuunda template, tumia 0 au maneno zaidi (barua AZ ΠΈ az na nambari 0-9), ikitenganishwa na nukta, pamoja na alama * ΠΈ #.

  • * - inaweza kubadilishwa na hasa 1 слово
  • # - inaweza kubadilishwa na 0 au maneno zaidi

Uwakilishi wa mchoro wa mtiririko wa ujumbe:

RabbitMQ. Sehemu ya 2. Kuelewa Mabadilishano

Tangu toleo RabbitMQ 2.4.0 algorithm ya kuelekeza kwa topic exchange ilianza kufanya kazi hadi 145 mara kwa kasi zaidi. Walifanikisha hili kwa kuanzisha mbinu jaribu utekelezaji, ambayo inahusisha kuwakilisha ruwaza kama muundo wa mti. Kwa mfano templates a.b.c, a.*.b.c, a.#.c ΠΈ b.b.c itawakilishwa na muundo ufuatao:

RabbitMQ. Sehemu ya 2. Kuelewa Mabadilishano

Utafutaji wa kulinganisha muundo unafanywa kuanzia mizizi na kuendelea kutoka juu hadi chini.

Makala:

  • matumizi ya exchanger hii inaweza kuwa chaguo nzuri kwa maendeleo ya baadaye ya programu, kwa sababu violezo vinaweza kubinafsishwa kila wakati ili ujumbe uchapishwe kwa njia ile ile direct exchange au fanout exchange
  • templates zinazotumia * haraka sanakuliko violezo vinavyotumia #.
  • topic exchange polepole direct exchange

Fanout Exchange

Fanout exchange - ujumbe wote huwasilishwa kwa foleni zote hata kama ufunguo wa kuelekeza umebainishwa kwenye ujumbe.

Makala:

  • RabbitMQ haifanyi kazi na funguo za uelekezaji na violezo ambayo ina athari chanya kwenye tija. Hii ndiyo kasi zaidi exchange;
  • watumiaji wote lazima waweze kuchakata ujumbe wote;

Uwakilishi wa mchoro wa mtiririko wa ujumbe:

RabbitMQ. Sehemu ya 2. Kuelewa Mabadilishano

Vichwa vya kubadilishana

Headers exchange - huelekeza ujumbe kwa foleni zinazohusiana kulingana na ulinganisho wa (ufunguo, thamani) jozi za mali headers vifungo na sifa sawa za ujumbe. headers ni Dictionary<ΠΊΠ»ΡŽΡ‡, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅>.

Ukiongeza ufunguo maalum kwenye kamusi x-match yenye maana any, basi ujumbe hupitishwa ikiwa kuna mechi ya sehemu ya (ufunguo, thamani) jozi. Tabia hii ni sawa na opereta or.

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

Kitufe chaguo-msingi x-match ina thamani all. Hii ina maana kwamba ujumbe unaelekezwa ikiwa (ufunguo, thamani) jozi zinalingana haswa. Tabia hii ni sawa na opereta and.

Uwakilishi wa mchoro wa mtiririko wa ujumbe:

RabbitMQ. Sehemu ya 2. Kuelewa Mabadilishano

Makala:

  • kubadilika kwa ziada
  • ziada ya hesabu. Jozi zote (ufunguo, thamani) za sifa headers lazima ipangwe kwa jina muhimu kabla ya kukokotoa thamani za uelekezaji wa ujumbe. Polepole kuliko aina zingine za kubadilishana.

Kubadilishana-Hashing thabiti

Kibadilishaji hiki ni Chomeka ΠΈ haijajengwa ndani Π² RabbitMQ.

Consistent-hashing exchange (kubadilishana na hashing thabiti) - hutumiwa wakati kuna foleni kadhaa ambazo zinaweza kupokea ujumbe, na wakati unahitaji kusawazisha mzigo kati yao. Uunganisho wa ujumbe na foleni hutokea kwa uzito (thamani ya masharti ya kamba kutoka 0 - n).

Uzito sawa wa foleni - inaonyesha kwamba kila foleni itapokea takriban kiasi sawa ujumbe (kila ujumbe utawekwa kwenye foleni moja tu). Hakuna uhakikisho kamili wa usambazaji sare wa ujumbe.

Uwakilishi wa mchoro wa mtiririko wa ujumbe:

RabbitMQ. Sehemu ya 2. Kuelewa Mabadilishano

Hash imekokotolewa kulingana na ufunguo wa uelekezaji au mali headers ujumbe. Ikiwa ujumbe wote uliochapishwa ulikuwa na vitufe tofauti vya kuelekeza au headers, basi usambazaji utatokea kwa uzito. Vinginevyo, ufunguo wa kuelekeza utatumika au headers.

Inapaswa kusaidia wakati usambazaji wa watumiaji unahitaji kukua zaidi kuliko suluhisho na watumiaji wengi wanaotumia foleni moja.

Kuchanganya kubadilishana (E2E)

Tabia ya wabadilishanaji wote inaweza kuunganishwa kwa kutumia mawasiliano Kubadilishana-kwa-Kubadilishana (kuchanganya kubadilishana hakujumuishwa katika vipimo AMQP. Huu ni ugani wa itifaki kutoka upande RabbitMQ).

Uwakilishi wa mchoro wa mtiririko wa ujumbe:

RabbitMQ. Sehemu ya 2. Kuelewa Mabadilishano

Kwa gharama ya E2E tunaweza kupata usanidi unaofaa unaoweza kuongezwa ili kukidhi mahitaji ya sasa na yanayokua.

Tengeneza Exchange

Uumbaji wa exchanger hutokea kwa kutumia synchronous RPC ombi kwa seva. Ombi linafanywa kwa kutumia mbinu Exchange.Declareinaitwa na vigezo:

  • jina la exchanger
  • aina ya kubadilishana
  • vigezo vingine

Mfano wa uumbaji exchange kwa msaada wa RabbitMQ.Mteja:

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

  • exchange - jina la kibadilishaji tunachotaka kuunda. Jina lazima liwe la kipekee
  • type - aina ya kubadilishana
  • durable - ikiwa imewekwa true, Basi exchange itakuwa ya kudumu. Itahifadhiwa kwenye diski na inaweza kustahimili seva/dalali kuwasha upya. Ikiwa thamani false, Basi exchange ni ya muda na itafutwa seva/dalali itakapowashwa upya
  • autoDelete - kuondolewa kwa moja kwa moja. Exchange itafutwa wakati foleni zote zinazohusiana nayo zitafutwa
  • arguments - hoja za hiari. Mara nyingi, hutaja kupitia hoja alternative exchange (exchanger mbadala) Ikiwa ujumbe hauwezi kusafiri kwa njia ya asili, unaweza kutumwa kwa kibadilishaji mbadala ili kuelekezwa kwenye njia tofauti.

RabbitMQ. Sehemu ya 2. Kuelewa Mabadilishano

Ikiwa uumbaji exchange labda, basi seva itamtumia mteja kusawazisha RPC jibu Exchange.DeclareOk. Ikiwa uumbaji haiwezekani (ombi lilikataliwa Exchange.Declare), basi kituo kitafungwa seva kwa kutumia amri ya asynchronous Channel.Close na mteja atapokea ubaguzi OperationInterruptedException, ambayo itakuwa na msimbo wa makosa na maelezo yake.

Kibadilishaji lazima kiundwe kabla ya kutuma ujumbe. Ikiwa utachapisha ujumbe kwa kibadilishaji kisichokuwepo - RabbitMQ ataiondoa kimya kimya.

Kuunda Exchange kupitia GUI

Nenda kwenye paneli ya msimamizi RabbitMQ chini ya mtumiaji guest (jina la mtumiaji: guest na nenosiri: guest) Tafadhali kumbuka kuwa mtumiaji guest inaweza tu kuunganishwa kutoka kwa mwenyeji. Sasa twende kwenye kichupo Exchanges na bonyeza Add a new exchange. Jaza sifa:

RabbitMQ. Sehemu ya 2. Kuelewa Mabadilishano

Wengi wa mali yameelezwa hapo juu. Hapa tunaona kwamba ikiwa tunaweka Internal, basi ubadilishanaji unaweza kutumika tu kwa E2E. Producer haitaweza kutuma ujumbe kwa ubadilishanaji kama huo.

Hitimisho

Wakati wa kuunda mfumo, ni rahisi kuelezea topolojia uelekezaji kwa kutumia grafu. Lakini kabla ya kuanza kujenga grafu, ni thamani ya kuonyesha njia na trafiki ya juu, kwa sababu wao ndio wanaodai matokeo ya juu (utendaji). Ifuatayo, unaweza kuainisha trafiki. Na kisha tu kuanza kujenga.

Ikiwa katika grafu iliyojengwa kuna seti ya mwisho funguo za kuelekeza, basi inafaa kutazama kuelekea kadhaa fanout exchange, ambazo ni 1:1 zinazohusiana na ufunguo wa kuelekeza. Tunakumbuka hilo fanout exchange ya haraka zaidi.

Ikiwa idadi ya njia inaelekea kutokuwa na mwisho, basi unapaswa kuzingatia topic exchange au, ikiwa kiolezo hakihitajiki, unaweza kuchagua direct exchnge, kwa sababu ana kasi zaidi topic exchange.

Mchanganyiko wa tofauti exchange inapaswa kukusaidia kupata moja sahihi usanidi wa scalable, ambayo inakidhi mahitaji ya mfumo wa sasa na unaokua.

Idadi exchange na foleni zinapaswa kuwa ndogo ikilinganishwa na idadi ya njia.

Katika makala inayofuata tutaanza kuelewa Foleni na Vifungo kwa undani zaidi.

marejeo

Chanzo: mapenzi.com

Kuongeza maoni