AMQP

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 17. června 2020; kontroly vyžadují 107 úprav .

AMQP (Advanced Message Queuing Protocol)  je otevřený protokol aplikační vrstvy pro předávání zpráv mezi systémovými komponentami. Hlavní myšlenkou je, že jednotlivé subsystémy (nebo nezávislé aplikace) si mohou libovolně vyměňovat zprávy prostřednictvím AMQP brokera, který provádí směrování , případně garantuje doručení, distribuci datových toků, přihlášení k požadovaným typům zpráv.

Architekturu protokolu vyvinul John O'Hara z JP Morgan Chase & Co [1] .

Protokol

AMQP je založen na třech konceptech:

  1. Zpráva (zpráva) - jednotka přenášených dat, její hlavní část (obsah) server nijak neinterpretuje, ke zprávě lze připojit strukturované hlavičky.
  2. Výměnný bod – jsou na něj odesílány zprávy. Výměna distribuuje zprávy do jedné nebo více front . Zároveň se na výměnném místě neukládají zprávy. Výměnné body jsou tří typů:
    • fanout - zpráva se přenese do všech k ní připojených front;
    • přímá - zpráva je odeslána do fronty se jménem, ​​které se shoduje se směrovacím klíčem (směrovacím klíčem) (směrovací klíč se zadává při odesílání zprávy);
    • téma - něco mezi fanout a direct, zpráva se posílá ve frontách, pro které se maska ​​pro směrovací klíč shoduje, například app.notification.sms # - všechny zprávy odeslané s klíči začínajícími app.notification.sms budou doručeny do fronty.
  3. Fronta - zde se ukládají zprávy, dokud je klient nevyzvedne. Klient vždy stahuje zprávy z jedné nebo více front.


Protokol lze rozdělit do dvou vrstev:

  1. Funkční vrstva – definuje sadu příkazů, které provádějí práci jménem aplikace.
  2. Transportní vrstva - zpracovává požadavky z aplikace na server a ze serveru do aplikace, spravuje kanálové multiplexování, rámování, kódování, tlukot srdce, prezentaci dat, zpracování chyb.


Příklady fronty:

Protokol není omezen na tyto tři druhy. Jsou uvedeny jako příklad implementace.

Terminologie

Výměna

Přijímá zprávy od poskytovatele a směruje je do fronty zpráv podle předem definovaných kritérií. Taková kritéria se nazývají vazby. Exchange je mechanismus vyjednávání a směrování zpráv. Na základě zpráv a jejich parametrů (vazeb) rozhodnou o přesměrování na frontu nebo jinou ústřednu. Neukládejte zprávy.

Termín výměna znamená algoritmus a instance algoritmu. Říkají také typ výměny a instance výměny.

AMQP definuje sadu standardních typů výměn. Aplikace si mohou vytvořit vlastní instanci výměny.


Každá burza implementuje svůj vlastní směrovací algoritmus. Existuje několik standardních typů výměn popsaných ve funkční specifikaci normy. Z nich jsou důležité dva:

Server vytvoří několik výměn, včetně přímých a tematických. Budou mít známá jména a klientské aplikace s nimi budou umět pracovat.

Životní cyklus burzy

Každý server AMQP předem vytváří několik instancí výměny. Tyto instance existují, když je server spuštěn a nelze je zničit. Aplikace AMQP mohou také vytvářet své vlastní burzy. AMQP k tomu nepoužívá metodu create, místo toho je deklarována instance, která se řídí logikou: „vytvořit, pokud není vytvořen, pokračovat jinak“. Dá se říci, že vytváření směny je idempotentní . Aplikace pravděpodobně vytvoří výměny podle potřeby a poté je zničí jako zbytečné. AMQP poskytuje metodu pro zničení výměny.

Směrovací klíč

Obecně platí, že ústředna zkoumá vlastnosti zprávy, pole záhlaví a obsah jejího těla a pomocí těchto a případně dat z jiných zdrojů rozhodne, jak zprávu směrovat. Ve většině jednoduchých případů výměna zvažuje jedno klíčové pole, které nazýváme směrovací klíč . Směrovací klíč je virtuální adresa, kterou může server Exchange použít k rozhodnutí, zda odeslat zprávu. Pro směrování z bodu do bodu je klíčem směrování obvykle název fronty zpráv. U směrování pub-sub je směrovacím klíčem obvykle hodnota hierarchie tématu (téma – viz publikace/subscruber). Ve složitějších případech lze směrovací klíč kombinovat se směrováním podle polí hlavičky zprávy a/nebo obsahu zprávy.

Fronta zpráv

Když klientská aplikace vytvoří frontu zpráv, může určit následující vlastnosti:

Životní cyklus zprávy

Zpráva AMQP se skládá ze sady vlastností a neveřejného obsahu. Novou zprávu vytvoří výrobce pomocí klientského API AMQP. Producent ke zprávě přidá obsah a případně nastaví některé vlastnosti zprávy. Producent označí zprávu směrovací informací, která vypadá jako adresa, ale může to být cokoliv. Producent poté odešle zprávu k výměně . Když zpráva dorazí na server, Exchange ji (obvykle) směruje do sady front, které také existují na serveru. Pokud zpráva není směrovatelná, burza ji může zahodit nebo vrátit do aplikace. Výrobce rozhodne, jak naložit s nesměrovatelnými zprávami.

Jedna zpráva může existovat v mnoha frontách zpráv. Server to může zpracovat různými způsoby, jako je kopírování zprávy pomocí počítání referencí atd. Interoperabilita to neovlivňuje. Pokud je však zpráva směrována do více front zpráv, je v každé frontě zpráv identická. Neexistuje zde žádný jedinečný identifikátor, který by rozlišoval mezi různými kopiemi.

Když zpráva dorazí do fronty zpráv, okamžitě se ji pokusí doručit spotřebiteli prostřednictvím AMQP. Pokud to není možné, pak se zpráva uloží do fronty zpráv (na žádost výrobce do paměti nebo na disk ) a čeká, až bude spotřebitel připraven. Pokud není žádný spotřebitel , může fronta vrátit zprávu producentovi přes AMQP (opět, pokud o to producent požádal).

Když může fronta zpráv doručit zprávu spotřebiteli , odebere zprávu ze svého interního úložiště. To se může stát okamžitě nebo poté, co spotřebitel potvrdí, že úspěšně dokončil svou práci, zpracoval zprávu. Spotřebitel si vybere, jak a kdy budou zprávy „potvrzeny“. spotřebitel může zprávu také odmítnout (negativní potvrzení).

Zprávy producenta a potvrzení spotřebitelů jsou seskupeny do transakcí. Když aplikace hraje obě role, což je častý případ, provádí smíšenou práci odesílání zpráv a odesílání potvrzení a poté potvrzení nebo vrácení transakce.

Doručování zpráv ze serveru spotřebiteli je netransakční.

Výrobce

Producer je klientská aplikace, která publikuje zprávy k výměně .

Analogicky s e-mailovým zařízením můžete vidět, že výrobce neposílá zprávy přímo do fronty (fronty zpráv). Jakékoli jiné chování by narušilo abstrakci v modelu AMQ. Bylo by to podobné životnímu cyklu e-mailové zprávy: vyřešení e-mailu, obcházení směrovacích tabulek MTA a přímý zásah do poštovní schránky. To by znemožnilo vložit mezifiltrování a zpracování, jako je detekce spamu.

Model AMQ využívá stejný princip jako e-mailový systém: všechny zprávy jsou odesílány na jedinou burzu nebo MTA , která kontroluje zprávy na základě pravidel a informací, které jsou skryté před odesílatelem, a směruje je do distribučních bodů, které jsou také skryté před odesílatel. (a nasměruje je na místa odevzdání, která jsou také skryta před odesílatelem - zde jsou distribuční místa místa odevzdání z dokumentace).

spotřebitel

Consumer je klientská aplikace, která přijímá zprávy z fronty zpráv.

Naše e-mailová analogie se začíná rozpadat, když se podíváme na spotřebitele (příjemce). E-mailoví klienti jsou pasivní – mohou číst schránky, ale nemají žádný vliv na to, jak jsou tyto schránky obsazeny. S AMQP může být spotřebitel také pasivní, stejně jako e-mailoví klienti. To znamená, že můžeme napsat aplikaci, která naslouchá konkrétní frontě zpráv a jednoduše zpracovává příchozí informace. V tomto případě musí být fronta zpráv připravena před spuštěním aplikace a musí k ní být „připojena“.

Spotřebitel má také následující vlastnosti:

Je to jako mít poštovní systém, který na úrovni protokolu dokáže:

Automatický režim

Většina integračních architektur tuto úroveň složitosti nepotřebuje. Většina uživatelů AMQP potřebuje základní funkce ihned po vybalení. AMQP to poskytuje následujícím způsobem:

Výsledkem je, že základní vazba umožňuje producentovi posílat zprávy přímo do fronty zpráv, čímž emuluje nejjednodušší schéma pro odesílání zpráv do přijímače, které by lidé očekávali od tradičního middlewaru.

Základní vazba nebrání použití fronty zpráv ve složitějších návrzích. Umožňuje vám používat AMQP bez konkrétního pochopení vazebných a výměnných mechanismů.

