Proč Rabbit? Co je to MQ? Jak může zlepšit naše aplikace? Proč bych se o něm měl dozvědět více? – To jsou otázky, které jsem si kladl, když jsem se poprvé seznámil s RabbitMQ. Jmenuji se Gabor a nyní jsem inženýrem a konzultantem RabbitMQ. Během své práce s RabbitMQ jsem zjistil, že tyto otázky si kladou i zkušení zákazníci.
TL;DR > Podívejte se na naši stránku produktu RabbitMQ, kde najdete případy použití, funkce a kontakty na naše odborné konzultanty.
Jaký problém RabbitMQ řeší?
Než se pustíme do toho, co je RabbitMQ a jak ho používat, stojí za to dozvědět se více o samotné problémové oblasti. Komunikace mezi různými službami (alias počítači) je odvěký problém.
Na jedné straně existují různé protokoly definující způsob dopravy a vlastnosti komunikace. Mezi příklady takových protokolů patří SMTP, FTP, HTTP nebo WebSockets (abychom jmenovali alespoň některé), které jsou všechny založeny na protokolu TCP/UDP. Zabývají se formátováním, spolehlivostí a nalezením správného příjemce zprávy.
Na druhé straně můžeme zkoumat komunikaci z pohledu zprávy. Ta existuje v jednom systému, pak je transportována do jiného, transformuje se, tj. má svůj životní cyklus. Jak putuje z jednoho systému do druhého, měli bychom si být vědomi toho, kde se zpráva nachází a kdo ji v daném okamžiku vlastní.
Výše zmíněné komunikační protokoly mohou zajistit, že vlastnictví (a „fyzické“ umístění) zprávy je přeneseno z jednoho systému do druhého (i když provedení této transakce může nějakou dobu trvat). Přenos můžeme považovat za transakci mezi oběma stranami, dokud jsou obě přítomny. Většinou je tato aktivní výměna žádoucí, např. dotaz na stav služby a očekávání včasné a přesné odpovědi. Příkladem z fyzického světa může být telefonování někomu po telefonu:
1) zahájíme hovor,
2) čekáme, až druhá strana odpoví,
3) příjemně diskutujeme,
4) zavěsíme telefon.
Jindy však odpověď nepotřebujeme, stačí, aby příjemce převzal zprávu a vykonal svou práci. V takovém případě potřebujeme zprostředkujícího agenta, jiný systém, který převezme vlastnictví zprávy (dočasně) a zajistí, aby zpráva dorazila na místo určení. Abychom příklad s telefonem posunuli dále, druhá strana je momentálně nedostupná, a proto zanecháme hlasovou zprávu. Služba hlasové pošty upozorní zamýšleného příjemce.
Toto asynchronní (zpožděné) doručování zpráv zajišťuje RabbitMQ. Samozřejmě toho umí víc než pouhý záznamník, proto si níže prozkoumáme některé z možností, které poskytuje
(Pokud vás zajímá více informací o historii RabbitMQ, doporučuji první kapitolu knihy „RabbitMQ in Action“ od Alvara Videly a Jasona Williamse. Odhalí vám odpověď na otázku, proč se jmenuje podle králíků).
RabbitMQ je bezplatné, open-source a rozšiřitelné řešení pro řazení zpráv. Jedná se o zprostředkovatele zpráv, který rozumí protokolu AMQP (Advanced Message Queuing Protocol), ale je možné jej používat i s jinými populárními řešeními pro zasílání zpráv, jako je MQTT. Je vysoce dostupný, odolný proti chybám a škálovatelný. Je implementován v Erlang OTP, což je technologie přizpůsobená pro budování stabilních, spolehlivých, odolných proti chybám a vysoce škálovatelných systémů, které mají nativní schopnosti zpracovávat velmi velké množství souběžných operací, jako je tomu v případě RabbitMQ a dalších systémů, jako je WhatsApp, MongooseIM, abychom zmínili alespoň některé.
Na velmi vysoké úrovni se jedná o vrstvu middlewaru, která umožňuje různým službám ve vaší aplikaci vzájemně komunikovat bez obav ze ztráty zpráv a zároveň poskytuje různé požadavky na kvalitu služeb (QoS). Umožňuje také jemné a efektivní směrování zpráv, což umožňuje rozsáhlé oddělení aplikací.
Případy použití
Pro ukázku všestrannosti RabbitMQ použijeme tři případové studie, které demonstrují, jak se RabbitMQ dobře hodí jako přístup ke spravovaným službám typu black-box, jako přístup těsně integrovaný s aplikací umožňující dobře fungující architekturu mikroslužeb nebo jako brána k jiným starším projektům.
RabbitMQ jako obecná sběrnice zpráv
Pokud je monolitický systém rozdělen na samostatné subsystémy, je jedním z největších problémů, které je třeba vyřešit, jakou komunikační technologii použít. Řešení, jako je Mulesoft nebo MassTransit, dokáže „zadrátovat“ služby tak, že deklaruje posluchače a odesílatele HTTP. Tento druh řešení považuje RabbitMQ za černou skříňku, ale přesto dokáže využít možností RabbitMQ. Jako příklad přímé komunikace použijme HTTP k „propojení“ jednotlivých služeb. Je to sice dobře podporovaná a solidní volba, ale má některé nevýhody:
1) Není vyřešeno zjišťování služeb. Možným řešením je použití DNS. S rozšiřováním a růstem systému roste i složitost vyhledávání a vyvažování této zátěže. RabbitMQ může zvýšenou složitost řešení zmírnit.
2) Komunikace je efemérní. Zprávy jsou náchylné k přerušení nebo duplikaci na síťové vrstvě. Pokud je služba dočasně nedostupná, doručení selže.
RabbitMQ může pomoci v obou případech tím, že využívá fronty zpráv jako dopravní prostředek. Služby mohou publikovat a konzumovat zprávy, což odděluje doručování zpráv mezi koncovými body od dostupnosti cílové služby. Pokud je konzumující služba dočasně nedostupná, je na rozdíl od protokolu HTTP zpráva bezpečně uložena do vyrovnávací paměti a uchována v RabbitMQ a nakonec doručena, jakmile se služba vrátí do provozu.
Zjednodušena je také zjistitelnost. Stačí vědět, kde se RabbitMQ nachází a jaký je název fronty. Ačkoli se zdá, že se tím problém jen znovu objevuje, je to škálovatelné. Název fronty funguje jako adresa služby. Spotřeba zpráv z front jednotlivými službami nabízí prostředek pro škálovatelnost, tj. každá fronta může obsluhovat více spotřebitelů a vyrovnávat zátěž. Není třeba měnit konfiguraci fronty již zabudovanou do služeb.
Tato mírně statická konfigurace fronty posouvá RabbitMQ do vrstvy middlewaru, kde solidní návrh může zaručit dlouhodobě stabilní kvalitu služby.
RabbitMQ jako pokročilá směrovací vrstva pro mikroslužby
Na druhém konci spektra je architektura, která je plynulejší a přizpůsobuje se neustále se měnícím potřebám mnoha mikroslužeb. To, čím RabbitMQ v tomto prostředí září, jsou velmi výkonné možnosti směrování, které poskytuje.
Směrovací logika je implementována v různých (tzv.) typech výměn, které může aplikace v případě potřeby dynamicky vytvářet. Cílové služby vytvářejí fronty, ze kterých chtějí odebírat, a poté je vážou k výměnám určením vzoru pro klíče, které mohou vydavatelé použít při publikování zprávy. (Představte si tyto klíče jako metadata, která mohou burzy použít ke směrování a doručení zpráv do jedné nebo více front.)
Logika směrování je implementována v různých (tzv.) typech burz, které může aplikace v případě potřeby dynamicky vytvářet. Cílové služby vytvářejí fronty, které chtějí odebírat, a poté je vážou k výměnám určením vzoru pro klíče, které mohou vydavatelé použít při publikování zprávy. (Představte si tyto klíče jako metadata, která mohou výměny použít ke směrování a doručení zpráv do jedné nebo více front.)
RabbitMQ obsahuje čtyři užitečné typy výměn, které pokrývají většinu případů použití pro zasílání zpráv:
1) Přímá výměna. Ta doručí příchozí zprávu do libovolné fronty, jejíž vazební klíč přesně odpovídá směrovacímu klíči zprávy. Pokud jako směrovací klíče uvedete vazbu na fronty s názvem fronty, pak si to můžete představit jako doručení zprávy jedna ku jedné. Stejnou zprávu lze jednoduše doručit do více front pomocí vazebních klíčů pro více front.
2) Výměna témat. Ta doručí příchozí zprávu do libovolné fronty, jejíž vazební klíč s divokou kartou se shoduje se směrovacím klíčem publikované zprávy. Vázací klíče mohou obsahovat kritéria shody wild-card pro složený směrovací klíč. (Např. vazební klíč logs.*.error
bude odpovídat směrovacím klíčům logs.accounting.error
a logs.ui.error
). To nám umožňuje psát jednoduché služby, kde je logika dobře obsažena, a zpráva dorazí ke správným službám díky „kouzlu“ RabbitMQ.
3) Výměna Fanout. Některé zprávy je třeba doručit do všech front, zde lze použít fanouškovskou výměnu místo psaní složité logiky multicastu v aplikaci. Pomocí fanouškovské výměny RabbitMQ každá služba naváže příslušnou frontu na výměnu, aniž by bylo nutné zadávat vazební klíč, a vše se děje automaticky. Pokud je vazební klíč zadán, fanouškovská výměna jej jednoduše ignoruje a stále směruje/rozesílá zprávy do všech front, které jsou s ní svázány.
4) Výměna hlaviček. Tato výměna využívá strukturu zpráv AMQP a je schopna komplexního směrování na základě hlaviček (včetně vlastních) zprávy AMQP. Hlavičky jsou metadata připojená ke každé zprávě odesílané prostřednictvím AMQP.
Kromě výměn existují v RabbitMQ další užitečné funkce, které umožňují implementovat velmi složitou logiku zasílání zpráv. Mezi nejdůležitější funkce patří:
1) Vlastní zásuvné moduly. RabbitMQ je rozšiřitelný tím, že umožňuje svým uživatelům přidávat zásuvné moduly. Téměř každý aspekt RabbitMQ je možné přizpůsobit, včetně správy, ověřování a autorizace, zálohovacích řešení a clusterů.
2) Clustery. Pokud jeden server RabbitMQ nestačí, lze propojit více zprostředkovatelů RabbitMQ, aby spolupracovali a škálovali systém. To může umožnit RabbitMQ zpracovat více zpráv nebo zvýšit odolnost vůči chybám.
3) Ladění kvality služby. Doručování zpráv citlivých na čas lze podpořit připojením hodnoty TTL (Time-to-Live) buď ke zprávě, nebo k frontě. Zprávy s vypršeným časem mohou být automaticky doručeny do fronty Dead-letter. Kombinací běžné logiky směrování a těchto dodatečných funkcí lze dosáhnout velmi pokročilé logiky směrování. Další užitečnou funkcí je použití prioritních front, kde vydavatel může každé zprávě přiřadit úroveň priority. Je také možné omezit počet nepotvrzených zpráv, což umožňuje vyladit výkon konzumujících služeb, v tomto případě RabbitMQ používá mechanismus zpětného tlaku.
RabbitMQ integrovaný do starších systémů
V předchozím případu použití jsem zmínil možnost použití zásuvných modulů pro rozšíření funkčnosti RabbitMQ. Tato výkonná funkce umožňuje RabbitMQ fungovat jako zprostředkovatelská vrstva mezi nativními službami RabbitMQ (podporujícími AMQP) a jinými staršími aplikacemi. Mezi významné příklady patří:
1) Použití RabbitMQ jako zprostředkovatele MQTT jednoduchým zapnutím zásuvného modulu. Tím se otevírá prostor pro mnoho technologií IoT.
2) Zásuvný modul JMS (Java Message Service) RabbitMQ, který umožňuje RabbitMQ komunikovat s libovolným řešením pro zasílání zpráv podporujícím JMS.
3) Pokud vaše aplikace používá pro komunikaci proprietární protokol, je možné vytvořit vlastní zásuvný modul pro připojení k libovolným takovým službám.
Závěr
Jak ukazují výše uvedené příklady, neexistuje téměř nic, s čím by RabbitMQ nemohl komunikovat. Ale jako všechno v životě má svou cenu. Přestože je konfigurace RabbitMQ většinou jednoduchá, někdy může být samotné množství funkcí ohromující. Pokud se setkáte s jakýmikoli problémy při návrhu, implementaci nebo podpoře brokerů RabbitMQ, obraťte se na náš tým odborníků zde. Nebo pokud chcete nastartovat svou kariéru v jedné z nejžádanějších technologií, přihlaste se na naše třídenní školení RabbitMQ.
Debugování RabbitMQ
Chcete intuitivní systém, který vám usnadní monitorování a údržbu vašeho RabbitMQ? Získejte nyní 45denní zkušební verzi systému WombatOAM zdarma.
Naše stránka s možnostmi RabbitMQ
.