Part 4: RabbitMQ-vaihdot, reititysavaimet ja sidonnat

Mikä on vaihto? Mitä ovat reititysavaimet ja sidonnat? Miten vaihdot ja jonot liittyvät toisiinsa? Milloin niitä kannattaa käyttää ja miten? Tässä artikkelissa kerrotaan RabbitMQ:n eri vaihtotyypeistä ja skenaarioista, joissa niitä voi käyttää.

Viestejä ei julkaista suoraan jonoon. Sen sijaan tuottaja lähettää viestit vaihtoon. Vaihdot ovat viestien reititysagentteja, jotka määritellään RabbitMQ:ssa virtuaali-isännän toimesta. Pörssi vastaa viestien reitittämisestä eri jonoihin otsikkoattribuuttien, sidontojen ja reititysavainten avulla.

Sidos on ”linkki”, jonka määrittelet jonon sitomiseksi pörssiin.

Reititysavain on sanoma-attribuutti, jota vaihde tarkastelee päättäessään, miten sanoma reititetään jonoihin (vaihtotyypistä riippuen).

Vaihtoja, yhteyksiä ja jonoja voidaan määrittää parametreilla, kuten kestävät, tilapäiset ja automaattinen poisto luotaessa. Kestävät vaihdot kestävät palvelimen uudelleenkäynnistyksen ja säilyvät, kunnes ne poistetaan nimenomaisesti. Väliaikaiset vaihdot ovat olemassa, kunnes RabbitMQ sammutetaan. Automaattisesti poistuvat vaihdot poistetaan, kun viimeinen sidottu objekti on irrotettu vaihdosta.

RabbitMQ:ssa on neljä erityyppistä vaihtoa, jotka reitittävät viestin eri tavalla käyttäen erilaisia parametreja ja sidonta-asetuksia. Asiakkaat voivat luoda omia vaihtoja tai käyttää valmiita oletusvaihtoja, jotka luodaan, kun palvelin käynnistyy ensimmäisen kerran.

  1. Tuottaja julkaisee viestin vaihtoon.
  2. Vaihtoon saapuu viesti, ja se on nyt vastuussa viestin reitittämisestä.
  3. Sidonnaisuus on määriteltävä jonon ja vaihdon välillä. Tässä tapauksessa meillä on sidonnat kahteen eri jonoon vaihdosta. Vaihde reitittää viestin jonoihin.
  4. Viestit pysyvät jonossa, kunnes kuluttaja käsittelee ne.
  5. Kuluttaja käsittelee viestin.

Jos RabbitMQ ja viestien jonottaminen eivät ole sinulle tuttuja, lueLueRabbitMQ:ta aloittelijoille – mikä on RabbitMQ?ennen kuin luet vaihdoista, reititysavaimista, otsikoista ja sidonnoista.

Suora vaihto

Suora vaihto toimittaa viestit jonoihin viestin reititysavaimen perusteella. Reititysavain on tuottajan sanomaotsikkoon lisäämä sanoma-attribuutti. Ajattele, että reititysavain on ”osoite”, jota vaihto käyttää päättäessään, miten viesti reititetään.Viesti menee jono(iin), jonka sidontaavain vastaa täsmälleen viestin reititysavainta.

Suoran vaihdon tyyppi on hyödyllinen, jotta samaan vaihtoon julkaistut viestit voidaan erottaa toisistaan yksinkertaisen merkkijonotunnisteen avulla.

AmQP-välittäjien on annettava suoralle vaihdolle oletusarvoisesti vaihto ”amq.direct”.

Kuvitellaan, että jono A (create_pdf_queue) alla olevassa kuvassa (suoran vaihdon kuva) on sidottu suoraan vaihtoon (pdf_events) sitomisavaimellaypdf_create.Kun uusi viesti, jonka reititysavain on keypdf_create, saapuu suoraan vaihtopisteeseen, vaihtopiste reitittää sen jonoon, jossa binding_key = routing_key, tässä tapauksessa jonoon A (create_pdf_queue).

Skenaario 1

  • Pörssi: pdf_events
  • Vuorojono A: create_pdf_queue
  • Sidosavain vaihdon (pdf_events) ja jono A:n (create_pdf_queue) välillä: pdf_create

Skenaario 2

  • Vaihto: pdf_events
  • Varausjono B: pdf_log_queue
  • Vaihdon (pdf_events) ja jonon B (pdf_log_queue) välinen sidontaavain: pdf_log

Esimerkki

Esim: Viesti, jonka reititysavain onypdf_log,lähetetäänpdf_events-vaihtopalveluun.Viesti ohjataan pdf_log_jonoon, koska reititysavain (pdf_log) vastaa sidonta-avainta (pdf_log).