Architektura příkazů AMQP

Tato část popisuje proces interakce mezi aplikací a serverem

Protokolové příkazy (třídy a metody)

Middleware je složitý a při návrhu struktury protokolu se jeho tvůrci snažili tuto složitost zkrotit. Jejich přístupem bylo modelovat tradiční API založené na třídách, které obsahují metody, přičemž každá metoda dělá přesně jednu věc a dělá ji dobře. Výsledkem je velká sada příkazů, která je však relativně snadno pochopitelná.

Příkazy AMQP jsou seskupeny do tříd. Každá třída pokrývá určitou funkční oblast. Některé třídy jsou volitelné – každý peer implementuje třídy, které musí podporovat.

Existují dva různé způsoby dialogu:

Pro zjednodušení zpracování metody definujeme samostatné odpovědi pro každý synchronní požadavek. To znamená, že jedna metoda se nepoužívá k zodpovězení dvou různých požadavků. To znamená, že partner při odesílání synchronního požadavku může přijímat a zpracovávat příchozí metody, dokud není přijata jedna z platných synchronních odpovědí. Tím se AMQP odlišuje od tradičnějších protokolů RPC.

Metoda je formálně definována jako synchronní požadavek, synchronní odpověď (na konkrétní požadavek) nebo asynchronní. Nakonec je každá metoda formálně definována jako na straně klienta (tj. server-klient) nebo na straně serveru (klient-server).

Mapování AMQP na Middleware API

AMQP je navržen tak, aby byl srovnatelný s middleware API. Proces párování je poněkud intelektuální, tzn. chápe, že ne všechny metody a ne všechny argumenty mají pro aplikaci smysl, ale je také mechanická, tzn. nastavením určitých pravidel lze všechny metody sladit bez ručního zásahu.

Výhodou toho je, že když se vývojáři naučí sémantiku AMQP, najdou stejnou sémantiku poskytovanou v jakémkoli rámci, který používají.

Příklad metody Queue.Declare:

Fronta . prohlásit fronta = moje . fronta auto - smazat = PRAVDA exkluzivní = NEPRAVDA

Lze jej převést na síťový rámec:

+--------+---------+----------+-----------+-------- ----+ | Fronta | prohlásit | můj _ fronta | 1 | 0 | +--------+---------+----------+-----------+-------- ----+ název metody třídy auto - smazat exkluzivní

Nebo v metodě API na vysoké úrovni

Fronta . Declare ( "my.queue" , ​​​​TRUE , FALSE );

Asynchronní metoda odpovídající logice v pseudokódu:

odeslat metodu na server

Synchronní metoda odpovídající logice v pseudokódu:

odeslat metodu požadavku na server opakovat čekat na odpověď ze serveru pokud je odezva asynchronní metodou _ způsob zpracování ( obvykle dodaný nebo vrácený obsah ) _ jiný potvrdit , že tato metoda je platnou odpovědí na požadavek opakování výstupu konec - kdyby konec - opakovat

Stojí za zmínku, že u většiny aplikací může být middleware zcela skrytý v technických vrstvách systému a že skutečné použité API je méně důležité než skutečnost, že middleware je robustní a funkční.

Chybějící upozornění

Chatty protokol je pomalý. Aktivně využíváme asynchronii v případech, kdy je problém s výkonem. To je obvykle místo, kde posíláme obsah od jednoho peer druhému. Metody odesíláme co nejrychleji, aniž bychom čekali na potvrzení. Tam, kde je to nutné, implementujeme okna a omezování na vyšší úrovni, jako je spotřebitelská úroveň.

Protokol se obejde bez upozornění, protože implementuje model tvrzení pro všechny události. Buď uspěje, nebo je vyvolána výjimka? která uzavře kanál nebo spojení.

V AMQP nejsou žádná oznámení. Úspěšná událost – tiše, neúspěch – se prohlásí. Když aplikace potřebuje explicitní sledování úspěchů a neúspěchů, měla by používat transakce.

Třída připojení

Spojení je navrženo tak, aby bylo odolné a zvládlo mnoho kanálů.

Životní cyklus připojení
  • Klient otevře připojení TCP/IP k serveru a odešle záhlaví protokolu. Toto je jediná informace, kterou může klient odeslat a která není formátována jako metoda.
  • Server odpoví verzí protokolu a dalšími vlastnostmi, včetně seznamu bezpečnostních mechanismů, které podporuje (metoda Start)
  • Klient zvolí bezpečnostní mechanismus (Start-Ok).
  • Server zahájí proces ověřování, který používá model SASL , odešle klientovi výzvu (Secure).
  • Klient odešle ověřovací odpověď (Secure-Ok). Například při použití „prostého“ autentizačního mechanismu obsahuje odpověď uživatelské jméno a heslo.
  • Server zopakuje výzvu (Secure) nebo přistoupí k vyjednávání odesláním sady parametrů, včetně maximální velikosti rámce (Tune).
  • Klient tyto parametry přijme nebo sníží (Tune-Ok).
  • Klient formálně otevře připojení a vybere virtuálního hostitele (Otevřít).
  • Server potvrdí výběr virtuálního hostitele (Otevřít-Ok).
  • Nyní klient používá připojení, jak uzná za vhodné.
  • Jeden uzel (klient nebo server) uzavře spojení (Close).
  • Druhý uzel odesílá data o ukončení spojení (Close-Ok).
  • Server a klient uzavřou sokety odpovídající připojení.

Informace se nevyměňují za chyby neúplně otevřených spojení. Hostitel, u kterého došlo k chybě, by měl bez dalšího upozornění zavřít soket.

Třída kanálu

AMQP je vícekanálový protokol. Kanály poskytují možnost multiplexovat těžké TCP/IP spojení do více lehkých spojení. Proto je protokol „přívětivější k firewallu“, protože využití portu je předvídatelné. Znamená to také, že lze snadno používat tvarování provozu a další síťové funkce QoS.

Kanály jsou na sobě nezávislé a mohou provádět různé funkce současně s jinými kanály, přičemž dostupná šířka pásma je rozdělena mezi souběžné úlohy.

Očekává se a je podporováno, že klientské aplikace s více vlákny mohou často používat model „kanál na vlákno“ pro usnadnění vývoje. Naprosto přijatelné je však také otevření více připojení k jednomu nebo více serverům AMQP z jednoho klienta. Životní cyklus kanálu je následující:

  • Klient otevře nový kanál (Otevřít)
  • Server potvrdí otevření kanálu (Open-Ok)
  • Klient a server používají kanál, jak uznají za vhodné.
  • Jeden z uzlů (klient nebo server) uzavře kanál (Zavřít)
  • Druhý uzel potvrdí uzavření kanálu (Close-Ok)

Třída Exchange

Umožňuje aplikaci spravovat instance Exchange na serveru. Tato třída umožňuje aplikaci napsat svůj vlastní skript pro zpracování zpráv, aniž by se spoléhala na jakoukoli konfiguraci.

Poznámka: Většina aplikací tuto úroveň složitosti nepotřebuje a starší middleware tuto sémantiku pravděpodobně nepodporuje.

Životní cyklus burzy
  • Klient požádá server, aby se ujistil, že výměna existuje (deklarovat). Klient to může specifikovat následovně: „vytvořit burzu, pokud neexistuje“ nebo „upozornit mě, ale nevytvářet ji, pokud neexistuje“.
  • Klient publikuje zprávy k výměně
  • Klient se může rozhodnout výměnu smazat (Delete)

Třída fronty

Třída fronty umožňuje aplikaci spravovat fronty zpráv na serveru. Toto je základní krok téměř ve všech aplikacích, které přijímají zprávy, alespoň pro ověření, že očekávaná fronta zpráv skutečně existuje.


Životní cyklus fronty

Protokol poskytuje dva životní cykly fronty:

  • Odolné fronty zpráv – používají je více spotřebitelů a existují bez ohledu na přítomnost spotřebitelů, kteří by mohli přijímat zprávy
  • Dočasné fronty zpráv – soukromé fronty pro konkrétního spotřebitele. Fronta je odstraněna, když nejsou žádní spotřebitelé.


Odolný životní cyklus fronty zpráv
  • Klient deklaruje frontu zpráv (Deklarovat s argumentem "pasivní")
  • Server potvrzuje existenci fronty (Declare-Ok)
  • Klient čte zprávy z fronty
Životní cyklus pro dočasné fronty zpráv
  • Klient vytvoří frontu zpráv (deklarujte často bez názvu fronty, takže server ji pojmenuje). Server potvrdí vytvoření (Declare-Ok)
  • Klient inicializuje spotřebitele pro vytvořenou frontu.
  • Klient zastaví spotřebitele buď explicitně, nebo uzavřením kanálu a/nebo připojení
  • Když poslední spotřebitel zmizí z fronty zpráv a po uplynutí zdvořilého časového limitu, server odstraní frontu zpráv

AMQP implementuje mechanismus odběru témat ve formě front zpráv. To umožňuje zajímavé struktury, kde může být předplatné vyrovnáváno zatížení v rámci skupiny spolupracujících předplatitelských aplikací.

