Miksi Rabbit? Mikä on MQ? Miten se voi parantaa sovelluksiamme? Miksi haluaisin oppia siitä lisää? – Nämä ovat kysymyksiä, joita esitin, kun tutustuin ensimmäisen kerran RabbitMQ:hen. Olen Gabor, ja olen nyt RabbitMQ-insinööri ja konsultti. Työskennellessäni RabbitMQ:n parissa olen oppinut, että jopa kokeneet asiakkaat kysyvät näitä kysymyksiä.
TL;DR > Tutustu RabbitMQ-tuotesivuumme, josta löydät käyttötapauksia, ominaisuuksia ja voit ottaa yhteyttä asiantuntijakonsultteihimme.
Minkälaisen ongelman RabbitMQ ratkaisee?
Ennen kuin syvennytään siihen, mikä RabbitMQ on, ja siihen, miten sitä voidaan käyttää, on syytä tutustua tarkemmin varsinaiseen ongelma-alueeseen. Eri palveluiden (eli tietokoneiden) välinen kommunikointi on ikivanha ongelma.
Yhtäältä on olemassa erilaisia protokollia, jotka määrittelevät kulkuvälineet ja kommunikaation ominaisuudet. Esimerkkejä tällaisista protokollista ovat SMTP, FTP, HTTP tai WebSockets (muutamia mainitakseni), jotka kaikki perustuvat TCP/UDP:hen. Ne käsittelevät viestin muotoilua, luotettavuutta ja oikean vastaanottajan löytämistä.
Toisaalta voimme tutkia viestintää viestin näkökulmasta. Se on olemassa yhdessä järjestelmässä, sitten se kuljetetaan toiseen järjestelmään, muunnetaan, eli sillä on elinkaari. Kun se kulkee järjestelmästä toiseen, meidän pitäisi olla tietoisia siitä, missä viesti on ja kuka sen kulloinkin omistaa.
Edellä mainituilla viestintäprotokollilla voidaan varmistaa, että viestin omistusoikeus (ja ”fyysinen” sijainti) siirtyy järjestelmästä toiseen (vaikkakin tämän transaktion suorittaminen voi viedä jonkin aikaa). Voimme pitää siirtoa kahden osapuolen välisenä transaktiona, kun molemmat ovat läsnä. Useimmiten tämä aktiivinen tiedonvaihto on toivottavaa, esimerkiksi kun kysytään palvelun tilaa ja odotetaan oikea-aikaista ja täsmällistä vastausta. Esimerkki fyysisestä maailmasta olisi soittaminen jollekulle puhelimitse:
1) aloitamme puhelun,
2) odotamme toisen osapuolen vastausta,
3) käymme mukavaa keskustelua,
4) suljemme puhelimen.
Mutta on muitakin tilanteita, jolloin emme tarvitse vastausta, vaan tarvitsemme vain vastaanottajan ottavan viestin haltuunsa ja tekevän tehtävänsä. Tällöin tarvitsemme välittäjäagenttia, toista järjestelmää, joka ottaa viestin haltuunsa (väliaikaisesti) ja huolehtii siitä, että viesti saapuu perille. Puhelinesimerkin edetessä toinen osapuoli ei ole tällä hetkellä tavoitettavissa, joten jätämme ääniviestin. Vastaajapalvelu ilmoittaa siitä aiotulle vastaanottajalle.
RabbitMQ tarjoaa tämän asynkronisen (viivästetyn) viestin toimituksen. Ilmeisesti se voi tehdä muutakin kuin pelkän vastaajan, joten tutkitaan seuraavassa joitakin sen tarjoamia vaihtoehtoja
(Jos olet kiinnostunut oppimaan lisää RabbitMQ:n historiasta, suosittelen Alvaro Videlan ja Jason Williamsin teoksen ”RabbitMQ in Action” ensimmäistä lukua. Se paljastaa vastauksen siihen, miksi se on nimetty kanien mukaan).
RabbitMQ on ilmainen, avoimen lähdekoodin ja laajennettavissa oleva viestijonoratkaisu. Se on viestinvälittäjä, joka ymmärtää AMQP:tä (Advanced Message Queuing Protocol), mutta sitä voidaan käyttää myös muiden suosittujen viestinvälitysratkaisujen kuten MQTT:n kanssa. Se on erittäin käytettävissä, vikasietoinen ja skaalautuva. Se on toteutettu Erlang OTP:llä, joka on räätälöity vakaiden, luotettavien, vikasietoisten ja erittäin skaalautuvien järjestelmien rakentamiseen, joilla on natiivit valmiudet käsitellä hyvin suuria määriä samanaikaisia operaatioita, kuten RabbitMQ:lla ja muilla järjestelmillä, kuten WhatsAppilla, MongooseIM:llä, muutamia mainitakseni.
Hyvin korkealla tasolla kyse on väliohjelmistokerroksesta, joka mahdollistaa sen, että sovelluksen erilaiset palvelut voivat kommunikoida keskenään ilman, että niiden on pelättävä viestien katoamista, samalla kun ne tarjoavat erilaiset palvelunlaatuvaatimukset (Quality of Service, QoS). Se mahdollistaa myös hienojakoisen ja tehokkaan viestien reitityksen, joka mahdollistaa sovellusten laajan irtikytkennän.
Käyttökohteet
Voidaksemme esitellä RabbitMQ:n monipuolisuutta käytämme kolmea tapausesimerkkiä, jotka havainnollistavat, miten RabbitMQ soveltuu hyvin mustan laatikon hallittujen palveluiden lähestymistavaksi, sovellukseen tiiviisti integroituvaksi lähestymistavaksi, joka mahdollistaa hyvin toimivan mikropalveluarkkitehtuurin, tai yhdyskäytäväksi muihin vanhoihin projekteihin.
RabbitMQ yleisenä viestiväylänä
Kun monoliittinen järjestelmä pilkotaan erillisiksi osajärjestelmiksi, yksi suurimmista ratkaistavista ongelmista on käytettävä viestintätekniikka. Mulesoftin tai MassTransitin kaltainen ratkaisu voi ”johdottaa” palvelut julistamalla HTTP-kuuntelijat ja lähettäjät. Tällainen ratkaisu käsittelee RabbitMQ:ta mustana laatikkona, mutta pystyy silti hyödyntämään RabbitMQ:n ominaisuuksia. Esimerkkinä suorasta viestinnästä käytetään HTTP:tä yksittäisten palveluiden ”yhdistämiseen”. Vaikka se on hyvin tuettu ja vankka valinta, siinä on joitakin haittoja:
1) Palveluiden löytämistä ei ole ratkaistu. Mahdollinen ratkaisu on käyttää DNS:ää. Kun järjestelmä skaalautuu ja kasvaa, myös tämän kuorman löytämisen ja tasapainottamisen monimutkaisuus kasvaa. RabbitMQ voi lieventää ratkaisun lisääntynyttä monimutkaisuutta.
2) Viestintä on hetkellistä. Viestit ovat alttiita hylättäviksi tai päällekkäisiksi verkkokerroksessa. Jos palvelu ei ole tilapäisesti käytettävissä, toimitus epäonnistuu.
RabbitMQ voi auttaa molemmissa tapauksissa hyödyntämällä viestijonoja kuljetusvälineenä. Palvelut voivat julkaista ja kuluttaa viestejä, mikä irrottaa viestien päästä päähän -toimituksen kohdepalvelun saatavuudesta. Jos kuluttava palvelu ei ole tilapäisesti käytettävissä, toisin kuin HTTP:ssä, viesti puskuroidaan ja säilytetään turvallisesti RabbitMQ:ssa, ja se toimitetaan lopulta, kun palvelu palaa verkkoon.
Myös löydettävyys yksinkertaistuu. Meidän tarvitsee vain tietää, missä RabbitMQ sijaitsee ja mikä on jonon nimi. Vaikka vaikuttaa siltä, että tämä vain keksii ongelman uudelleen, tämä on skaalautuva. Jonon nimi toimii palvelun osoitteena. Viestien kuluttaminen jonoista yksittäisten palveluiden toimesta tarjoaa keinon skaalautuvuuteen, eli kukin jono voi palvella useita kuluttajia ja tasata kuormaa. Palveluihin jo sisäänrakennettua jonokonfiguraatiota ei tarvitse muuttaa.
Tämä kohtalaisen staattinen jonokonfiguraatio työntää RabbitMQ:n väliohjelmistokerrokseen, jossa vankalla suunnittelulla voidaan taata palvelun vakaa laatu pitkällä aikavälillä.
RabbitMQ edistyneenä reitityskerroksena mikropalveluille
Välirakenteen toisessa ääripäässä on arkkitehtuuri, joka on sujuvampi ja joka mukautuu monien mikropalveluiden jatkuvasti muuttuviin tarpeisiin. Se, mikä saa RabbitMQ:n loistamaan tässä ympäristössä, on sen tarjoamat erittäin tehokkaat reititysominaisuudet.
Reitityslogiikka on toteutettu erilaisissa (niin sanotuissa) vaihtotyypeissä, joita sovellus voi luoda dynaamisesti tarpeen mukaan. Kohdepalvelut luovat jonot, joista ne haluavat kuluttaa, ja sitovat ne sitten pörsseihin määrittelemällä mallin avaimille, joita julkaisijat voivat käyttää julkaistaessaan viestiä. (Ajattele näitä avaimia metatietoina, joita vaihdot voivat käyttää viestien reitittämiseen ja toimittamiseen yhteen tai useampaan jonoon.)
Reitityslogiikka on toteutettu erilaisissa (niin sanotuissa) vaihtotyypeissä, joita sovellus voi luoda dynaamisesti tarvittaessa. Kohdepalvelut luovat jonot, joista ne haluavat kuluttaa, ja sitovat ne sitten pörsseihin määrittelemällä mallin avaimille, joita julkaisijat voivat käyttää julkaistaessaan viestiä. (Ajattele näitä avaimia metatietoina, joita vaihdot voivat käyttää viestien reitittämiseen ja toimittamiseen yhteen tai useampaan jonoon.)
RabbitMQ:ssa on neljä käyttökelpoista vaihtotyyppiä, jotka kattavat suurimman osan viestinvälityksen käyttötapauksista:
1) Suora vaihto. Tämä toimittaa saapuvan viestin mihin tahansa jonoon, jonka sidonta-avain täsmälleen vastaa viestin reititysavainta. Jos sidot jonot jonon nimellä reititysavaimina, voit ajatella sitä yksi yhteen -sanoman toimittamisena. Sama viesti on helppo toimittaa useisiin jonoihin käyttämällä useiden jonojen sitomisavaimia.
2) Aiheiden vaihto. Tämä toimittaa saapuvan viestin mihin tahansa jonoon, jonka villin kortin sidonta-avain vastaa julkaistun viestin reititysavainta. Sidonta-avaimet voivat sisältää yhdistetyn reititysavaimen jokerimerkkisiä vastaavuuskriteerejä. (Esim. sitova avain logs.*.error
vastaa reititysavaimia logs.accounting.error
ja logs.ui.error
). Näin voimme kirjoittaa yksinkertaisia palveluita, joissa logiikka on hyvin sisällä, ja viesti saapuu oikeisiin palveluihin RabbitMQ:n ”taikuuden” avulla.
3) Fanout-vaihto. Jotkin viestit on toimitettava kaikkiin jonoihin, jolloin fanout-vaihtoa voidaan käyttää sen sijaan, että sovellukseen kirjoitettaisiin monimutkainen multicast-logiikka. RabbitMQ:n fanout-vaihdon avulla kukin palvelu sitoo sopivan jonon vaihtoon ilman, että tarvitsee määrittää sitomisavainta, ja kaikki tapahtuu automaattisesti. Jos sidonta-avain on määritetty, fanout-vaihdin yksinkertaisesti jättää sen huomiotta ja reitittää/lähettää viestit edelleen kaikkiin siihen sidottuihin jonoihin.
4) Otsikoiden vaihto. Tämä vaihto hyödyntää AMQP-viestien rakennetta ja pystyy monimutkaiseen reititykseen AMQP-viestin otsikoiden (myös mukautettujen) perusteella. Otsikot ovat metatietoja, jotka liitetään jokaiseen AMQP:n kautta lähetettävään viestiin.
Vaihtojen lisäksi RabbitMQ:ssa on muitakin hyödyllisiä ominaisuuksia, jotka mahdollistavat hyvin monimutkaisen viestilogiikan toteuttamisen. Joitakin tärkeimpiä ominaisuuksia ovat:
1) Mukautetut lisäosat. RabbitMQ on laajennettavissa sallimalla sen käyttäjien lisätä lisäosia. Lähes jokainen RabbitMQ:n osa-alue on muokattavissa, mukaan lukien hallinta, todennus ja valtuutus, varmuuskopiointiratkaisut ja klusterointi.
2) Klusterointi. Kun yksi RabbitMQ-palvelin ei riitä, useita RabbitMQ-välittäjiä voidaan yhdistää toimimaan yhdessä ja skaalata järjestelmää. Sen avulla RabbitMQ voi käsitellä enemmän viestejä tai lisätä virheenkestävyyttä.
3) Palvelun laadun virittäminen. Aikaherkkien viestien toimittamista voidaan auttaa liittämällä TTL-arvo (Time-to-Live) joko viestiin tai jonoon. Ajoitetut viestit voidaan toimittaa automaattisesti Dead-letter-jonoon. Tavallisen reitityslogiikan ja näiden lisäominaisuuksien yhdistäminen voi johtaa erittäin kehittyneeseen reitityslogiikkaan. Toinen hyödyllinen ominaisuus on prioriteettijonojen käyttö, jossa julkaisija voi määrittää jokaiselle viestille prioriteettitason. On myös mahdollista rajoittaa tunnistamattomien viestien määrää, mikä mahdollistaa kuluttavien palveluiden suorituskyvyn virittämisen, tässä tapauksessa RabbitMQ soveltaa back-pressure-mekanismia.
RabbitMQ integroituna vanhoihin järjestelmiin
Edellisessä käyttötapauksessa mainitsin mahdollisuuden käyttää liitännäisohjelmia RabbitMQ:n toimintojen laajentamiseen. Tämän tehokkaan ominaisuuden ansiosta RabbitMQ voi toimia välityskerroksena RabbitMQ:n natiivien (AMQP-yhteensopivien) palveluiden ja muiden vanhojen sovellusten välillä. Joitakin merkittäviä esimerkkejä ovat:
1) RabbitMQ:n käyttäminen MQTT-välittäjänä yksinkertaisesti ottamalla käyttöön plug-in. Tämä avaa maiseman monille IoT-teknologioille.
2) RabbitMQ:n JMS (Java Message Service) -lisäosa, jonka avulla RabbitMQ voi kommunikoida minkä tahansa JMS-kykyisen viestinvälitysratkaisun kanssa.
3) Jos sovelluksesi käyttää jotakin omaa protokollaa kommunikaatioon, on mahdollista kehittää räätälöity lisäosa, jolla voit muodostaa yhteyden mihin tahansa tällaiseen palveluun.
Johtopäätös
Kuten edellä esitetyt esimerkit osoittavat, tuskinpa on mitään sellaista, minkä kanssa RabbitMQ:n kanssa ei pystyisi kommunikoimaan. Mutta kuten kaikella elämässä, sillä on hintansa. Vaikka RabbitMQ:n konfigurointi on useimmiten suoraviivaista, joskus pelkkä ominaisuuksien määrä voi olla ylivoimainen. Jos sinulla on ongelmia RabbitMQ-välittäjien suunnittelussa, toteuttamisessa tai tukemisessa, ota yhteyttä asiantuntijatiimiimme täällä. Tai jos haluat aloittaa urasi yhden kysytyimmän teknologian parissa, ilmoittaudu 3-päiväiselle RabbitMQ-koulutuskurssillemme.
RabbitMQ:n virheenkorjaus
Tahdotko intuitiivisen järjestelmän, jonka avulla RabbitMQ:n seuranta ja ylläpito on helppoa? Hanki ilmainen 45 päivän kokeilujakso WombatOAMista nyt.
RabbitMQ-ominaisuuksiemme sivu