Jos viestin reititysavain ei täsmää mihinkään sidonta-avainta, viesti hylätään.

Suora vaihto: Sanoma menee niihin jonoihin, joiden sitova avain täsmälleen vastaa sanoman reititysavainta.

Esimerkkipörssi

Esimerkkipörssi on ennalta ilmoitettu suora pörssi, jolla ei ole nimeä ja johon viitataan yleensä tyhjällä merkkijonolla. Kun käytät oletusvaihtoa, viesti toimitetaan jonoon, jonka nimi on sama kuin viestin reititysavain. Jokainen jono sidotaan automaattisesti oletusvaihtoon reititysavaimella, joka on sama kuin jonon nimi.

Topic Exchange

Topic Exchange reitittää viestit jonoihin reititysavaimen ja jonosidonnassa määritellyn reitityskaavion välisten jokerimerkkitapausten perusteella. Viestit ohjataan yhteen tai useampaan jonoon viestin reititysavaimen ja tämän kuvion välisen vastaavuuden perusteella.

Reititysavaimen on oltava sanaluettelo, joka on rajattu pisteellä (.). Esimerkkejä ovatagreements.usjaagreements.eu.stockholm,joka tässä tapauksessa tunnistaa sopimukset, jotka on laadittu yritykselle, jolla on toimistoja monissa eri paikoissa. Reitityskuviot voivat sisältää tähtimerkin (”*”), joka vastaa sanaa reititysavaimen tietyssä kohdassa (esimerkiksi reitityskuvio ”agreements.*.*.*.b.*” vastaa vain sellaisia reititysavaimia, joissa ensimmäinen sana on ”agreements” ja neljäs sana on ”b”). Punta-symboli (”#”) osoittaa nollan tai useamman sanan osuman (esim. reitityskuvio ”agreements.eu.berlin.#” osuu kaikkiin reititysavaimiin, jotka alkavat sanalla ”agreements.eu.berlin”).

Kuluttajat ilmoittavat, mitkä aiheet heitä kiinnostavat (kuten yksittäisen tagin syötteen tilaaminen). Kuluttaja luo jonon ja asettaa sidonnan tietyllä reititysmallilla vaihtoon. Kaikki viestit, joilla on reititysavain ja jotka vastaavat reititysmallia, ohjataan jonoon ja pysyvät siellä, kunnes kuluttaja kuluttaa viestin.

AmQP-välittäjien on tarjottava aiheiden vaihtoa varten oletusvaihto ”amq.topic”.

Skenaario 1

Oheisessa kuvassa on esimerkki, jossa kuluttaja A on kiinnostunut kaikista Berliinin sopimuksista.

  • Vaihto: sopimukset
  • Varausjono A: berlin_sopimukset
  • Reitityskaavio vaihdon (sopimukset) ja varausjono A:n (berlin_sopimukset) välille (berlin_sopimukset): sopimukset.eu.berlin.#
  • Esimerkki sanoman reititysavaimesta, joka täsmää: agreements.eu.berlin ja agreements.eu.berlin.headstore

Skenaario 2

Kuluttaja B on kiinnostunut kaikista sopimuksista.

  • Pörssi: sopimukset
  • Vuorojono B: kaikki_sopimukset
  • Reititysmalli pörssin (sopimukset) ja jono B (kaikki_sopimukset) välillä: sopimukset.#
  • Esimerkki viestin reititysavaimesta, joka täsmää: agreements.eu.berlin ja agreements.us

Teemavaihto: Viestit ohjataan yhteen tai useampaan jonoon sen perusteella, että viestin reititysavain ja reititysmalli täsmäävät.

Skenaario 3

Kuluttaja C on kiinnostunut kaikista sopimuksista, jotka koskevat eurooppalaisia pääkonttoreita.

  • Pörssi: sopimukset
  • Vuorojono C: päämyymäläsopimukset
  • Reitityskuvio pörssin (sopimukset) ja jono C:n (päämyymäläsopimukset) välillä: agreements.eu.*.headstore
  • Esimerkki sanoman reititysavaimista, jotka täsmäävät: agreements.eu.berlin.headstore ja agreements.eu.stockholm.headstore

Esimerkki

Sanoma, jossa on reititysavainsopimukset.eu.berlinlähetetään pörssisopimuksiin.Sanomat ohjataan jonoonberlin_agreements,koska reitityskaavio ”agreements.eu.berlin.#” vastaa ”agreements.eu.berlin”-alkuisia reititysavaimia. Sanoma ohjataan myös jonoonall_agreements,koska reititysavain (agreements.eu.berlin) vastaa reitityskuviota (agreements.#).

Fanout-vaihto

Fanout-vaihto kopioi ja reitittää vastaanotetun sanoman kaikkiin siihen sidottuihin jonoihin riippumatta reititysavaimista tai kuvioiden yhteensovittamisesta, kuten suorissa ja aihekohtaisissa vaihdoissa. Annetut avaimet yksinkertaisesti jätetään huomiotta.

Fanout-vaihdot voivat olla hyödyllisiä, kun sama viesti on lähetettävä yhdelle tai useammalle jonolle, joilla on kuluttajia, jotka saattavat käsitellä samaa viestiä eri tavoin.

Oikealla olevassa kuvassa (Fanout-vaihto) on esimerkki, jossa vaihdon vastaanottama viesti kopioidaan ja reititetään kaikkiin kolmeen vaihtoon sidottuun jonoon. Kyseessä voi olla esimerkiksi urheilu- tai sääpäivitykset, jotka pitäisi lähettää jokaiselle liitetylle mobiililaitteelle, kun jotakin tapahtuu.

AmQP-välittäjien on tarjottava oletusvaihtoa varten aiheiden vaihtoa varten ”amq.fanout”.

Fanout Exchange: Vastaanotettu viesti ohjataan kaikkiin jonoihin, jotka on sidottu vaihtoon.

Skenaario 1

  • Vaihto: sport_news
  • Jono A: Mobiiliasiakkaan jono A
  • Sidonta:

Esimerkki

Viesti lähetetään vaihtoonsport_news.Viesti ohjataan kaikkiin jonoihin (jono A, jono B, jono C), koska kaikki jonot on sidottu vaihtoon. Annetut reititysavaimet jätetään huomiotta.

Pääotsikkovaihto

Pääotsikkovaihto reitittää viestit otsikoita ja valinnaisia arvoja sisältävien argumenttien perusteella. Otsikkovaihdot ovat hyvin samankaltaisia kuin aihevaihdot, mutta ne reitittävät viestejä reititysavainten sijasta otsikkoarvojen perusteella. Viesti täsmää, jos otsikon arvo on sama kuin sidonnassa määritetty arvo.

Vaihdon ja jonon väliseen sidontaan lisätään erityinen argumentti nimeltä ”x-match”, joka määrittelee, pitääkö kaikkien otsikoiden täsmätä vai vain yhden. Joko mikä tahansa yhteinen otsikko sanoman ja sidonnan välillä lasketaan täsmääväksi, tai kaikkien sidonnassa viitattujen otsikoiden on oltava läsnä sanomassa, jotta se täsmää. Ominaisuudella ”x-match” voi olla kaksi eri arvoa: ”any” tai ”all”, jossa ”all” on oletusarvo. Arvo ”all” tarkoittaa, että kaikkien otsikkoparien (avain, arvo) on täsmättävä, kun taas arvo ”any” tarkoittaa, että vähintään yhden otsikkoparien on täsmättävä. Otsakkeet voidaan muodostaa käyttämällä merkkijonon sijasta useampia tietotyyppejä, esimerkiksi kokonaislukua tai hashia. Headers-vaihtotyyppi (jota käytetään sidonta-argumentin ”any” kanssa) on hyödyllinen suunnattaessa viestejä, jotka sisältävät osajoukon tunnettuja (järjestämättömiä) kriteerejä.

AmQP-välittäjien on oletusarvoisesti tarjottava aiheiden vaihtoa varten vaihtotyyppi ”amq.headers”.

Esimerkki

Skenaario 3

Viesti 3 julkaistaan vaihtoon, jonka header-argumentit ovat: (key = value): ”

On syytä huomata, että otsikkovaihdossa viestin avain-arvoparien todellisella järjestyksellä ei ole merkitystä.

Kuolleiden kirjeiden vaihto

Jos viestille ei löydy sopivaa jonoa, viesti hylätään hiljaisesti. RabbitMQ tarjoaa AMQP-laajennuksen, joka tunnetaan nimellä ”Dead Letter Exchange”, joka tarjoaa toiminnallisuuden sellaisten viestien kaappaamiseen, joita ei voida toimittaa.

Sähköpostitse osoitteeseen [email protected], jos sinulla on ehdotuksia puuttuvasta sisällöstä tai muuta palautetta.

Ohje – RabbitMQ:ta aloittelijoille

Ystyitkö tähän artikkeliin? Älä unohda jakaa sitä muille 😉

Vastaa

Sähköpostiosoitettasi ei julkaista.