Životní cyklus předplatného
  • Klient vytvoří frontu zpráv (Declare), server potvrdí (Declare-Ok)
  • Klient spáruje frontu zpráv s tématem výměny (Bind) a server potvrdí shodu (Bind-Ok)
  • Klient používá frontu zpráv, jak je popsáno výše

Základní třída

Základní třída implementuje schopnosti zasílání zpráv popsané v této specifikaci. Podporuje následující sémantiku:

  • Odesílání zpráv z klienta na server, které probíhá asynchronně (Publikovat)
  • Spuštění a zastavení spotřebitelů (spotřebovat, zrušit)
  • Odesílání zpráv ze serveru na klienta, které probíhá asynchronně (doručení, návrat)
  • Potvrzení zprávy (Potvrdit, Odmítnout)
  • Získávání zpráv z fronty synchronním způsobem (Get)

Transakční třída

AMQP podporuje dva typy transakcí:

  1. Automatické transakce, ve kterých jsou každá zveřejněná zpráva a potvrzení zpracovány jako autonomní transakce.
  2. Transakce na lokálním serveru, ve kterých server ukládá do vyrovnávací paměti publikované zprávy a potvrzení a na žádost klienta je schvaluje.

Třída Transaction (“tx”) poskytuje aplikacím přístup k druhému typu transakcí, transakcím na lokálním serveru. Sémantika třídy je následující:

  1. Aplikace požaduje transakce serveru v každém kanálu, ve kterém chce takové transakce přijímat (Vybrat)
  2. Aplikace funguje (publikovat, potvrdit)
  3. Aplikace provádí potvrzení nebo vrácení zpět (Commit, Roll-back)
  4. Aplikace nadále funguje

Transakce se týkají publikování obsahu a potvrzení, nikoli doručení. Proto vrácení nezařadí do fronty a nespustí opětovné doručení. Klient může tyto zprávy potvrdit v další transakci.

Dopravní architektura AMQP

Tato část vysvětluje, jak se příkazy mapují na protokol na úrovni drátu .

Popis

AMQP je binární protokol. Informace jsou organizovány do rámců různých typů. Rámce obsahují metody protokolu a další informace. Všechny rámce mají stejný obecný formát: záhlaví rámce, užitečné zatížení a konec rámce. Formát užitečného zatížení rámce závisí na typu rámce.

Na transportní úrovni se předpokládá použití TCP/IP stacku nebo analogů.

V rámci jednoho zásuvkového připojení může existovat několik nezávislých toků ovládání, nazývaných kanály. Každý snímek je očíslován číslem kanálu. Prokládáním svých rámců sdílejí různé kanály toto spojení. Pro jakýkoli daný kanál jsou rámce prováděny v přísném pořadí, které lze použít k řízení analyzátoru protokolu (obvykle stavového automatu).

Vytváříme rámce pomocí malé sady datových typů, jako jsou bity, celá čísla, řetězce a tabulky polí. Pole rámců jsou pevně zabalena, aniž by byla zpomalená nebo obtížně analyzovatelná. Je relativně snadné vytvořit rámovací vrstvu mechanicky ze specifikací protokolu.

Formátování na úrovni drátu je navrženo tak, aby bylo škálovatelné a dostatečně univerzální pro použití v libovolných protokolech vysoké úrovně (nejen AMQP). Předpokládáme, že AMQP se bude časem rozšiřovat, zlepšovat a jinak měnit a formát na úrovni drátu to bude podporovat.

Datové typy

Datové typy AMQP používané v rámcích:

  • Celá čísla (od 1 do 8 oktetů) se používají k vyjádření velikostí, velikostí, limitů atd. Celá čísla jsou vždy bez znaménka a mohou být v rámci rámce špatně zarovnaná.
  • bitů
  • Krátké řetězce používané k ukládání vlastností krátkého textu. Krátké řetězce jsou omezeny na 255 oktetů a lze je analyzovat bez rizika přetečení vyrovnávací paměti. (Mám podezření, že mluvíme o jednom oktetu ve 255 státech a ne o 255 oktetech)
  • Dlouhé řetězce používané k ukládání částí binárních dat
  • Pole tabulky obsahující dvojice název-hodnota. Hodnoty polí se zadávají jako řetězce, celá čísla atd.

Vyjednávání protokolu

Klient a server vyjednají protokol. To znamená, že když se klient připojí, server nabídne určité možnosti, které může klient přijmout nebo změnit. Když se oba shodnou na výsledku, spojení se považuje za navázané. Vyjednávání je užitečné, protože umožňuje nastavit předvolby připojení.

Ke koordinaci dochází v několika aspektech:

  • Aktuální protokol a jeho verze. Server MŮŽE zpracovávat více protokolů na jednom portu.
  • Šifrovací argumenty a autentizace obou stran. Je součástí funkční vrstvy protokolu.
  • Maximální velikost rámce, počet kanálů a další provozní omezení

Dohodnuté limity mohou oběma stranám umožnit předem přidělit vyrovnávací paměti klíčů, čímž se zabrání uváznutí. Každý příchozí rámec buď dodržuje vyjednané limity a je tedy bezpečný, nebo je překračuje, v takovém případě druhá strana selhala a musí být deaktivována. To je velmi dobře v souladu s filozofií AMQP „buď to funguje, jak má, nebo nefunguje vůbec“.

Oba uzly vyjednávají limity na nejnižší dohodnutou hodnotu následovně:

  • Server MUSÍ klientovi sdělit, jaké limity nabízí.
  • Klient odpoví a MŮŽE snížit limity připojení

Vymezení rámečku

TCP/IP stack - pracuje se streamy, nemá vestavěný mechanismus vymezování rámců. Stávající protokoly řeší tento problém několika různými způsoby:

  • Odeslání jednoho snímku na připojení. Je to jednoduché, ale pomalé
  • Přidání oddělovače rámců do streamu. Je to jednoduché, ale zpomaluje analýzu
  • Před každým snímkem spočítejte velikost rámce a odešlete velikost. Je to jednoduché a rychlé a tento přístup je implementován v AMQP.


Detailní záběr

Všechny rámce se skládají ze záhlaví (7 oktetů), užitečného zatížení libovolné velikosti a oktetu „konce rámce“, který detekuje poškozené rámce:

0 1 3 7 velikost + 7 velikost + 8 +------+---------+------------+ +------------+ +--- ---------+ | typ | kanál | velikost | | užitečné zatížení | | rám - konec | +------+---------+------------+ +------------+ +--- ---------+ oktet krátký dlouhý oktet oktet _

Rámeček se čte takto:

  1. Přečtěte si záhlaví a zkontrolujte typ rámce a kanál
  2. V závislosti na typu rámce jsou data čtena z užitečného zatížení a zpracovávána
  3. Konec rámce pro čtení.

V realistických implementacích, kde jde o výkon, použijeme „ukládání do vyrovnávací paměti před čtením“ nebo „shromažďování čtení“, abychom se vyhnuli provádění tří samostatných systémových volání pro čtení rámce.

Method Frames

Rámce metod nesou příkazy protokolu na vysoké úrovni (které nazýváme "metody"). Jeden rámec metody nese jednu instrukci. Užitná zátěž rámce metody má následující formát:

0 2 4 +----------+----------- + ----------------- | třída - id | metoda - id | argumenty ... +----------+----------- + ----------------- krátké krátké ...

S rámcem metody se zachází takto:

1. Čtení rámce metody užitečného zatížení.

2. Jeho rozbalení do struktury. Tato metoda má vždy stejnou strukturu, takže ji můžete rychle rozbalit

3. Zkontrolujte, zda je tato metoda v aktuálním kontextu povolena.

4. Kontrola platnosti argumentů metody.

5. Provedení této metody.

Tělo rámce metody je vytvořeno jako seznam datových polí AMQP (bity, celá čísla, řetězce a tabulky řetězců). Zařazovací kód je triviálně generován přímo ze specifikací protokolu a může být velmi rychlý.

Rámce obsahu

Obsah jsou data aplikace, která přenášíme z klienta na klienta prostřednictvím serveru AMQP. Obsah je, zhruba řečeno, soubor vlastností plus binární část dat. Sada povolených vlastností je definována základní třídou a tvoří „rámec hlavičky obsahu“. Data mohou být libovolné velikosti a mohou být rozdělena do několika (nebo mnoha) bloků, z nichž každý tvoří „kostru těla obsahu“.

Když se podíváme na snímky pro konkrétní kanál, jak jsou přenášeny po drátě, můžeme vidět něco takového:

[ metoda ] [ metoda ] [ hlavička ] [ tělo ] [ tělo [ metoda ] ...

Některé metody (jako Basic.Publish , Basic.Deliver atd.) jsou formálně definovány jako obsahové. Když partner odešle takový rámec metody, vždy za ním následuje hlavička obsahu a několik rámců těla obsahu nebo bez nich. Záhlaví rámce obsahu má následující formát:

0 2 4 12 14 +----------+--------+-----------+----------------+ ---------------- _ _ | třída - id | hmotnost | velikost těla | vlajky majetku | seznam nemovitostí ... +----------+--------+-----------+----------------+ ---------------- _ _ krátký krátký dlouhý dlouhý krátký zbytek ...

Tělo obsahu jsme umístili do samostatných rámců (namísto toho, abychom jej zahrnuli do metody), takže AMQP může podporovat metody „nulové kopie“, kde obsah není nikdy zařazen ani kódován. Vlastnosti obsahu vkládáme do jejich vlastního rámce, aby příjemci mohli selektivně vyřadit obsah, který nechtějí zpracovávat.

Heartbeat Frames

Heartbeat je technika navržená tak, aby potlačila jednu z funkcí TCP/IP, konkrétně jeho schopnost zotavit se z přerušeného fyzického připojení, které se ukončí až po poměrně dlouhém časovém limitu. V některých scénářích potřebujeme velmi rychle vědět, zda je peer mimo provoz nebo nereaguje z jiných důvodů (například se zasekne ve smyčce). Vzhledem k tomu, že heartbeat lze provádět na nízké úrovni, budeme to implementovat jako speciální typ rámce, který se vyměňuje mezi uzly na transportní vrstvě, spíše než jako metodu třídy.

Zpracování chyb

AMQP používá výjimky pro zpracování chyb. Jakákoli provozní chyba (nenalezena fronta zpráv, nedostatečná přístupová práva atd.) spustí výjimku kanálu. Jakákoli strukturální chyba (špatný argument, špatná sekvence metod atd.) má za následek výjimku připojení. Výjimka uzavře kanál nebo připojení a vrátí kód odpovědi a tělo odpovědi klientské aplikaci. Používáme 3místný kód odpovědi plus textové schéma odpovědi, které se používá v HTTP a mnoha dalších protokolech.


Uzavření kanálů a spojení

O připojení nebo kanálu se říká, že je „otevřený“ pro klienta, když odešle Open, a pro server, když odešle Open-Ok. Od této chvíle musí partner, který chce uzavřít kanál nebo spojení, tak učinit pomocí protokolu handshake, který je zde popsán.

Uzavření kanálu nebo připojení z jakéhokoli důvodu - normálního nebo výjimečného - musí být provedeno opatrně. Náhlé zavření nejsou vždy rychle detekovány a po výjimce můžeme ztratit kódy odezvy na chybu. Správný návrh je ručně vyjednat uzavření tak, aby se kanál/spojení uzavřelo až poté, co jsme si jisti, že si druhá strana uvědomuje situaci.

Když se partner rozhodne ukončit kanál nebo připojení, odešle metodu Close. Přijímací uzel musí reagovat na uzavření pomocí Close-Ok a poté mohou obě strany uzavřít svůj kanál nebo spojení. Všimněte si, že pokud partneři ignorují Close, může dojít k zablokování, pokud oba partneři pošlou Close ve stejnou dobu.


Architektura klienta AMQP

Je možné číst a zapisovat rámce AMQP přímo z aplikace, ale to by byl špatný design. I ta nejjednodušší konverzace AMQP je mnohem složitější než například HTTP a vývojáři aplikací nepotřebují rozumět věcem, jako jsou binární formáty rámců, aby mohli odeslat zprávu do fronty zpráv. Doporučená architektura klienta AMQP se skládá z několika úrovní abstrakce:

  1. Fraiming Layer – přebírá metody protokolu AMQP v nějakém jazykovém formátu (struktury, třídy atd.) a serializuje je jako rámce na drátové úrovni. Rámcovou vrstvu lze mechanicky generovat ze specifikací AMQP (které jsou definovány v jazyce modelování protokolu, implementovány v XML a speciálně navrženy pro AMQP).
  2. vrstva správce připojení – čte a zapisuje rámce AMQP a spravuje celkovou logiku připojení a relace. V této vrstvě můžeme zapouzdřit kompletní logiku pro otevření připojení a relace, zpracování chyb, odesílání a přijímání obsahu a tak dále. Velké části této vrstvy lze vytvořit automaticky ze specifikací AMQP. Specifikace například definují, které metody přenášejí obsah, takže lze mechanicky vytvořit logiku „odeslat metodu a poté volitelně odeslat obsah“.
  3. API Layer – poskytuje specifické API pro práci s aplikacemi. Vrstva API může odrážet některé existující standardy nebo může poskytovat metody AMQP vyšší úrovně vytvořením mapování, jak bylo popsáno výše. Metody AMQP jsou navrženy tak, aby toto mapování bylo jednoduché a užitečné. Vrstva API samotná může být složena z více vrstev, jako je API vyšší úrovně postavené na API metody AMQP.

Obvykle také existuje určitá úroveň I/O, která může být velmi jednoduchá (synchronní soket čtení a zápis) nebo komplexní (plně asynchronní vícevláknové I/O). Tento diagram ukazuje obecnou doporučenou architekturu:

+------------------------+ | aplikace | +-----------+------------+ | +------------------------+ +---| Vrstva API |---- Klientská vrstva API -----+ | +-----------+------------+ | | | | | +-----------------------+ +----------------+ | | | Správce připojení +----+ Vrstva rámování | | | +-----------+------------+ +-------+ | | | | | +------------------------+ | +---| Asynchronní I / O vrstva |-------------------------+ +-----------+------------+ | ------- - - - - Síť - - - - -------

Když v tomto dokumentu mluvíme o „klientském API“, máme na mysli všechny vrstvy pod aplikací (i/o, rámování, správce připojení a vrstvy API. O „klientském API“ a „aplikaci“ obvykle mluvíme jako o dvou samostatných věcech, kde aplikace používá klientské API ke komunikaci s middlewarovým serverem.

Funkční specifikace

Funkční specifikace serveru

Zprávy a obsah

Zpráva je atomární procesorová jednotka směrovacího a middlewarového systému řazení do fronty. Zprávy obsahují obsah, který se skládá z hlavičky obsahu obsahujícího sadu vlastností a těla obsahu obsahujícího neprůhledný blok binárních dat.

Zpráva může odpovídat mnoha různým entitám aplikace:

  • Zpráva aplikační vrstvy
  • Odesílání souboru
  • rámec datového toku

Zprávy mohou být trvalé. Trvalá zpráva je bezpečně uložena na disku a je zaručeno, že bude doručena i v případě velkého výpadku sítě, selhání serveru, přetečení atd.

Zprávy mohou mít přednost. Zpráva s vysokou prioritou je odeslána před zprávami s nižší prioritou čekajícími ve stejné frontě zpráv. Když je potřeba zahodit zprávy, aby byla zachována určitá úroveň kvality služeb, server nejprve zahodí zprávy s nízkou prioritou.

Server NESMÍ upravovat těla obsahu zpráv, které přijímá a předává spotřebitelským aplikacím. Server MŮŽE přidat informace do záhlaví obsahu, ale NESMÍ odstraňovat nebo upravovat existující informace.

Virtuální hostitelé

Virtuální hostitel je část dat na serveru, administrativní pohodlí, které se ukáže jako užitečné pro ty, kteří chtějí poskytovat AMQP jako službu na sdílené infrastruktuře.

Virtuální hostitel obsahuje svůj vlastní jmenný prostor, sadu výměn, fronty zpráv a všechny související objekty. Každé připojení musí být spojeno s jedním virtuálním hostitelem.

Klient si po ověření vybere virtuálního hostitele v metodě Connection.Open. To znamená, že schéma ověřování serveru je společné pro všechny virtuální uzly na tomto serveru. Použité schéma autorizace však může být jedinečné pro každého virtuálního hostitele. To by mělo být užitečné pro sdílenou hostingovou infrastrukturu. Správci, kteří vyžadují různá schémata ověřování pro každého virtuálního hostitele, musí používat samostatné servery

Všechny kanály v rámci připojení pracují se stejným virtuálním hostitelem. Neexistuje způsob, jak kontaktovat jiného virtuálního hostitele na stejném připojení, a neexistuje způsob, jak přepnout na jiného virtuálního hostitele, aniž by bylo připojení zrušeno a začalo znovu.

Protokol nenabízí žádné mechanismy pro vytváření nebo konfiguraci virtuálních hostitelů - to se děje blíže nespecifikovaným způsobem v rámci serveru a je zcela závislé na implementaci.

Výměny

Exchange je agent pro směrování zpráv uvnitř virtuálního hostitele. Instance výměny (kterou běžně označujeme jako "výměna") přijímá zprávy a informace o směrování - zejména směrovací klíč - a buď předává zprávy do front zpráv nebo interním službám. Ústředny jsou pojmenovány podle jednotlivých virtuálních hostitelů.

Aplikace mohou volně vytvářet, sdílet a ničit instance Exchange v rámci své autority.

Výměny mohou být trvalé, dočasné nebo automaticky smazané. Trvalé výměny existují, dokud nejsou odstraněny. Dočasné výměny existují až do vypnutí serveru. Automaticky odstraněné výměny existují, dokud se již nepoužívají.

Server poskytuje specifickou sadu typů výměny. Každý typ výměny implementuje specifické mapování a algoritmus, jak je definováno v další části. AMQP předepisuje malý počet typů výměn a doporučuje několik dalších. Kromě toho může každá implementace serveru přidat své vlastní typy výměny.

Výměna může směrovat jednu zprávu do více front zpráv paralelně. Tím se vytvoří více instancí zpráv, které se spotřebovávají nezávisle na sobě.

Typ přímé výměny

typ přímé výměny funguje takto:

  1. Fronta zpráv je mapována na server Exchange pomocí směrovacího klíče K.
  2. Vydavatel odešle výměnnou zprávu se směrovacím klíčem R.
  3. Zpráva je odeslána do fronty zpráv, pokud K = R.

Server MUSÍ implementovat přímou výměnu a MUSÍ předdefinovat v každém virtuálním hostiteli alespoň dvě přímé výměny: jednu s názvem amqp.direct a jednu bez veřejného jména , která slouží jako výchozí výměna pro zpracování veřejných metod.

Všimněte si, že fronty zpráv lze kontaktovat pomocí jakékoli platné hodnoty klíče směrování, ale nejčastěji budou fronty zpráv kontaktovány pomocí jejich vlastního jména jako klíče směrování.

Zejména všechny fronty zpráv BY MĚLY být automaticky vázány na výměnu bez veřejného jména s použitím názvu fronty zpráv jako směrovacího klíče.

Typ výměny Fanout

Fanout Exchange funguje takto:

  1. Fronta zpráv je vázána na server Exchange bez jakýchkoli argumentů.
  2. vydavatel pošle zprávu k výměně.
  3. Zpráva je bezpodmínečně předána do fronty zpráv.

Návrh a implementace Fanout Exchange je triviální. Tento typ výměny a předem deklarovaný název amq.fanout jsou povinné.

Typ výměny témat

Výměna témat funguje takto:

  1. Fronta zpráv je vázána na server Exchange pomocí směrovacího vzoru P.
  2. Vydavatel odešle výměnnou zprávu se směrovacím klíčem R.
  3. Zpráva je odeslána do fronty zpráv, pokud R odpovídá P.

Směrovací klíč používaný pro výměnu témat se musí skládat ze slov oddělených tečkami. Minimální velikost slova je 0 znaků. Každé slovo může obsahovat písmena AZ a az a také číslice 0-9.

Vzor směrování se řídí stejnými pravidly jako směrovací klíč s dodatkem, že * odpovídá jednomu slovu a # odpovídá žádnému nebo více slovům. Směrovací schéma *.stock.# tedy odpovídá směrovacím klíčům usd.stock a eur.stock.db, ale nikoli stock.nasdaq.

Jedním z navrhovaných schémat pro Topic Exchange je ponechat sadu všech známých směrovacích klíčů a aktualizovat ji, když vydavatelé použijí nové směrovací klíče. Můžete definovat všechny vazby pro daný směrovací klíč a tak rychle najít fronty zpráv pro zprávu. Tento typ výměny je volitelný.

Server musí implementovat typ výměny témat, v takovém případě musí server nejprve deklarovat alespoň jednu výměnu témat s názvem amq.topic v každém virtuálním hostiteli.

Typ výměny záhlaví

typ výměny hlaviček funguje takto:

  1. Fronta zpráv je vázána na výměnu s tabulkou argumentů obsahující záhlaví, která by měla být pro tuto vazbu shodná, a volitelně hodnoty, které by měly obsahovat. Směrovací klíč se nepoužívá.
  2. Vydavatel odešle zprávu na burzu, kde vlastnost headers obsahuje tabulku názvů a hodnot.
  3. Zpráva je předána do fronty, pokud vlastnost headers odpovídá argumentům, se kterými byla fronta spojena.

Porovnávací algoritmus je řízen speciálním vazebným argumentem předaným jako pár název-hodnota v tabulce argumentů. Tento argument se nazývá „X-match“. Může nabývat jedné ze dvou hodnot, které určují, jak se při párování zachází s jinými páry hodnot názvu v tabulce:

  • 'all' znamená, že všechny ostatní páry musí odpovídat vlastnosti headers zprávy, aby byla tato zpráva přesměrována (AND)
  • 'any' znamená, že zpráva by měla být přesměrována, pokud některé z polí ve vlastnosti headers odpovídá jednomu z polí v tabulce argumentů (OR)

Pole v argumentech vazby odpovídá poli ve zprávě, pokud je splněna následující podmínka: buď pole v argumentech vazby nemá žádnou hodnotu a pole se stejným názvem je přítomno v záhlaví zprávy, nebo pokud pole ve vazbě arguments má hodnotu a pole se stejným názvem existuje v záhlaví zpráv a má stejný význam.

Jakékoli pole začínající na 'x -' jiné než 'X-match' je vyhrazeno pro budoucí použití a bude ignorováno

Server MUSÍ implementovat typ výměny záhlaví a server MUSÍ předem deklarovat alespoň jeden typ výměny záhlaví s názvem amq.match v každém virtuálním hostiteli.

Typ výměny systému

Typ výměny systému funguje takto:

  1. Vydavatel odešle zprávu k výměně se směrovacím klíčem S.
  2. Systémová ústředna jej odešle systémové službě S.

Systémové služby začínající na "amq." vyhrazeno pro AMQP. Lze použít všechna ostatní jména. Tento typ výměny je volitelný.

Vlastní typy výměn

Všechny názvy vlastních typů výměn musí začínat "x -". Typy výměn, které nezačínají "x -" jsou rezervovány pro budoucí použití ve standardu AMQP.

Fronty zpráv

Fronta zpráv je pojmenovaná FIFO, která obsahuje zprávy z aplikací. Aplikace mohou volně vytvářet, sdílet, používat a ničit fronty zpráv v rámci své autority.

Všimněte si, že pokud existuje více čtenářů z fronty nebo klientských transakcí nebo pomocí prioritních polí nebo pomocí selektorů zpráv nebo optimalizace doručení specifické pro implementaci, fronta nemusí mít skutečné charakteristiky FIFO. Jediným způsobem, jak zaručit FIFO, je mít ve frontě připojený pouze jeden spotřebitel. V těchto případech lze frontu popsat jako „slabé FIFO“.

Fronty zpráv mohou být trvalé, dočasné nebo automaticky odstraňované. Trvalé fronty zpráv existují, dokud nejsou odstraněny. Dočasné fronty zpráv existují, dokud není server vypnut. Fronty automatického mazání trvají, dokud se již nepoužívají.

Fronty zpráv ukládají své zprávy do paměti, na disk nebo do nějaké kombinace těchto dvou. Fronty zpráv jsou pojmenovány podle virtuálního hostitele.

Fronty zpráv obsahují zprávy a distribuují je jednomu nebo více zákaznickým klientům. Zpráva odeslaná do fronty zpráv není nikdy odeslána více než jednomu klientovi, pokud nebyla odmítnuta

Jedna fronta zpráv může obsahovat různé typy obsahu současně a nezávisle. To znamená, že pokud jsou hlavní obsah a obsah souboru odeslány do stejné fronty zpráv, budou na vyžádání nezávisle doručovány spotřebním aplikacím.

Vazby

Vazba je spojení mezi frontou zpráv a výměnou dat. Vazba definuje směrovací argumenty, které sdělují výměně, které zprávy by měla fronta přijímat. Aplikace vytvářejí a ruší vazby podle potřeby, aby směrovaly tok zpráv do jejich front zpráv. Životnost vazby závisí na frontách zpráv, pro které jsou definovány – když je fronta zpráv zničena, je zničena i její vazba. Konkrétní sémantika metody Queue.Bind závisí na typu výměny.

Spotřebitelé - spotřebitelé

Termín spotřebitel používáme k označení jak klientské aplikace, tak entity, která řídí, jak konkrétní klientská aplikace přijímá zprávy z fronty zpráv. Když klient „spustí spotřebitele“, vytvoří na serveru spotřebitelskou entitu. Když klient "zruší spotřebitele", zničí entitu spotřebitele na serveru. Spotřebitelé patří ke stejnému klientskému kanálu a nutí frontu zpráv, aby posílala zprávy klientovi asynchronně.

Kvalita služeb

Kvalita služby určuje rychlost odesílání zpráv. Kvalita služby závisí na typu distribuovaného obsahu. Obecně QoS používá koncept "prefetch" k označení toho, kolik zpráv nebo kolik oktetů dat bude odesláno, než klient zprávu potvrdí. Cílem je odeslat data zprávy s předstihem, aby se snížila latence.

Poděkování

Potvrzení je formální signál z klientské aplikace do fronty zpráv, že úspěšně zpracovala zprávu. Existují dva možné modely ověřování:

  1. Automaticky - ve kterém server odstraní obsah z fronty zpráv, jakmile je doručen do aplikace (metodou Deliver nebo Get-Ok).
  2. Explicitní – klientská aplikace musí odeslat metodu Ack pro každou zprávu nebo dávku zpráv, které zpracovala

Klientské vrstvy mohou samy implementovat explicitní potvrzení různými způsoby, například ihned po přijetí zprávy nebo když aplikace oznámí, že ji zpracovala. Tyto rozdíly neovlivňují AMQP ani interoperabilitu.

řízení toku

Řízení toku je nouzový postup používaný k zastavení toku zpráv od partnera. Funguje stejně mezi klientem a serverem a je implementován příkazem Channel.Flow. Flow Control je jediný mechanismus, který může zastavit nadměrně produktivního vydavatele. Spotřebitel může použít elegantnější mechanismus předběžného načítání okna, pokud používá potvrzení (což obvykle znamená použití transakcí).

Konvence pojmenování

Tyto konvence řídí pojmenování entit AMQP. Server a klient musí respektovat tyto konvence:

  • Vlastní výměny musí začínat předponou „x-“.
  • Instance standardní výměny musí začínat předponou "amq."
  • Standardní systémové služby musí začínat předponou "amq."
  • Standardní fronty zpráv musí začínat předponou "amq."

Specifikace příkazů AMQP (třídy a metody)

Poznámky

Metody AMQP mohou z důvodů kompatibility definovat minimální hodnoty (jako je počet spotřebitelů ve frontě zpráv). Tato minima jsou definována v popisu každé třídy.

Vyhovující implementace AMQP by měly implementovat poměrně velkorysé hodnoty pro taková pole, minima jsou určena pouze pro použití na nejméně schopných platformách.

Gramatiky používají tento zápis:

  • 'S:' označuje data nebo metodu odeslanou ze serveru klientovi;
  • 'C:' označuje data nebo metodu odeslanou z klienta na server;
  • +podmínka nebo +(...) výraz znamená "1 nebo více instancí";
  • *podmínka nebo *(...) výraz znamená "nula nebo více instancí".

Metody definujeme jako:

  • synchronní požadavek ("syn request"). Odesílající hostitel musí čekat na konkrétní metodu odezvy, ale může ji implementovat asynchronně;
  • synchronní odpověď ("syn odpověď pro XYZ");
  • asynchronní požadavek nebo odpověď ("asynchronní")

Technická specifikace

Čísla portů definovaná IANA

Standardní číslo portu AMQP bylo přiděleno IANA jako 5672 pro TCP i UDP. Port UDP vyhrazený pro použití v budoucích implementacích vícesměrového vysílání

Wire-level formát pro AMQP

Oficiální gramatický protokol

Poskytujeme kompletní gramatiku pro AMQP (tato je poskytována pro referenci a možná vás bude zajímat sledování částí, které podrobně popisují různé typy rámců a jejich formáty):

amqp = protokol - hlavička * amqp - jednotka protokol - hlavička = doslovný - protokol AMQP - protokol id - verze doslovný - AMQP = % d65 .77.81.80 ; "AMQP" protokol - id = % d0 ; Musí být 0 protokol - verze = % d0.9.1 ; _ 0-9-1 metoda = metoda - rámec [ obsah ] metoda - rámec = % d1 rámec - metoda vlastností - rámec užitečného zatížení - konec rám - vlastnosti = užitečné zatížení kanálu - velikost kanál = short - uint ; ne - nula užitečné zatížení - velikost = dlouhá - uint metoda - užitečné zatížení = třída - metoda id - id * amqp - pole class - id = % x00 ,01 - % xFF . FF metoda - id = % x00 ,01 - % xFF . FF amqp - pole = BIT / OCTET / krátký - uint / dlouhý - uint / dlouhý - dlouhý - uint / krátký - řetězec / dlouhý - řetězec / časové razítko / pole - tabulka krátký - uint = 2 * OCTET dlouhý - uint = 4 * OCTET dlouhý - dlouhý - uint = 8 * OCTET short - string = OCTET * string - char ; délka + obsah řetězec - char = % x01 .. % xFF long - string = long - uint * OCTET ; délka + obsah časové razítko = long - long - uint ; 64bitový POSIX _ _ pole - tabulka = long - uint * pole - hodnota - pár pole - hodnota - dvojice = pole - název pole - hodnota pole - jméno = krátký - řetězec pole - hodnota = 't' boolean / 'b' short - short - int / 'B' krátký - krátký - uint / 'U' krátké - int / 'u' krátké - uint / 'I' long - int / 'i' dlouho - uint / 'L' long - long - int / 'l' long - long - uint / 'f' plovoucí / 'd' dvojnásobek / 'D' desítkové - hodnota / 's' krátký - řetězec / 'S' dlouhý - řetězec / 'A' pole - pole Časové razítko / 'T' / 'F' pole - tabulka / 'V' ; žádné pole boolean = OCTET ; 0 = NEPRAVDA , jinak PRAVDA short - short - int = OCTET krátký - krátký - uint = OCTET krátký - int = 2 * OCTET dlouhý - int = 4 * OCTET long - long - int = 8 * OCTET float = 4 * OCTET ; IEEE -754 double = 8 * OCTET ; rfc1832 XDR double desítkový - hodnota = měřítko dlouhé - uint měřítko = OCTET ; počet desetinných číslic _ pole - pole = long - int * pole - hodnota ; pole hodnot _ rám - konec = % xCE obsah = % d2 obsah - záhlaví * obsah - tělo obsah - záhlaví = rámec - záhlaví vlastností - rámec užitečného zatížení - konec záhlaví - užitečné zatížení = obsah - obsah třídy - hmotnost obsah - tělo - velikost vlastnost - příznaky vlastnost - seznam obsah - třída = oktet obsah - hmotnost = % x00 obsah - tělo - velikost = dlouhý - dlouhý - uint vlastnost - příznaky = 15 * BIT % b0 / 15 * BIT % b1 vlastnost - příznaky vlastnost - seznam = * amqp - pole obsah - karoserie = % d3 rám - vlastnosti karoserie - užitečné zatížení rám - konec karoserie - užitečné zatížení = * OCTET tep = % d8 % d0 % d0 snímek - konec


Používáme rozšířenou syntaxi BNF definovanou v IETF RFC 2234. Závěrem:

  • Název pravidla je pouze samotný název
  • Terminály jsou specifikovány jedním nebo více číselnými znaky, přičemž základní interpretace těchto znaků je označena jako "d" nebo "x"
  • Pravidlo může definovat jednoduchý uspořádaný řetězec hodnot výpisem posloupnosti názvů pravidel
  • Rozsah alternativních číselných hodnot lze zadat kompaktně pomocí pomlčky ( " - " ) k označení rozsahu
  • S prvky v závorkách se zachází jako s jedním prvkem, jehož obsah je přísně uspořádaný.
  • Prvky oddělené lomítkem ( " / " ) jsou alternativy.
  • Operátor * před prvkem označuje opakování. Dlouhý tvar: "<a>*< b>element", kde <a> a <b> jsou volitelné desítkové hodnoty, minimálně <a> a maximálně <b> výskytů prvku.
Záhlaví protokolu

Klient musí zahájit nové připojení odesláním hlavičky protokolu. Toto je 8 oktetová sekvence:

+---+---+---+---+---+---+---+---+ | 'A' | 'M' | 'Q' | 'P' | 0 | 0 | 9 | 1 | +---+---+---+---+---+---+---+---+ 8 oktetů

Záhlaví protokolu se skládá z velkých písmen "AMQP" následovaných konstantou %d0 následovanou:

  1. Hlavní verze protokolu použitá v souladu s částí 1.4.2. (vypnutá verze dokumentace 0-9-1)
  2. Vedlejší verze protokolu použitá v souladu s částí 1.4.2. (vypnutá verze dokumentace 0-9-1)
  3. Revize protokolu použitá v souladu s oddílem 1.4.2. (vypnutá verze dokumentace 0-9-1)

Model vyjednávání protokolu je kompatibilní se stávajícími protokoly, jako je HTTP, které iniciují spojení s konstantním textovým řetězcem, a s firewally, které sledují začátek protokolu, aby se rozhodly, která pravidla na něj použít.

Klient a server vyjednají protokol a verzi následovně:

  • Klient otevře nové připojení soketu k serveru AMQP a odešle záhlaví protokolu.
  • Server hlavičku protokolu buď přijme, nebo odmítne. Pokud odmítne hlavičku protokolu, zapíše platnou hlavičku protokolu do soketu a pak soket zavře.
  • V opačném případě ponechá soket otevřený a odpovídajícím způsobem implementuje protokol.

Příklad:

Klient odešle : Server odpoví : AMQP % d0 .0.9.1 Připojení . startovací metoda AMQP % d0 .1.0.0 AMQP % d0 .0.9.1 < Zavřít připojení > HTTP AMQP % d0.0.9.1 < Zavřít připojení > _

Zásady implementace protokolu:

  • Server může přijímat protokoly jiné než AMQP, jako je HTTP
  • Pokud server nerozpozná prvních 5 oktetů dat na soketu nebo nepodporuje konkrétní verzi protokolu, kterou klient požaduje, musí do soketu zapsat platnou hlavičku protokolu a potom vyprázdnit soket (aby se zajistilo, že klient aplikace přijme data) a poté uzavřete spojení se socketem. Server může vytisknout diagnostickou zprávu pro účely ladění.
  • Klient může určit verzi protokolu serveru tak, že se pokusí připojit k jeho nejvyšší podporované verzi a znovu se připojit k nižší verzi, pokud obdrží takové informace zpět ze serveru.
  • Klienti a servery implementující více verzí AMQP MUSÍ k identifikaci protokolu používat všech osm oktetů záhlaví protokolu.


Základní formát rámu

Všechny snímky začínají 7-oktetovým záhlavím, které se skládá z pole typu (oktet), pole kanálu (krátké celé číslo) a pole délky (dlouhé celé číslo):

0 1 3 7 velikost + 7 velikost + 8 +------+---------+---------+ +-------------+ +------ -----+ | typ | kanál | velikost | | užitečné zatížení | | rám - konec | +------+---------+---------+ +-------------+ +------ -----+ oktet krátký dlouhý ' velikost ' oktet oktet

AMQP definuje následující typy rámců:

  • Typ = 1, "METHODA": rámec metody.
  • Typ = 2, "HEADER": rámec záhlaví obsahu
  • Typ = 3, "BODY": rámec obsahu těla.
  • Typ = 4, "HEARTBEAT": rámec tlukotu srdce.

Číslo kanálu je 0 pro všechny rámce, které jsou pro připojení globální, a 1-65535 pro rámce, které odkazují na konkrétní kanály.

Pole velikost je velikost užitečného zatížení, kromě oktetu konce snímku. Zatímco AMQP předpokládá spolehlivý připojený protokol, používáme konec rámce k detekci chyb rámování způsobených nesprávnou implementací klienta nebo serveru.

Zásady implementace protokolu:

  • Koncový oktet musí mít vždy hexadecimální hodnotu %xCE.
  • Pokud peer obdrží rámec s typem, který není jedním z těchto definovaných typů, měl by to považovat za kritickou chybu protokolu a ukončit spojení, aniž by o něm odeslal další data.
  • Když partner čte rámec, musí před pokusem o dekódování rámce zkontrolovat, zda je konec rámce platný. Pokud konec rámce není platný, měl by to považovat za kritickou chybu protokolu a ukončit spojení, aniž by o něm odeslal další data. Měl by protokolovat informace o problému, protože to znamená chybu v implementaci rámcového kódu serveru nebo klienta.
  • Partner NESMÍ odesílat rámce větší, než je dohodnutá velikost. Partner přijímající rámec, který je příliš velký, MUSÍ signalizovat výjimku připojení s kódem odezvy 501 (chyba rámce).
  • Číslo kanálu musí být nula pro všechny rámce prezenčního signálu a pro rámce metody, záhlaví a těla, které odkazují na třídu Connection. Protějšek, který obdrží nenulové číslo kanálu pro jeden z těchto rámců, MUSÍ signalizovat výjimku spojení s kódem odezvy 503 (Neplatný příkaz).
Metoda Payloads

Těla rámců metod se skládají z neměnného seznamu datových polí nazývaných "argumenty". Všechna těla metod začínají identifikátory třídy a metody:

0 2 4 +----------+----------- + ----------------- | třída - id | metoda - id | argumenty ... +----------+----------- + ----------------- krátké krátké ...

Zásady implementace protokolu:

  • ID třídy a id metody jsou konstanty definované ve specifikacích třídy a metody AMQP.
  • Argumenty jsou sada polí AMQP specifických pro každou metodu
  • Identifikátory třídy hodnot %x00.01 až %xEF.FF jsou vyhrazeny pro standardní třídy AMQP.
  • ID tříd od %xF0.00 do %xFF.FF (%d61440-%d65535) lze použít při implementaci pro nestandardní třídy rozšíření.
Datová pole AMQP

AMQP má dvě úrovně specifikace datových polí: nativní datová pole používaná pro argumenty metod a datová pole předávaná mezi aplikacemi v tabulkách polí. Tabulky polí obsahují sadu horních indexů nativních datových polí.

Celá čísla

AMQP definuje následující typy nativních celých čísel:

  • Oktet bez znaménka (8 bitů).
  • Krátká celá čísla bez znaménka (16 bitů).
  • Dlouhá celá čísla bez znaménka (32 bitů).
  • Dlouhá dlouhá celá čísla bez znaménka (64 bitů).

Celá čísla a délky řetězců jsou vždy bez znaménka a jsou uloženy v síťovém pořadí bajtů. Nesnažíme se optimalizovat případ, kdy spolu mluví dva nízko-vysoké systémy (např. dva procesory Intel).

Zásady implementace protokolu:

  • Návrháři by neměli předpokládat, že celá čísla zakódovaná v rámci jsou zarovnána na hranicích paměťových slov.
Bity

AMQP definuje svůj vlastní typ bitového pole. Bity se shromažďují do celých oktetů. Když se v rámci dotknou dva nebo více bitů, budou zabaleny do jednoho nebo více oktetů, počínaje nejnižším bitem v každém oktetu. Neexistuje žádný požadavek, aby všechny bitové hodnoty v rámci byly souvislé, ale obvykle se tak děje za účelem minimalizace velikosti rámce.

Řetězce

Řetězce AMQP mají proměnnou délku a jsou reprezentovány délkou celého čísla následovaného nulou nebo více datovými oktety. AMQP definuje dva nativní typy řádků:

  • Krátké řetězce uložené jako 8bitové celé číslo bez znaménka následované nulou nebo více oktety dat. Krátké řetězce mohou obsahovat až 255 oktetů dat UTF-8, ale nemohou obsahovat binární nulové oktety.
  • Dlouhé řetězce uložené jako 32bitové celé číslo bez znaménka následované nulou nebo více oktety dat. Dlouhé řetězce mohou obsahovat libovolná data
Časová razítka

Časová razítka jsou uložena v 64bitovém formátu POSIX time_t s přesností jedné sekundy. Použitím 64 bitů se vyhneme budoucím problémům se zalamováním souvisejícím s 31bitovými a 32bitovými hodnotami time_t.

Okraje tabulky

Pole tabulky jsou dlouhé řetězce obsahující sbalené dvojice název-hodnota. Páry jmen a hodnot jsou zakódovány jako krátký řetězec určující název a oktet určující typ hodnoty, za kterým následuje samotná hodnota. Platné typy polí pro tabulky jsou rozšíření nativních typů celé číslo, bit, řetězec a časové razítko a jsou uvedeny v gramatice. Celočíselná pole s více oktety jsou vždy uložena v síťovém pořadí bajtů.

Zásady implementace protokolu:

  • Názvy polí musí začínat písmenem „$“ nebo „#“ a mohou pokračovat písmeny „$“ nebo „#“, číslicemi nebo podtržítky, a to až do maximální délky 128 znaků.
  • Server MUSÍ ověřit názvy polí, a když obdrží neplatný název pole, MUSÍ signalizovat výjimku připojení s kódem odezvy 503 (syntaktická chyba).
  • Desetinné hodnoty nejsou navrženy tak, aby podporovaly hodnoty s pohyblivou řádovou čárkou, ale aby podporovaly obchodní hodnoty s pevnou řádovou čárkou, jako jsou měnové kurzy a částky. Jsou zakódovány jako oktet představující počet míst, za nimiž následuje dlouhé celé číslo se znaménkem. Oktet "desetinná čísla" - bez znaménka.
  • Duplicitní pole jsou nezákonná. Chování partnera vzhledem k tabulce obsahující duplicitní pole není definováno.
Oříznutí obsahu

Určité specifické metody (Publish, Deliver atd.) zpracovávají obsah. Specifikace jednotlivých metod naleznete v kapitole "Funkční specifikace" Metody, které zpracovávají obsah, tak činí bezpodmínečně.

Obsah se skládá ze seznamu 1 nebo více rámců takto:

  1. Přesně jeden rámec záhlaví obsahu, který poskytuje vlastnosti obsahu.
  2. Volitelně jeden nebo více rámců těla obsahu

Snímky obsahu na konkrétním kanálu jsou přísně sekvenční. To znamená, že je lze smíchat s rámečky pro jiné kanály, ale nelze smíchat dva rámce obsahu ze stejného kanálu a nemohou se navzájem „překrývat“ a rámce obsahu pro stejný obsah nelze smíchat s rámečky metod na stejném kanálu. .. (původní rámce obsahu na konkrétním kanálu jsou přísně sekvenční. To znamená, že mohou být smíchány s rámečky pro jiné kanály, ale žádné dva rámce obsahu ze stejného kanálu se nesmějí míchat ani překrývat, ani rámce obsahu pro jeden obsah nesmí být smíchané s metodami na stejném kanálu.)

Všimněte si, že jakýkoli neobsahový rámec explicitně označuje konec obsahu. Zatímco velikost obsahu je dobře známá z hlavičky obsahu (a tedy i počet rámců obsahu), umožňuje to odesílateli přerušit obsah, aniž by musel zavřít kanál.

Zásady implementace protokolu:

  • Partner přijímající neúplný nebo špatně naformátovaný obsah by měl vyvolat výjimku připojení s kódem odpovědi 505 (neočekávaný rámec). To zahrnuje chybějící záhlaví obsahu, nesprávná ID tříd v záhlavích obsahu, chybějící rámce těla obsahu atd.
Název obsahu

Záhlaví užitečného zatížení obsahu má následující formát:

0 2 4 12 14 +----------+--------+-----------+----------------+ ---------------- _ _ | třída - id | hmotnost | velikost těla | vlajky majetku | seznam nemovitostí ... +----------+--------+-----------+----------------+ ---------------- _ _ krátký krátký dlouhý dlouhý krátký zbytek ...

Zásady implementace protokolu:

  • ID třídy se musí shodovat s ID třídy rámce metody. Partner musí reagovat na neplatný identifikátor třídy vyvoláním výjimky připojení s kódem odpovědi 501 (chyba rámce).
  • Pole váhy se nepoužívá a musí být nulové.
  • Velikost těla je 64bitová hodnota, která určuje celkovou velikost těla obsahu, což je součet velikostí těla následujících snímků těla obsahu. Nula označuje žádné rámce obsahu.
  • Příznaky vlastností jsou pole bitů, které indikují přítomnost nebo nepřítomnost každé hodnoty vlastnosti v sekvenci. Bity jsou seřazeny od nejvyšší po nejnižší. Bit 15 ukazuje na první vlastnost.
  • Příznaky vlastností mohou specifikovat více než 16 vlastností. Pokud je nastaven poslední bit (0), znamená to, že za ním následuje další pole příznaků vlastnosti. Existuje mnoho polí příznaků vlastností.
  • Hodnoty vlastností jsou datová pole AMQP specifická pro třídu.
  • Bitové vlastnosti jsou indikovány pouze odpovídajícím příznakem vlastnosti (1 nebo 0) a nikdy nejsou přítomny v seznamu vlastností.
  • Číslo kanálu v rámcích obsahu nesmí být nula. Partner přijímající číslo kanálu nula v rámci obsahu MUSÍ signalizovat výjimku spojení s kódem odezvy 504 (chyba kanálu).
Tělo obsahu

Obsah těla obsahu je „neprůhledný“ binární blok končící oktetem konce rámce:

+----------------------+ +-----------+ | Neprůhledné binární užitečné zatížení | | rám - konec | +----------------------+ +-----------+

Tělo obsahu lze rozdělit do libovolného počtu snímků. Maximální velikost užitečného zatížení rámce je vyjednána oběma partnery během vyjednávání o připojení.

Zásady implementace protokolu:

  • Partner musí zpracovat tělo obsahu, který je rozdělen do více rámců, uložit tyto rámce jako jednu sadu a buď je znovu přenést tak, jak jsou, rozdělit je na menší rámce nebo je sloučit do jednoho bloku pro doručení do aplikace.
snímky srdečního tepu

Snímky srdečního tepu sdělují příjemci, že odesílatel je stále naživu. Frekvence a načasování snímků Heartbeat jsou dohodnuty během nastavování připojení.

Zásady implementace protokolu:

  • Snímky prezenčního signálu musí mít číslo kanálu nula. Partner přijímající neplatný rámec Heartbeat MUSÍ vyvolat výjimku připojení s kódem odezvy 501 (Chyba rámce).
  • Pokud partner nepodporuje Heartbeat, MUSÍ zahodit rámec Heartbeat, aniž by signalizoval jakoukoli chybu nebo poruchu.
  • Klient by měl začít odesílat Heartbeat po obdržení metody Connection.Tune a začít monitorovat Heartbeat po obdržení Connection.Open. Server by měl začít odesílat a monitorovat Heartbeat po přijetí Connection.Tune-Ok
  • Uzel musí vyvinout maximální úsilí, aby v určitých intervalech posílal Heartbeat. Heartbeat lze odeslat kdykoli. Jakýkoli odeslaný oktet je platnou náhradou Heartbeatu, takže Heartbeaty by měly být odesílány pouze v případě, že provoz AMQP bez Heartbeatu není odeslán po dobu delší než jeden interval Heartbeat. Pokud partner nedetekuje žádný příchozí provoz (tj. přijaté oktety) po dva nebo více intervalů prezenčního signálu, MUSÍ ukončit spojení bez volání Connection.Close/Close-Ok handshaking a zaprotokolovat chybu
  • Heartbeat by měl pokračovat, dokud není zásuvka uzavřena, včetně během a po připojení. Zavřít/Zavřít-Ok handshaking

Kanálový multiplex

AMQP umožňuje kolegům vytvářet více nezávislých toků řízení. Každý kanál funguje jako virtuální připojení, které sdílí jeden soket:

rámy rámečky rámečky rámečky +-----------+-----------+-----------+-----------+ | kanál | kanál | kanál | kanál | +-----------+-----------+-----------+-----------+ | zásuvka | +-------------------------------------------------- ----+

Zásady implementace protokolu:

  • AMQP peer MŮŽE podporovat více kanálů. Maximální počet kanálů je určen při vyjednávání připojení a partner může tento počet vyjednat až na 1.
  • Každý peer MUSÍ vyrovnat provoz na všech otevřených kanálech spravedlivým způsobem. Toto vyvažování lze provádět na základě jednotlivých snímků nebo na základě množství provozu na kanál. Peer NESMÍ dovolit, aby jeden velmi vytížený kanál omezoval postup méně vytíženého kanálu.

Zaručená viditelnost

Server musí zajistit, aby klientská pozorování stavu serveru byla konzistentní.

Následující příklad ukazuje, co v tomto kontextu znamená pozorování klienta:

  • Klient 1 a klient 2 jsou připojeni ke stejnému virtuálnímu hostiteli
  • Klient 1 deklaruje frontu
  • Klient 1 obdrží Declare.Ok
  • Klient 1 o tom informuje klienta 2
  • Klient 2 provede pasivní deklaraci stejné fronty

Záruka viditelnosti zajišťuje, že klient 2 vidí frontu

Zavírání kanálu

Server bude považovat kanál za uzavřený, pokud dojde k některé z následujících situací:

  • Buď partner zavře kanál nebo nadřazené připojení pomocí handshake Close/Close-Ok
  • Buď partner vyvolá výjimku na kanál, nebo nadřazené připojení.
  • Buď uzel zavře nadřazené připojení bez handshakingu Close/Close-Ok

Když server uzavře kanál, všechny nepotvrzené zprávy na kanálu jsou označeny k opětovnému doručení. Když server uzavře připojení, odstraní všechny automaticky odstraněné entity patřící k tomuto připojení.

Synchronizace obsahu

V některých případech ovlivňují synchronní metody žádost-odpověď asynchronní doručování obsahu přes stejný kanál, včetně:

  • Metody Basic.Consume a Basic.Cancel, které spouštějí a zastavují tok zpráv z fronty zpráv
  • metoda Basic.Recover, která požaduje opětovné doručení zpráv do kanálu
  • Metody Queue.Bind, Queue.Unbind a Queue.Purge, které ovlivňují tok zpráv směrovaných do fronty zpráv

Zásady implementace protokolu:

  • Efekty požadavek-odpověď by neměly být viditelné na kanálu před metodou odpovědi a měly by být viditelné po ní.

Záruka objednávky obsahu

Pořadí, ve kterém metody procházejí kanálem, je stabilní: metody jsou přijímány ve stejném pořadí, v jakém jsou odesílány. Na transportní vrstvě to zajišťuje protokol TCP/IP. Kromě toho je obsah stabilně zpracováván serverem. Zejména obsah, který sleduje stejnou cestu na serveru, zůstane objednaný. Pro obsah dané priority procházející jedinou cestou definujeme cestu zpracování obsahu jako skládající se z jednoho příchozího kanálu, jedné výměny, jedné fronty a jednoho odchozího kanálu.

Zásady implementace protokolu:

  • Server MUSÍ zachovat pořadí obsahu procházejícího jedinou cestou zpracování obsahu, pokud nebylo změněno pole opětovného doručení v metodách Basic.Deliver nebo Basic.Get-Ok a v souladu s pravidly, která definují podmínky, za kterých pole může být nastaven.

Zpracování chyb

Výjimky

Při použití standardního programovacího modelu „výjimek“ AMQP nesignalizuje úspěch, pouze neúspěch. AMQP definuje dvě úrovně vyloučení:

  1. Vyloučení kanálů. Uzavřou kanál, který způsobil chybu. Výjimky kanálu jsou obvykle způsobeny "měkkými" chybami, které neovlivňují zbytek aplikace.
  2. Výjimky připojení . Uzavírají připojení soketu a jsou obvykle způsobeny "tvrdými" chybami, které indikují chybu programování, špatnou konfiguraci nebo jinou událost vyžadující pozornost.

Formálně dokumentujeme tvrzení v definici každé třídy a metody.

Formát kódu odpovědi

Kódy odpovědí AMQP se řídí definicí „Závažnosti a teorie kódu odpovědi“ v IETF RFC 2821.

Implementace

Vlastnosti protokolu AMQP

  • Řetězce v AMQP rozlišují velká a malá písmena
  • Konvence verzování - číslo verze se skládá ze dvou nebo tří číslic: major.minor.revision V tomto případě je revize volitelná. Čísla mohou nabývat hodnot od 0 do 99. Čísla od 100 a vyšší jsou vyhrazena pro interní použití. Verze 1.1 je ekvivalentní verzi 1.1.0

Poznámky

  1. Směrem ke komoditnímu podnikovému middlewaru . Získáno 14. června 2010. Archivováno z originálu 5. března 2010.

Literatura

  • Emrah Ayanoglu; Yusuf Aytas; Dotan Nahum. Zvládnutí RabbitMQ. - Packt Publishing, 2016. - 286 s. — ISBN 978-1-78398-153-3 .

Odkazy