AMQP

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2020. június 17-én felülvizsgált verziótól ; az ellenőrzések 107 szerkesztést igényelnek .

Az AMQP (Advanced Message Queuing Protocol)  egy nyílt alkalmazási réteg protokoll az üzenetek rendszerösszetevők közötti továbbítására. A fő gondolat az, hogy az egyes alrendszerek (vagy független alkalmazások) tetszőlegesen cserélhetnek üzeneteket egy AMQP-brókeren keresztül, amely útválasztást végez , esetleg garantálja az adatfolyamok kézbesítését, elosztását, előfizetést a kívánt típusú üzenetekre.

A protokoll architektúrát John O'Hara, a JP Morgan Chase & Co [1] fejlesztette ki .

Protokoll

Az AMQP három koncepción alapul:

  1. Üzenet (message) - a továbbított adatok egysége, fő részét (tartalmát) a szerver semmilyen módon nem értelmezi, az üzenethez strukturált fejlécek csatolhatók.
  2. Cserepont – üzeneteket küldenek rá. A központ az üzeneteket egy vagy több sorba osztja szét . Ugyanakkor az üzenetek nem tárolódnak a csereponton. A cserepontok három típusúak:
    • fanout - az üzenet átvitelre kerül a hozzá csatolt összes sorba;
    • közvetlen - az üzenet az útválasztási kulcsnak (routing key) megegyező névvel kerül elküldésre a sorba (az útválasztó kulcsot az üzenet küldésekor adjuk meg);
    • téma - valami fanout és közvetlen között van, az üzenet olyan sorokban kerül elküldésre, amelyekhez az útválasztási kulcs maszkja megegyezik, például app.notification.sms # - minden app.notification.sms kezdetű kulcsokkal küldött üzenet kézbesítve lesz a sorhoz.
  3. Queue - az üzenetek itt tárolódnak, amíg a kliens fel nem veszi őket. A kliens mindig egy vagy több sorból kéri le az üzeneteket.


A protokoll két rétegre osztható:

  1. Funkcionális réteg – olyan parancskészletet határoz meg, amely az alkalmazás nevében munkát végez.
  2. Transport Layer - kezeli a kéréseket az alkalmazástól a szerverhez és a szervertől az alkalmazáshoz, kezeli a csatorna multiplexelést, keretezést, kódolást, szívverést, adatbemutatót, hibakezelést.


Várólista példák:

A protokoll nem korlátozódik erre a három típusra. Ezeket példaként adjuk meg.

Terminológia

Csere

Üzeneteket fogad a szolgáltatótól, és előre meghatározott feltételek szerint továbbítja az üzenetsorba. Az ilyen kritériumokat kötéseknek nevezzük. Az Exchange egy üzenetegyeztető és -útválasztó mechanizmus. Az üzenetek és azok paraméterei (kötései) alapján döntenek a sorba vagy másik központba való átirányításról. Ne tároljon üzeneteket.

A csere kifejezés algoritmust és algoritmuspéldányt jelent. Azt is mondják, hogy a csere típusa és a cserepéldány.

Az AMQP szabványos cseretípusok készletét határozza meg. Az alkalmazások létrehozhatják saját cserepéldányukat.


Minden központ saját útválasztási algoritmust valósít meg. A szabvány Funkcionális specifikációjában több szabványos cseretípus található. Ezek közül kettő a fontos:

A szerver több cserét hoz létre, beleértve a közvetlen és a témát. Jól ismert nevük lesz, és kliens alkalmazások is tudnak majd dolgozni velük.

Csere életciklusa

Minden AMQP-kiszolgáló több cserepéldányt hoz létre előre. Ezek a példányok akkor léteznek, amikor a kiszolgáló fut, és nem semmisíthetők meg. Az AMQP alkalmazások saját központokat is létrehozhatnak. Az AMQP erre nem használja a create metódust, hanem a példány deklarálása történik meg, ami a következő logikát követi: "létrehoz, ha nem jött létre, akkor folytassa másként". Elmondható, hogy a csere létrehozása idempotens . Valószínűleg az alkalmazások szükség szerint cseréket hoznak létre, majd szükségtelenként megsemmisítik azokat. Az AMQP módszert biztosít a csere megsemmisítésére.

Routing Key

Általánosságban elmondható, hogy a központ megvizsgálja az üzenet tulajdonságait, a fejlécmezőket és a törzs tartalmát, és ezek és esetleg más forrásból származó adatok felhasználásával dönti el, hogyan továbbítsa az üzenetet. A legtöbb egyszerű esetben az Exchange egy kulcsmezőt vesz figyelembe, amelyet Routing Key -nek nevezünk . Az útválasztási kulcs egy virtuális cím, amelyet a csereszerver használhat annak eldöntésére, hogy küldjön-e üzenetet. Pont-pont útválasztásnál az útválasztási kulcs általában az üzenetsor neve. Pub-sub- routing esetén az útválasztási kulcs általában a témahierarchia értéke (téma - lásd: kiadvány/előfizetés). Bonyolultabb esetekben az útválasztási kulcs kombinálható az üzenetfejléc-mezők és/vagy az üzenettartalom szerinti útválasztással.

Üzenetsor

Amikor egy ügyfélalkalmazás üzenetsort hoz létre, a következő tulajdonságokat adhatja meg:

Egy üzenet életciklusa

Az AMQP-üzenet tulajdonságok és nem nyilvános tartalom halmazából áll. A gyártó új üzenetet hoz létre az AMQP ügyfél API használatával. A gyártó tartalmat ad az üzenethez, és esetleg beállít néhány üzenettulajdonságot. A gyártó az üzenetet útválasztási információval jelöli meg, amely címnek tűnik, de bármi lehet. A producer ezután elküldi az üzenetet a cserére . Amikor egy üzenet megérkezik a kiszolgálóhoz, az Exchange (általában) a kiszolgálón is létező várólistákhoz irányítja azt. Ha az üzenet nem irányítható, az Exchange eldobhatja vagy visszaküldheti az alkalmazásnak. A producer dönti el, hogyan kezelje a nem irányítható üzeneteket.

Egy üzenet több üzenetsorban is létezhet. A szerver ezt különböző módokon tudja kezelni, például az üzenetet referenciaszámlálással másolja, stb. Ez nem befolyásolja az együttműködést. Ha azonban egy üzenetet több üzenetsorba irányítanak át, az minden üzenetsorban azonos. Itt nincs egyedi azonosító a különböző másolatok megkülönböztetésére.

Amikor egy üzenet megérkezik az üzenetsorba, azonnal megkísérli eljuttatni a fogyasztóhoz az AMQP-n keresztül. Ha ez nem lehetséges, akkor az üzenet az üzenetsorba kerül (a gyártó kérésére a memóriában vagy a lemezen ), és várja, hogy a fogyasztó készen álljon. Ha nincs fogyasztó , akkor a sor üzenetet küldhet a gyártónak AMQP-n keresztül (ismét, ha a gyártó kérte).

Amikor az üzenetsor üzenetet tud küldeni a fogyasztónak , eltávolítja az üzenetet a belső tárhelyéről. Ez történhet azonnal, vagy azután, hogy a fogyasztó elismeri, hogy sikeresen elvégezte a munkáját, feldolgozta az üzenetet. A fogyasztó dönti el, hogy az üzeneteket hogyan és mikor „nyugtázzák”. a fogyasztó vissza is utasíthatja az üzenetet (negatív visszaigazolás).

A termelői üzenetek és a fogyasztói elismervények tranzakciókba vannak csoportosítva. Amikor egy alkalmazás mindkét szerepet betölti, ami gyakran előfordul, vegyes munkát végez: üzeneteket és visszaigazolásokat küld, majd véglegesíti vagy visszavonja a tranzakciót.

Az üzenetek eljuttatása a szervertől a fogyasztóhoz nem tranzakciós jellegű.

Producer

A Producer egy ügyfélalkalmazás, amely üzeneteket tesz közzé cserére .

Az e-mail eszközhöz hasonlóan láthatja, hogy a gyártó nem küld üzeneteket közvetlenül a sorba (üzenetsorba). Minden más viselkedés megtörné az absztrakciót az AMQ modellben. Ez hasonló lenne egy e-mail üzenet életciklusához: az e-mail feloldása, az MTA útválasztási tábláinak megkerülése és közvetlenül a postafiók elérése. Ez lehetetlenné tenné a közbenső szűrés és feldolgozás, például a spamészlelés beiktatását.

Az AMQ modell ugyanazt az elvet használja, mint az e-mail rendszer: az összes üzenetet egyetlen központnak vagy MTA-nak küldik el , amely a feladó elől rejtett szabályok és információk alapján ellenőrzi az üzeneteket, és olyan terjesztési pontokra irányítja őket, amelyek szintén rejtve vannak a küldő elől. feladó. (és a feladó elől is rejtett leadási pontokra irányítja őket - itt a terjesztési pontok a dokumentációból származó leadási pontok).

fogyasztó

A fogyasztó az az ügyfélalkalmazás, amely üzeneteket fogad az üzenetsorból.

E-mail analógiánk kezd tönkremenni, ha a fogyasztót (címzetteket) nézzük . Az e-mail kliensek passzívak – el tudják olvasni a postafiókokat, de nincs hatással a postafiókok feltöltésére. Az AMQP segítségével a fogyasztó passzív is lehet, akárcsak az e-mail kliensek. Vagyis írhatunk olyan alkalmazást, amely egy adott üzenetsorra figyel, és egyszerűen feldolgozza a beérkező információkat. Ebben az esetben az üzenetsornak készen kell állnia az alkalmazás indítása előtt, és hozzá kell „csatolni”.

A fogyasztó a következő tulajdonságokkal is rendelkezik:

Olyan ez, mint egy levelezőrendszer, amely protokoll szinten képes:

Automatikus mód

A legtöbb integrációs architektúrának nincs szüksége ilyen szintű bonyolultságra. A legtöbb AMQP-felhasználónak szüksége van az alapfunkciókra a dobozból. Az AMQP ezt a következő módon biztosítja:

Ennek eredményeként a mögöttes összerendelés lehetővé teszi a gyártó számára, hogy üzeneteket küldjön közvetlenül az üzenetsorba, így emulálja a legegyszerűbb sémát az üzenet vevőnek történő elküldésére, amelyet az emberek egy hagyományos köztes szoftvertől várnának.

Az alapösszerendelés nem akadályozza meg az üzenetsor használatát összetettebb tervekben. Lehetővé teszi az AMQP használatát a kötési és cseremechanizmusok konkrét ismerete nélkül.

AMQP Command Architecture

A szakasz az alkalmazás és a szerver közötti interakció folyamatát írja le

Protokoll parancsok (osztályok és metódusok)

A köztes szoftverek összetettek, és a protokollstruktúra kialakításakor a készítői igyekeztek megszelídíteni ezt a bonyolultságot. Megközelítésük az volt, hogy egy hagyományos API-t modelleztek olyan osztályokon, amelyek metódusokat tartalmaznak, és mindegyik metódus pontosan egy dolgot csinál, és jól csinálja. Ez rengeteg parancsot eredményez, de viszonylag könnyen érthető.

Az AMQP parancsok osztályokba vannak csoportosítva. Minden osztály egy meghatározott funkcionális területet fed le. Egyes osztályok nem kötelezőek – minden társ megvalósítja azokat az osztályokat, amelyeket támogatnia kell.

Két különböző párbeszéd módszer létezik:

A metódusfeldolgozás egyszerűsítése érdekében minden szinkron kéréshez külön választ adunk meg. Vagyis egy módszert nem használnak két különböző kérés megválaszolására. Ez azt jelenti, hogy a partner szinkron kérés küldésekor elfogadhatja és feldolgozhatja a bejövő metódusokat, amíg az egyik érvényes szinkron válasz meg nem érkezik. Ez különbözteti meg az AMQP-t a hagyományosabb RPC protokolloktól.

A metódus formálisan szinkron kérés, szinkron válasz (egy adott kérésre) vagy aszinkron. Végül minden metódus formálisan kliensoldaliként (azaz szerver-kliensként) vagy szerveroldaliként (kliens-szerverként) van meghatározva.

AMQP hozzárendelése a Middleware API-hoz

Az AMQP-t úgy tervezték, hogy összehasonlítható legyen a köztes szoftver API-val. A párosítási folyamat némileg intellektuális, i.e. megérti, hogy nem minden módszer és nem minden érv értelmes az alkalmazáshoz, hanem mechanikus is, pl. bizonyos szabályok felállításával manuális beavatkozás nélkül minden módszer összeilleszthető.

Ennek az az előnye, hogy az AMQP szemantikáját megtanulva a fejlesztők ugyanazt a szemantikát találják meg bármilyen keretrendszerben is.

Példa a Queue.Declare metódusra:

Várólista . kijelent sor = az én . sorban auto - delete = IGAZ kizárólagos = HAMIS

Hálózati keretté alakítható:

+--------+----------+----------+------------+-------- ----+ | Sor | kijelenteni | az én . sor | 1 | 0 | +--------+----------+----------+------------+-------- ----+ osztály metódus neve auto - kizárólagos törlés

Vagy magas szintű API-módszerben

Várólista . Declare ( "my.queue" , ​​TRUE , FALSE );

Aszinkron metódusillesztő logika pszeudokódban:

küldési mód a szervernek

Szinkron metódus illesztő logika pszeudokódban:

kérési mód küldése a szervernek ismétlés várja meg a szerver válaszát ha a válasz aszinkron módszer _ folyamatmódszer ( általában szállított vagy visszaküldött tartalom ) _ _ más állítsa , hogy a metódus érvényes válasz a kérésre kilépés ismétlés vége ha vége - ismételje meg

Érdemes megjegyezni, hogy a legtöbb alkalmazás esetében a köztes szoftver teljesen elrejthető a rendszer technikai rétegeiben, és a ténylegesen használt API kevésbé fontos, mint az, hogy a köztes szoftver robusztus és működőképes legyen.

Hiányzó értesítések

A chatty protokoll lassú. Aktívan használjuk az aszinkront olyan esetekben, amikor teljesítményprobléma van. Általában itt küldünk tartalmat egyik társról a másikra. A módszereket a lehető leggyorsabban szállítjuk, anélkül, hogy megvárnánk a visszaigazolásokat. Ahol szükséges, magasabb szinten, például fogyasztói szinten megvalósítjuk az ablakozást és a szabályozást .

A protokoll mellőzi az értesítéseket, mert érvényesítési modellt valósít meg minden eseményre. Vagy sikerül, vagy kivételt dobnak? amely bezár egy csatornát vagy kapcsolatot.

Az AMQP-ben nincsenek értesítések. A sikeres esemény - csendben, kudarc - kijelenti magát. Ha egy alkalmazásnak a sikerek és a kudarcok kifejezett nyomon követésére van szüksége, akkor tranzakciókat kell használnia.

Csatlakozási osztály

A csatlakozást úgy tervezték, hogy tartós legyen és sok csatornát kezeljen.

Kapcsolat életciklusa
  • A kliens megnyit egy TCP/IP kapcsolatot a kiszolgálóval, és elküldi a protokoll fejlécét. Ez az egyetlen elérhető információ, amelyet az ügyfél küldhet, és amely nincs metódusként formázva.
  • A szerver egy protokollverzióval és egyéb tulajdonságokkal válaszol, beleértve az általa támogatott biztonsági mechanizmusok listáját (a Start metódus)
  • Az ügyfél kiválaszt egy biztonsági mechanizmust (Start-Ok).
  • A szerver SASL modellt használó hitelesítési folyamatot indít el, kihívást (Secure) küld az ügyfélnek.
  • Az ügyfél hitelesítési választ küld (Secure-Ok). Például az „egyszerű” hitelesítési mechanizmus használatával a válasz felhasználónevet és jelszót tartalmaz.
  • A szerver megismétli a kihívást (Secure), vagy folytatja a tárgyalásokat egy paraméterkészlet elküldésével, beleértve a maximális keretméretet (Tune).
  • A kliens elfogadja vagy csökkenti ezeket a paramétereket (Tune-Ok).
  • Az ügyfél formálisan megnyit egy kapcsolatot, és kiválaszt egy virtuális gazdagépet (Open).
  • A szerver megerősíti a virtuális gazdagép kiválasztását (Open-Ok).
  • Most az ügyfél úgy használja a kapcsolatot, ahogy jónak látja.
  • Egy csomópont (kliens vagy kiszolgáló) lezárja a kapcsolatot (Close).
  • A másik csomópont adatokat küld a kapcsolat lezárásáról (Close-Ok).
  • A szerver és a kliens bezárja a kapcsolatnak megfelelő socketeket.

A nem teljesen megnyitott kapcsolatok hibáira vonatkozó információcsere nem történik meg. A hibát észlelő gazdagépnek további értesítés nélkül be kell zárnia a socketet.

Csatorna osztály

Az AMQP egy többcsatornás protokoll. A csatornák lehetővé teszik a nehéz TCP/IP-kapcsolatok több könnyű kapcsolattá történő multiplexelését. Ez "tűzfalbarátabbá" teszi a protokollt, mivel a porthasználat kiszámítható. Ez azt is jelenti, hogy a forgalom alakítása és egyéb hálózati QoS szolgáltatások könnyen használhatók.

A csatornák függetlenek egymástól, és más csatornákkal egyidejűleg különböző funkciókat is elláthatnak, miközben a rendelkezésre álló sávszélesség fel van osztva az egyidejű feladatok között.

Elvárható és bátorított, hogy a többszálú kliens alkalmazások gyakran használják a "csatorna per-szál" modellt a fejlesztés megkönnyítése érdekében. Mindazonáltal, több kapcsolat megnyitása egy vagy több AMQP szerverrel egyetlen kliensről is teljesen elfogadható. Egy csatorna életciklusa a következő:

  • Az ügyfél új csatornát nyit (Megnyitás)
  • A szerver megerősíti a csatorna megnyitását (Open-Ok)
  • A kliens és a szerver úgy használja a csatornát, ahogy jónak látja.
  • Az egyik csomópont (kliens vagy szerver) bezárja a csatornát (Close)
  • A másik csomópont nyugtázza a csatorna bezárását (Bezárás-Ok)

Az Exchange osztály

Lehetővé teszi egy alkalmazás számára a cserepéldányok kezelését a kiszolgálón. Ez az osztály lehetővé teszi az alkalmazás számára, hogy saját üzenetkezelő szkriptet írjon anélkül, hogy bármilyen konfigurációra támaszkodna.

Megjegyzés: A legtöbb alkalmazásnak nincs szüksége ilyen szintű bonyolultságra, és a régi köztes szoftver valószínűleg nem támogatja ezt a szemantikát.

Csere életciklusa
  • A kliens megkéri a szervert, hogy győződjön meg arról, hogy létezik csere (Declare). A kliens ezt a következőképpen adhatja meg: "létrehozza a cserét, ha nem létezik" vagy "figyelmeztessen, de ne hozza létre, ha nem létezik".
  • Az ügyfél üzeneteket tesz közzé cserére
  • Az ügyfél dönthet úgy, hogy törli a tőzsdét (Törlés)

Sorosztály

A sorosztály lehetővé teszi az alkalmazások számára, hogy üzenetsorokat kezeljenek a kiszolgálón. Ez szinte minden üzenetet fogadó alkalmazás alapvető lépése, legalábbis annak ellenőrzésére, hogy a várt üzenetsor valóban létezik-e.


Sor életciklusa

A protokoll két sor-életciklust biztosít:

  • Tartós üzenetsorok – több fogyasztó használja, és függetlenül attól, hogy vannak olyan fogyasztók, akik üzeneteket fogadhatnak
  • Ideiglenes üzenetsorok – privát sorok egy adott fogyasztó számára. A sor törlődik, ha nincs fogyasztó.


Tartós üzenetsor életciklusa
  • Az ügyfél deklarál egy üzenetsort (Deklaráció "passzív" argumentummal)
  • A szerver elismeri a sor létezését (Declare-Ok)
  • A kliens beolvassa az üzeneteket a sorból
Az ideiglenes üzenetsorok életciklusa
  • A kliens létrehoz egy üzenetsort (Deklaráljon gyakran sornév nélkül, így a szerver nevet ad neki). A szerver megerősíti a létrehozást (Declare-Ok)
  • Az ügyfél inicializálja a fogyasztót a létrehozott sorhoz.
  • Az ügyfél vagy kifejezetten, vagy a csatorna és/vagy kapcsolat lezárásával állítja le a fogyasztót
  • Amikor az utolsó fogyasztó eltűnik az üzenetsorból, és egy udvarias időtúllépés után a szerver eltávolítja az üzenetsort

Az AMQP a témakör-előfizetési mechanizmust üzenetsorok formájában valósítja meg. Ez érdekes struktúrákat tesz lehetővé, ahol az előfizetés terheléselosztható az együttműködő előfizetői alkalmazások készletében.

Előfizetés életciklusa
  • A kliens létrehoz egy üzenetsort (Declare), a szerver megerősíti (Declare-Ok)
  • A kliens egyezteti az üzenetsort a csere témával (Bind), és a szerver megerősíti az egyezést (Bind-Ok)
  • A kliens a fent leírtak szerint használja az üzenetsort

Alap osztály

Az alaposztály az ebben a specifikációban leírt üzenetküldési képességeket valósítja meg. A következő szemantikát támogatja:

  • Üzenetek küldése a kliensről a szerverre, amely aszinkron módon történik (közzététel)
  • Fogyasztók elindítása és leállítása (fogyasztás, lemondás)
  • Üzenetek küldése a szerverről a kliensre, amely aszinkron módon történik (kézbesítés, visszaküldés)
  • Üzenet nyugtázása (elfogadás, elutasítás)
  • Üzenetek lekérése a sorból szinkron módon (Get)

Tranzakciós osztály

Az AMQP kétféle tranzakciót támogat:

  1. Automatikus tranzakciók, amelyekben minden közzétett üzenet és visszaigazolás önálló tranzakcióként kerül feldolgozásra.
  2. Helyi szerver tranzakciók, amelyekben a szerver puffereli a közzétett üzeneteket és nyugtákat, és az ügyfél kérésére véglegesíti azokat.

A Tranzakció („tx”) osztály hozzáférést biztosít az alkalmazásoknak a második típusú tranzakciókhoz, a helyi szerver tranzakciókhoz. Az osztály szemantikája a következő:

  1. Az alkalmazás szervertranzakciókat kér minden olyan csatornában, amelyben ilyen tranzakciókat szeretne fogadni (kiválasztás)
  2. Működő alkalmazás (közzététel, jóváhagyás)
  3. Az alkalmazás véglegesítési vagy visszaállítási munkát végez (commit, Roll-back)
  4. Az alkalmazás továbbra is működik

A tranzakciók a tartalom közzétételére és megerősítésére vonatkoznak, nem pedig a kézbesítésre. Ezért a visszaállítás nem állítja újra a sorba, és nem váltja ki az újrakézbesítést. Az ügyfél a következő tranzakció során nyugtázhatja ezeket az üzeneteket.

Közlekedési architektúra AMQP

Ez a rész elmagyarázza, hogyan képezik le a parancsokat a vezetékes szintű protokollhoz.

Leírás

Az AMQP egy bináris protokoll. Az információk különféle típusú keretekbe vannak rendezve. A keretek protokollmódszereket és egyéb információkat tartalmaznak. Minden képkocka ugyanazzal az általános formátummal rendelkezik: keretfejléc, hasznos terhelés és keret vége. A keret hasznos formátuma a keret típusától függ.

Szállítási szinten a TCP / IP verem vagy analógok használata feltételezhető.

Egyetlen socket kapcsolaton belül több független vezérlési folyamat is létezhet, ezeket csatornáknak nevezzük. Minden képkocka egy csatornaszámmal van számozva. A kereteik interleave révén a különböző csatornák megosztják ezt a kapcsolatot. Bármely adott csatorna esetében a keretek szigorú sorrendben futnak le, amely protokollelemző (általában állapotgép) meghajtására használható.

A kereteket kis adattípusok, például bitek, egész számok, karakterláncok és mezőtáblák felhasználásával készítjük. A keretmezők szorosan össze vannak csomagolva anélkül, hogy lassúak vagy nehezen értelmezhetők. Protokollspecifikációk alapján viszonylag egyszerű keretező réteget mechanikusan létrehozni.

A vezetékes szintű formázást úgy tervezték, hogy méretezhető és elég sokoldalú legyen ahhoz, hogy tetszőleges magas szintű protokollokban (nem csak az AMQP-ben) használható legyen. Arra számítunk, hogy az AMQP idővel bővülni fog, javulni fog, és egyéb módon változni fog, és a vezetékes szintű formátum ezt támogatja.

Adattípusok

A keretekben használt AMQP adattípusok:

  • Egész számok (1 és 8 oktett között) a méretek, nagyságok, határértékek stb. Az egész számok mindig előjel nélküliek, és előfordulhat, hogy egy kereten belül rosszul igazodnak.
  • bitek
  • Rövid karakterláncok rövid szövegtulajdonságok tárolására. A rövid karakterláncok 255 oktettre korlátozódnak, és a puffer túlcsordulás veszélye nélkül értelmezhetők. (Gyanítom, hogy 255 államban egy oktettről beszélünk, nem pedig 255 oktettről)
  • Bináris adatok részeinek tárolására használt hosszú karakterláncok
  • Név-érték párokat tartalmazó táblázatmezők. A mezőértékek karakterláncként, egész számként stb.

Protokoll tárgyalás

A kliens és a szerver egyeztet egy protokollról. Ez azt jelenti, hogy amikor egy kliens csatlakozik, a szerver felkínál bizonyos opciókat, amelyeket az ügyfél elfogadhat vagy módosíthat. Ha mindketten egyetértenek az eredményben, a kapcsolat létrejöttnek minősül. A tárgyalás azért hasznos, mert lehetővé teszi a kapcsolati beállítások megadását.

A koordináció több szempontból is megvalósul:

  • A jelenlegi protokoll és verziója. Egy szerver több protokollt is kezelhet egyetlen porton.
  • Titkosítási argumentumok és mindkét oldal hitelesítése. A protokoll funkcionális rétegének része.
  • Maximális keretméret, csatornák száma és egyéb működési korlátozások

A megállapodott korlátok mindkét fél számára lehetővé teszik a kulcspufferek előzetes kiosztását, elkerülve a holtpontot. Minden bejövő képkocka vagy engedelmeskedik a kialkudott határoknak, és ezért biztonságos, vagy túllépi azokat, ebben az esetben a másik oldal meghibásodott, és le kell tiltani. Ez nagyon jól illeszkedik az AMQP filozófiájához, miszerint "vagy úgy működik, ahogy kell, vagy egyáltalán nem működik".

Mindkét csomópont a legalacsonyabb megegyezett értékre egyezteti a határértékeket az alábbiak szerint:

  • A szervernek közölnie KELL az ügyféllel, hogy milyen korlátokat kínál.
  • Az ügyfél válaszol, és LEHET, hogy csökkenti a kapcsolati korlátokat

Keret elhatárolása

TCP/IP verem - streamekkel működik, nincs beépített keretelválasztó mechanizmusa. A meglévő protokollok többféleképpen oldják meg ezt a problémát:

  • Csatlakozásonként egy képkocka küldése. Egyszerű, de lassú
  • Kerethatároló hozzáadása egy adatfolyamhoz. Egyszerű, de lelassítja az elemzést
  • Számolja meg a keret méretét, és küldje el a méretet minden képkocka előtt. Egyszerű és gyors, és ezt a megközelítést az AMQP is megvalósítja.


Lövés részletesen

Minden képkocka egy fejlécből (7 oktett), egy tetszőleges méretű hasznos adatból és egy "keret vége" oktettből áll, amely észleli a hibás képkockákat:

0 1 3 7 méret + 7 méret + 8 +------+----------+-------------+ +-------------+ +--- --------+ | típus | csatorna | méret | | hasznos teher | | keret - vége | +------+----------+-------------+ +-------------+ +--- --------+ oktett rövid hosszú méret oktett oktett

A keret a következőképpen olvasható:

  1. Olvassa el a fejlécet, és ellenőrizze a kerettípust és a csatornát
  2. A keret típusától függően a rendszer kiolvassa az adatokat a hasznos adatból és feldolgozza
  3. Olvasási keret vége.

A teljesítmény szempontjából reális megvalósításokban „előreolvasási pufferelést” vagy „olvasások összegyűjtését” használjuk, hogy elkerüljük a három külön rendszerhívást egy keret olvasásához.

Method Frames

A metóduskeretek magas szintű protokollparancsokat hordoznak (amelyeket "módszereknek" nevezünk). Egy metódus keret egy parancsot hordoz. A metódus keret hasznos terhelése a következő formátumú:

0 2 4 +----------+----------------------------- - - | osztály - azonosító | módszer - id | érvek ... +----------+----------------------------- - - rövid rövid ...

A metódus kerete a következőképpen történik:

1. A payload metódus keretének beolvasása.

2. Kicsomagolása szerkezetbe. Ennek a módszernek mindig ugyanaz a felépítése, így gyorsan kicsomagolható

3. Ellenőrizze, hogy ez a módszer engedélyezett-e az aktuális környezetben.

4. A metódus argumentumainak érvényességének ellenőrzése.

5. Ennek a módszernek a végrehajtása.

A metódus keret törzse AMQP adatmezők (bitek, egész számok, karakterláncok és karakterlánc-táblázatok) listájaként épül fel. A rendezőkód triviálisan generálódik közvetlenül a protokoll specifikációiból, és nagyon gyors lehet.

Tartalomkeretek

A tartalom olyan alkalmazásadatok, amelyeket az AMQP szerveren keresztül kliensről ügyfélre továbbítunk. A tartalom durván szólva tulajdonságok halmaza, plusz az adatok bináris része. Az engedélyezett tulajdonságok halmazát az alaposztály határozza meg, és ezek alkotják a "tartalomfejléc-keretet". Az adatok tetszőleges méretűek lehetnek, és több (vagy sok) blokkra bonthatók, amelyek mindegyike egy "tartalomtest-vázat" alkot.

Ha egy adott csatorna kereteit nézzük, amint azt a vezetéken keresztül továbbítják, valami ilyesmit láthatunk:

[ módszer ] [ módszer ] [ fejléc ] [ törzs ] [ törzs [ módszer ] ...

Egyes módszerek (például Basic.Publish , Basic.Deliver stb.) formálisan tartalomhordozóként vannak meghatározva. Amikor egy társ ilyen metóduskeretet küld, mindig követi azt egy tartalomfejléccel és néhány tartalomtörzs kerettel vagy anélkül. A tartalomkeret fejlécének formátuma a következő:

0 2 4 12 14 +----------+--------+-----------+----------------+ ------------- --- _ | osztály - azonosító | súly | testméret | _ ingatlan zászlók | ingatlan lista ... +----------+--------+-----------+----------------+ ------------- --- _ rövid rövid hosszú hosszú rövid maradék ...

A tartalom törzsét külön keretekbe helyezzük (ahelyett, hogy egy metódusba foglalnánk), hogy az AMQP támogassa a „nulla másolat” metódusokat, ahol a tartalom soha nem kerül sorba vagy kódolásra. A tartalomtulajdonságokat saját keretükbe helyezzük, hogy a címzettek szelektíven elvehessék azokat a tartalmakat, amelyeket nem szeretnének feldolgozni.

Heartbeat Frames

A Heartbeat egy olyan technika, amely a TCP/IP egyik funkcióját hivatott felülbírálni, nevezetesen azt, hogy képes helyreállni egy megszakadt fizikai kapcsolat után, és csak egy meglehetősen hosszú időtúllépés után zár be. Egyes forgatókönyvekben nagyon gyorsan meg kell tudnunk, ha a társ leállt, vagy más okok miatt nem válaszol (például elakad egy hurokban). Mivel a szívverés alacsony szinten is elvégezhető, ezt egy speciális típusú keretként fogjuk megvalósítani, amely a szállítási réteg csomópontjai között cserélődik, nem pedig osztálymetódusként.

Hibakezelés

Az AMQP kivételeket használ a hibakezeléshez. Bármilyen működési hiba (nem található üzenetsor, elégtelen hozzáférési jogosultságok stb.) csatornakivételt vált ki. Bármilyen szerkezeti hiba (rossz argumentum, rossz metódussorozat stb.) kapcsolati kivételt eredményez. A kivétel bezárja a csatornát vagy a kapcsolatot, és válaszkódot és választörzset küld vissza az ügyfélalkalmazásnak. 3 számjegyű válaszkódot, valamint a HTTP-ben és sok más protokollban használt válaszszöveg-sémát használunk.


Csatornák és kapcsolatok bezárása

A kapcsolatról vagy csatornáról azt mondják, hogy "nyitott" a kliens számára, amikor Open üzenetet küld, és a szerver számára, amikor Open-Ok üzenetet küld. Ezentúl egy csatornát vagy kapcsolatot bezárni kívánó partnernek ezt az itt leírt handshake protokoll használatával kell megtennie.

A csatorna vagy kapcsolat bármilyen okból – normál vagy kivételes – bezárását körültekintően kell elvégezni. A hirtelen zárásokat nem mindig észleljük gyorsan, és kivétel után elveszíthetjük a hibakódokat. A helyes elrendezés az, hogy a zárást manuálisan kezdeményezzük, hogy a csatorna/kapcsolat csak akkor záruljon le, ha megbizonyosodtunk arról, hogy a másik fél is tisztában van a helyzettel.

Amikor egy partner úgy dönt, hogy bezár egy csatornát vagy kapcsolatot, elküldi a Close metódust. A fogadó csomópontnak a zárásra egy Close-Ok-val kell válaszolnia, majd mindkét fél lezárhatja a csatornáját vagy a kapcsolatát. Vegye figyelembe, hogy ha a társak figyelmen kívül hagyják a Bezárást, akkor holtpont léphet fel, ha mindkét partner egyszerre küldi el a Bezárást.


AMQP Client Architecture

Lehetséges az AMQP keretek olvasása és írása közvetlenül az alkalmazásból, de ez rossz tervezés lenne. Még a legegyszerűbb AMQP-beszélgetés is sokkal összetettebb, mint például a HTTP, és az alkalmazásfejlesztőknek nem kell érteniük olyan dolgokat, mint például a bináris keretezési formátumok ahhoz, hogy üzenetet küldhessenek az üzenetsorba. Az ajánlott AMQP kliens architektúra több absztrakciós szintből áll:

  1. Keretezési réteg – AMQP protokollmetódusokat vesz át bizonyos nyelvi formátumokban (struktúrák, osztályok stb.), és vezetékszintű keretként sorba rendezi őket. A keretezési réteg mechanikusan generálható AMQP specifikációkból (amelyek protokollmodellező nyelvben vannak definiálva, XML-ben implementálva, és kifejezetten AMQP-hez tervezve).
  2. kapcsolatkezelő réteg – AMQP-kereteket olvas és ír, valamint kezeli az általános kapcsolat- és munkamenet-logikát. Ebben a rétegben beágyazhatjuk a teljes logikát a kapcsolat és a munkamenet megnyitásához, a hibakezeléshez, a tartalom küldéséhez és fogadásához stb. Ennek a rétegnek nagy része automatikusan elkészíthető az AMQP specifikációi alapján. Például a specifikációk határozzák meg, hogy mely metódusok hordoznak tartalmat, így a "metódus küldése, majd opcionálisan tartalom küldése" logika mechanikusan létrehozható.
  3. API-réteg – speciális API-t biztosít az alkalmazásokkal való munkához. Az API-réteg tükrözhet valamilyen meglévő szabványt, vagy magasabb szintű AMQP-metódusokat biztosíthat a korábban leírt leképezés létrehozásával. Az AMQP módszereket úgy tervezték, hogy egyszerűvé és hasznossá tegyék ezt a leképezést. Maga az API-réteg több rétegből is állhat, például egy magasabb szintű API-ból, amely az AMQP Method API-ra épül.

Ezenkívül általában van bizonyos szintű I/O, ami lehet nagyon egyszerű (Szinkron foglalat olvasása és írása) vagy összetett (teljesen aszinkron többszálú I/O). Ez a diagram az általános javasolt architektúrát mutatja:

+------------------------+ | alkalmazás | +-----------+------------+ | +------------------------+ +---| API -réteg |---- Kliens API -réteg -----+ | +-----------+------------+ | | | | | +-----------------------+ +-----------------+ | | | Kapcsolatkezelő + ---- + Framing Layer | | | +-----------+------------+ +-------+ | | | | | +-----------------------+ | +---| Aszinkron I / O réteg |--------------------------+ +-----------+------------+ | ------- - - - - Hálózat - - - - -------

Ebben a dokumentumban, amikor "kliens API"-ról beszélünk, az alkalmazás alatti összes réteget értjük (i/o, keretezés, kapcsolatkezelő és API rétegek. Általában két különálló dologként beszélünk az "kliens API-ról" és az "alkalmazásról". az alkalmazás az ügyfél API-t használja a köztesszoftver-kiszolgálóval való kommunikációhoz.

Funkcionális specifikáció

Szerver funkcionális specifikációja

Üzenetek és tartalom

Az üzenet egy útválasztó és köztes szoftver-sorrendező rendszer atomi feldolgozó egysége. Az üzenetek olyan tartalmat tartalmaznak, amely egy tulajdonságkészletet tartalmazó tartalomfejlécből és egy bináris adatok átlátszatlan blokkját tartalmazó tartalomtörzsből áll.

Egy üzenet számos különböző alkalmazási entitásnak felelhet meg:

  • Alkalmazási réteg üzenet
  • Fájl küldése
  • adatfolyam keret

Az üzenetek állandóak lehetnek. Az állandó üzenetek biztonságosan tárolódnak a lemezen, és garantáltan kézbesítik még nagyobb hálózati leállás, szerverhiba, túlcsordulás stb. esetén is.

Az üzenetek elsőbbséget élvezhetnek. Magas prioritású üzenet kerül elküldésre, mielőtt alacsonyabb prioritású üzenetek várakoznak ugyanabban az üzenetsorban. Ha az üzeneteket el kell dobni a szolgáltatás bizonyos szintjének fenntartása érdekében, a szerver először az alacsony prioritású üzeneteket dobja el.

A szerver NEM SZABAD módosítani az általa fogadott és a fogyasztói alkalmazásoknak továbbított üzenetek tartalmi törzsét. A szerver hozzáadhat információkat a tartalomfejlécekhez, de NEM SZABAD eltávolítani vagy módosítani a meglévő információkat.

Virtuális gazdagépek

A virtuális gazdagép a szerveren belüli adatok egy része, ami egy adminisztrációs kényelem, amely hasznosnak bizonyul majd azok számára, akik az AMQP-t szolgáltatásként kívánják nyújtani egy megosztott infrastruktúrán.

A virtuális gazdagép saját névteret, cseréket, üzenetsorokat és minden kapcsolódó objektumot tartalmaz. Minden kapcsolatot egy virtuális gazdagéphez kell társítani.

Az ügyfél a hitelesítés után a Connection.Open metódusban választja ki a virtuális gazdagépet. Ez azt jelenti, hogy a kiszolgáló hitelesítési sémája közös az adott kiszolgálón lévő összes virtuális csomópontban. A használt engedélyezési séma azonban minden virtuális gazdagép esetében egyedi lehet. Ez hasznos lehet egy megosztott tárhely infrastruktúrához. Azoknak a rendszergazdáknak, akik különböző hitelesítési sémákat igényelnek minden egyes virtuális gazdagéphez, külön kiszolgálókat kell használniuk

A kapcsolaton belüli összes csatorna ugyanazzal a virtuális gazdagéppel működik. Nincs mód arra, hogy ugyanazon a kapcsolaton egy másik virtuális gazdagépre lépjen kapcsolatba, és nincs mód másik virtuális gazdagépre váltani a kapcsolat megszakítása és újrakezdés nélkül.

A protokoll nem kínál semmilyen mechanizmust a virtuális gazdagépek létrehozására vagy konfigurálására – ez a szerveren belül nem meghatározott módon történik, és teljes mértékben megvalósításfüggő.

Cserék

Az Exchange egy üzenet-útválasztó ügynök egy virtuális gazdagépen belül. A cserepéldány (amelyre általában "csereként" hivatkozunk) üzeneteket és útválasztási információkat – elsősorban az útválasztási kulcsot – fogad, és vagy továbbítja az üzeneteket üzenetsoroknak vagy belső szolgáltatásoknak. A központok elnevezése virtuális gazdagépenként történik.

Az alkalmazások szabadon hozhatnak létre, oszthatnak meg és semmisíthetnek meg cserepéldányokat saját hatáskörükön belül.

A cserék lehetnek véglegesek, ideiglenesek vagy automatikusan törölhetők. Az állandó cserék mindaddig léteznek, amíg el nem távolítják őket. Ideiglenes cserék léteznek a szerver leállításáig. Az automatikusan törölt cserék mindaddig léteznek, amíg a továbbiakban nem használják őket.

A szerver a cseretípusok meghatározott készletét biztosítja. Minden cseretípus egy adott leképezést és algoritmust valósít meg, a következő részben meghatározottak szerint. Az AMQP néhány cseretípust ír elő, és néhány további típust ajánl. Ezen túlmenően minden kiszolgáló implementáció saját cseretípusokat adhat hozzá.

Egy központ egyetlen üzenetet párhuzamosan több üzenetsorba irányíthat. Ez több üzenetpéldányt hoz létre, amelyek egymástól függetlenül kerülnek felhasználásra.

A közvetlen cseretípus

A közvetlen csere típusa így működik:

  1. Az üzenetsor a K útválasztó kulccsal van leképezve az Exchange szerverhez.
  2. A kiadó csereüzenetet küld az R útválasztó kulccsal.
  3. Az üzenet az üzenetsorba kerül, ha K = R.

A kiszolgálónak közvetlen cserét KELL megvalósítania, és minden virtuális gazdagépen előre KELL definiálnia legalább két közvetlen cserét: egy amqp.direct nevű és egy nyilvános név nélkülit , amely a nyilvános metódusok kezelésének alapértelmezett cseréjeként szolgál.

Vegye figyelembe, hogy az üzenetsorokkal bármely érvényes útválasztási kulcs értékével kapcsolatba léphet, de leggyakrabban az üzenetsorokkal a saját nevükkel, mint útválasztási kulcs használatával lép kapcsolatba.

Mindenekelőtt az összes üzenetsort automatikusan egy nyilvános név nélküli adatcseréhez KELL kötni, az üzenetsor nevét használva útválasztási kulcsként.

A Fanout Exchange típus

A Fanout Exchange így működik:

  1. Az üzenetsor argumentumok nélkül hozzá van kötve az Exchange szerverhez.
  2. kiadó üzenetet küld cserére.
  3. Az üzenet feltétel nélkül átkerül az üzenetsorba.

A Fanout Exchange tervezése és megvalósítása triviális. Ez a típusú csere és az előre meghatározott amq.fanout név szükséges .

A témacsere típusa

A témacsere a következőképpen működik:

  1. Az üzenetsor az Exchange szerverhez van kötve a P útválasztási mintával.
  2. A kiadó csereüzenetet küld az R útválasztó kulccsal.
  3. Az üzenet elküldésre kerül az üzenetsorba, ha R egyezik P-vel.

A témacseréhez használt útválasztó kulcsnak pontokkal elválasztott szavakból kell állnia. A szó minimális mérete 0 karakter. Minden szó tartalmazhat AZ és az betűket, valamint 0-9 számokat.

Az útválasztási minta ugyanazokat a szabályokat követi, mint az útválasztási kulcs, azzal a kiegészítéssel, hogy a * egy szónak felel meg, a # pedig nulla vagy több szónak felel meg. Így a *.stock.# útválasztási séma megegyezik az usd.stock és eur.stock.db útválasztási kulcsokkal, de nem a stock.nasdaq-val.

A Topic Exchange egyik javasolt sémája az összes ismert útválasztási kulcs készletének megtartása és frissítése, amikor a kiadók új útválasztási kulcsokat használnak. Megadhatja az összes kötést egy adott útválasztási kulcshoz, és így gyorsan megtalálhatja az üzenetek üzenetsorait. Ez a fajta csere nem kötelező.

A kiszolgálónak meg kell valósítania a témacsere típusát, ebben az esetben a kiszolgálónak először deklarálnia kell legalább egy amq.topic nevű témacserét minden virtuális gazdagépen.

A fejléccsere típusa

A fejléccsere típusa így működik:

  1. Az üzenetsor kicserélődik egy argumentumtáblázattal, amely tartalmazza azokat a fejléceket, amelyeknek meg kell felelniük ehhez az összerendeléshez, és opcionálisan az értékeket, amelyeket tartalmazniuk kell. Az útválasztó kulcsot nem használják.
  2. A kiadó üzenetet küld a központnak, ahol a headers tulajdonság egy neveket és értékeket tartalmazó táblázatot tartalmaz.
  3. Az üzenet akkor kerül át a sorba, ha a fejlécek tulajdonság megegyezik azokkal az argumentumokkal, amelyekhez a sor társítva volt.

Az illesztési algoritmust egy speciális kötési argumentum vezérli, amely név-érték párként van átadva az argumentumtáblázatban. Ezt az argumentumot "X-match"-nek nevezik. Két érték közül az egyiket veheti fel, amelyek meghatározzák, hogy a táblázatban lévő többi névérték pár hogyan kerül kezelésre az egyeztetés során:

  • Az „összes” azt jelenti, hogy az összes többi párnak meg kell egyeznie az üzenet fejléctulajdonságával ahhoz, hogy ezt az üzenetet átirányítsák (ÉS)
  • Az "any" azt jelenti, hogy az üzenetet át kell irányítani, ha a fejléctulajdonság bármely mezője egyezik az argumentumtábla (OR) valamelyik mezőjével.

A kötési argumentumok egyik mezője megegyezik az üzenet mezőjével, ha a következő feltétel igaz: vagy a kötési argumentumokban szereplő mezőnek nincs értéke, és az azonos nevű mező szerepel az üzenet fejlécében, vagy ha a mező az összerendelésben argumentum értéke van, és az azonos nevű mező szerepel a fejlécüzenetekben, és ugyanaz a jelentése.

Az „X-match” kivételével minden „x -” karakterrel kezdődő mező a jövőbeni használatra van fenntartva, és figyelmen kívül lesz hagyva

A kiszolgálónak megvalósítania KELL a fejléccsere-típust, és a kiszolgálónak minden virtuális gazdagépen előre KELL deklarálnia legalább egy amq.match nevű fejléccsere-típust.

A rendszercsere típusa

A rendszercsere típusa a következőképpen működik:

  1. A kiadó üzenetet küld cserére az S útválasztó kulccsal.
  2. A rendszercsere elküldi az S rendszerszolgáltatásnak.

Rendszerszolgáltatások az "amq." AMQP számára fenntartva. Minden más név használható. Ez a fajta csere nem kötelező.

Egyéni cseretípusok

Minden egyéni cseretípus nevének "x -" karakterrel kell kezdődnie. A nem "x -" karakterrel kezdődő cseretípusok az AMQP szabvány jövőbeni felhasználására vannak fenntartva.

Üzenetsorok

Az üzenetsor egy elnevezett FIFO, amely alkalmazások üzeneteit tartalmazza. Az alkalmazások saját hatáskörükön belül szabadon hozhatnak létre, oszthatnak meg, használhatnak és semmisíthetnek meg üzenetsorokat.

Vegye figyelembe, hogy ha egy sorból vagy ügyféltranzakciókból több olvasó is van, vagy prioritási mezőket használ, vagy üzenetválasztókat vagy megvalósítás-specifikus kézbesítés-optimalizálást használ, előfordulhat, hogy a sor nem rendelkezik valódi FIFO-jellemzőkkel. A FIFO garantálásának egyetlen módja, ha csak egy fogyasztó csatlakozik a sorhoz. Ezekben az esetekben a sor „gyenge FIFO”-ként írható le.

Az üzenetsorok lehetnek állandóak, ideiglenesek vagy automatikusan törölhetők. Állandó üzenetsorok léteznek, amíg el nem távolítják őket. Ideiglenes üzenetsorok léteznek a kiszolgáló leállításáig. Az automatikus törlési sorok addig tartanak, amíg használaton kívül nem lesznek.

Az üzenetsorok a memóriában, a lemezen vagy a kettő kombinációjában tárolják üzeneteiket. Az üzenetsorok elnevezése a virtuális gazdagép alapján történik.

Az üzenetsorok üzeneteket tartalmaznak, és elküldik azokat egy vagy több fogyasztói ügyfélnek. Egy üzenetsorba küldött üzenet soha nem kerül elküldésre egynél több ügyfélnek, hacsak nem utasították el

Egy üzenetsor egyszerre és egymástól függetlenül különböző típusú tartalmat tartalmazhat. Vagyis ha a fő tartalom és a fájltartalom ugyanabba az üzenetsorba kerül, akkor kérésre egymástól függetlenül kézbesítik a fogyasztó alkalmazásokhoz.

Kötések

A kötés az üzenetsor és az adatcsere közötti kapcsolat. A kötés határozza meg az útválasztási argumentumokat, amelyek megmondják a központnak, hogy a sornak mely üzeneteket kell kapnia. Az alkalmazások szükség szerint kötéseket hoznak létre és semmisítenek meg, hogy az üzenetek áramlását az üzenetsoraikra irányítsák. Az összerendelés élettartama attól függ, hogy mely üzenetsorokhoz vannak meghatározva – ha egy üzenetsor megsemmisül, a kötése is megsemmisül. A Queue.Bind metódus konkrét szemantikája a cseretípustól függ.

Fogyasztók - fogyasztók

A fogyasztó kifejezést az ügyfélalkalmazásra és az entitásra egyaránt használjuk, amely szabályozza, hogy egy adott ügyfélalkalmazás hogyan fogadja az üzeneteket az üzenetsorból. Amikor egy kliens "fogyasztót indít", létrehoz egy fogyasztói entitást a szerveren. Amikor egy kliens "lemond egy fogyasztót", megsemmisíti a fogyasztó entitást a szerveren. A fogyasztók ugyanahhoz az ügyfélcsatornához tartoznak, és arra kényszerítik az üzenetsort, hogy aszinkron módon küldjön üzeneteket az ügyfélnek.

Szolgáltatás minősége

A szolgáltatás minősége határozza meg az üzenetek küldésének sebességét. A szolgáltatás minősége a terjesztett tartalom típusától függ. Általában a QoS az "előzetes letöltés" fogalmát használja annak jelzésére, hogy hány üzenetet vagy hány oktett adatot küldenek el, mielőtt a kliens nyugtázza az üzenetet. A cél az üzenetadatok idő előtti elküldése a késleltetés csökkentése érdekében.

Köszönetnyilvánítás

A nyugtázás egy formális jelzés az ügyfélalkalmazástól az üzenetsor felé, hogy sikeresen feldolgozta az üzenetet. Két érvényesítési modell lehetséges:

  1. Automatikus – amelyben a szerver eltávolítja a tartalmat az üzenetsorból, amint azt az alkalmazáshoz kézbesítették (a Deliver vagy a Get-Ok metódusokkal).
  2. Explicit – amelyben az ügyfélalkalmazásnak el kell küldenie az Ack metódust minden egyes feldolgozott üzenethez vagy üzenetcsoporthoz

Az ügyfélrétegek maguk is különféle módokon hajthatnak végre kifejezett megerősítéseket, például közvetlenül az üzenet fogadása után, vagy amikor egy alkalmazás jelzi, hogy feldolgozta azt. Ezek a különbségek nem érintik az AMQP-t vagy az interoperabilitást.

áramlásszabályozás

Az áramlásvezérlés egy vészhelyzeti eljárás, amelyet a partnertől érkező üzenetek áramlásának leállítására használnak. Ugyanúgy működik a kliens és a szerver között, és a Channel.Flow parancs valósítja meg. A Flow Control az egyetlen mechanizmus, amely megállíthatja a túlproduktív kiadót. A Fogyasztó elegánsabb ablak-előletöltési mechanizmust használhat, ha a Nyugtázást használja (ami általában tranzakciók használatát jelenti).

Elnevezési konvenció

Ezek a konvenciók szabályozzák az AMQP entitások elnevezését. A kiszolgálónak és a kliensnek tiszteletben kell tartania az alábbi szabályokat:

  • Az egyéni cseréknek "x-" előtaggal kell kezdődniük
  • A szabványos cserepéldányoknak az „amq” előtaggal kell kezdődniük.
  • A szabványos rendszerszolgáltatásoknak az "amq" előtaggal kell kezdődniük.
  • A szabványos üzenetsoroknak az „amq” előtaggal kell kezdődniük.

AMQP parancsok specifikációja (osztályok és módszerek)

Jegyzetek

Az AMQP metódusok minimális értékeket határozhatnak meg (például az üzenetsorban lévő fogyasztók számát) kompatibilitási okokból. Ezeket a minimumokat az egyes osztályok leírása határozza meg.

A megfelelő AMQP implementációknak meglehetősen nagyvonalú értékeket kell megvalósítaniuk az ilyen mezőkben, a minimumok csak a legkevésbé alkalmas platformokon használhatók.

A nyelvtan ezt a jelölést használja:

  • 'S:' a szervertől a kliensnek küldött adatot vagy módszert jelöli;
  • A „C:” a klienstől a szerverhez küldött adatot vagy módszert jelöli;
  • +feltétel vagy +(...) kifejezés jelentése "1 vagy több példány";
  • A *feltétel vagy a *(...) kifejezés jelentése "nulla vagy több példány".

A módszereket a következőképpen határozzuk meg:

  • szinkron kérés ("syn request"). A küldő gazdagépnek várnia kell egy adott válaszmódszerre, de ezt aszinkron módon is megvalósíthatja;
  • szinkron válasz ("syn reply for XYZ");
  • aszinkron kérés vagy válasz ("aszinkron")

Műszaki specifikáció

Az IANA által meghatározott portszámok

A szabványos AMQP portszámot az IANA 5672 -ként rendelte hozzá mind a TCP, mind az UDP számára. UDP-port a jövőbeni multicast megvalósításokhoz fenntartva

Vezetékszintű formátum AMQP-hez

Hivatalos Grammar Protocol

Teljes nyelvtant biztosítunk az AMQP-hez (ez referenciaként szolgál, és érdemes lehet követni azokat a részeket, amelyek részletezik a különböző típusú kereteket és azok formátumait):

amqp = protokoll - fejléc * amqp - egység protokoll - fejléc = literál - AMQP protokoll - azonosító protokoll - verzió literál - AMQP = % d65 .77.81.80 ; "AMQP" protokoll - id = % d0 ; 0 -nak kell lennie protokoll verzió = % d0.9.1 ; _ _ 0-9-1 metódus = módszer - keret [ tartalom ] módszer - keret = % d1 keret - tulajdonságok módszer - hasznos terhelés keret - vége keret - tulajdonságok = csatorna hasznos terhelés - mérete csatorna = short - uint ; nem - nulla hasznos teher - méret = hosszú - uint módszer - hasznos teher = osztály - id metódus - id * amqp - mező osztály - azonosító = % x00 .01 - % xFF . FF metódus - id = % x00 .01 - % xFF . FF amqp - mező = BIT / OCTET / short - uint / long - uint / long - long - uint / short - string / long - string / időbélyeg / mező - táblázat rövid - uint = 2 * OCTET hosszú - uint = 4 * OCTET hosszú - hosszú - uint = 8 * OCTET short - string = OCTET * string - char ; hossza + tartalom string - char = % x01 .. % xFF long - string = long - uint * OCTET ; hossza + tartalom időbélyeg = long - long - uint ; 64 bites POSIX _ mező - táblázat = hosszú - uint * mező - érték - pár mező - érték - pár = mező - név mező - érték mező - név = rövid - karakterlánc mező - érték = 't' logikai érték / 'b' rövid - rövid - int / 'B' rövid - rövid - uint / 'U' rövid - int / 'u' rövid - uint / 'I' long - int / 'i' long - uint / 'L' long - long - int / 'l' long - long - uint / 'f' úszó / 'd' duplájára / 'D' decimális - érték / 's' rövid - string / 'S' hosszú - húr / 'A' mező - tömb / "T" időbélyeg / 'F' mező - táblázat / 'V' ; nincs mező logikai = OCTET ; 0 = HAMIS , különben IGAZ short - short - int = OCTET short - short - uint = OCTET rövid - int = 2 * OCTET hosszú - int = 4 * OCTET long - long - int = 8 * OCTET float = 4 * OCTET ; IEEE -754 dupla = 8 * OCTET ; rfc1832 XDR dupla decimális - érték = skála hosszú - uint skála = OCTET ; decimális számjegyek száma _ mező - tömb = long - int * mező - érték ; értékek tömbje _ keret - vége = % xCE tartalom = % d2 tartalom - fejléc * tartalom - törzs tartalom - fejléc = keret - tulajdonságok fejléc - hasznos teher keret - vége fejléc - hasznos teher = tartalom - osztály tartalom - súlytartalom - test - méret tulajdonság - zászlók tulajdonság - lista tartalom - osztály = oktett tartalom - tömeg = % x00 tartalom - test - méret = hosszú - hosszú - uint tulajdonság - zászlók = 15 * BIT % b0 / 15 * BIT % b1 tulajdonság - jelzők tulajdonság - lista = * amqp - mező tartalom - törzs = % d3 keret - tulajdonságok törzs - hasznos teher keret - vége test - hasznos teher = * OCTET szívverés = % d8 % d0 % d0 keret - vége


Az IETF RFC 2234-ben meghatározott kiterjesztett BNF szintaxist használjuk. Összefoglalva:

  • A szabály neve csak maga a név
  • A terminálokat egy vagy több numerikus karakter határozza meg, ezeknek a karaktereknek az alapértelmezését "d" vagy "x"-ként jelölve.
  • Egy szabály egyszerű rendezett értékláncot határozhat meg a szabálynevek sorozatának felsorolásával
  • Alternatív numerikus értékek tartománya kompaktan megadható kötőjel ("-") használatával a tartomány jelzésére
  • A zárójelben lévő elemeket a rendszer egyetlen elemként kezeli, amelynek tartalma szigorúan rendezett.
  • A perjellel ( " / ") elválasztott elemek alternatívák.
  • Az elemet megelőző * operátor ismétlést jelöl. Hosszú forma: "<a>*< b>elem", ahol az <a> és a <b> opcionális decimális értékek, legalább <a> és legfeljebb <b> elem előfordulások.
Protokoll fejléc

A kliensnek új kapcsolatot kell indítania a protokoll fejlécének elküldésével. Ez egy 8 oktettből álló sorozat:

+---+---+---+---+---+---+---+---+ | 'A' | "M" | 'Q' | "P" | 0 | 0 | 9 | 1 | +---+---+---+---+---+---+---+---+ 8 oktett

A protokoll fejléce az "AMQP" nagybetűkből áll, amelyeket a %d0 konstans követ, majd ezt követi:

  1. Az 1.4.2. szakasz szerint használt protokoll fő verziója. (ki. dokumentációs verzió 0-9-1)
  2. Az 1.4.2. pont szerint használt protokoll kisebb változata. (ki. dokumentációs verzió 0-9-1)
  3. Az 1.4.2. szakasznak megfelelően használt protokoll felülvizsgálata. (ki. dokumentációs verzió 0-9-1)

A protokollegyeztetési modell kompatibilis a meglévő protokollokkal, például a HTTP-vel, amelyek állandó szöveges karakterlánccal kezdeményeznek kapcsolatot, valamint a tűzfalakkal, amelyek figyelik a protokoll elejét, hogy eldöntsék, milyen szabályokat alkalmazzanak rá.

A kliens és a szerver a következőképpen egyeztet a protokollról és a verzióról:

  • Az ügyfél új socket-kapcsolatot nyit az AMQP-kiszolgálóhoz, és protokollfejlécet küld.
  • A szerver elfogadja vagy elutasítja a protokoll fejlécét. Ha elutasítja a protokoll fejlécet, akkor érvényes protokollfejlécet ír a socketbe, majd bezárja a socketet.
  • Ellenkező esetben nyitva hagyja a socketet, és megfelelően implementálja a protokollt.

Példa:

A kliens elküldi : A szerver válaszol : AMQP % d0 .0.9.1 Csatlakozás . indítási módszer AMQP % d0 .1.0.0 AMQP % d0 .0.9.1 < Kapcsolat bezárása > HTTP AMQP % d0.0.9.1 < Kapcsolat bezárása > _

A protokoll végrehajtásának elvei:

  • A szerver képes nem AMQP protokollokat, például HTTP-t is elfogadni
  • Ha a szerver nem ismeri fel a socketen lévő adatok első 5 oktettjét, vagy nem támogatja az ügyfél által kért adott protokollverziót, akkor érvényes protokollfejlécet kell írnia a socketbe, majd ki kell öblíteni a socketet (annak érdekében, hogy a kliens alkalmazás fogadja az adatokat), majd zárja le a kapcsolatot a sockettel. A szerver hibakeresési célból diagnosztikai üzenetet nyomtathat.
  • A kliens úgy tudja meghatározni a kiszolgáló protokollverzióját, hogy megpróbál csatlakozni a legmagasabb támogatott verzióhoz, és újracsatlakozni egy alacsonyabb verzióhoz, ha ilyen információt kap vissza a szervertől.
  • Az AMQP több verzióját megvalósító ügyfeleknek és szervereknek a protokoll fejléc mind a nyolc oktettjét használni KELL a protokoll azonosításához.


Alapvető keretformátum

Minden keret egy 7 oktettből álló fejléccel kezdődik, amely egy típusmezőből (oktett), egy csatornamezőből (rövid egész szám) és egy hosszmezőből (hosszú egész szám) áll:

0 1 3 7 méret + 7 méret + 8 +------+----------+---------+ +--------------+ +------- -----+ | típus | csatorna | méret | | hasznos teher | | keret - vége | +------+----------+---------+ +--------------+ +------- -----+ oktett rövid hosszú ' méret ' oktett oktett

Az AMQP a következő kerettípusokat határozza meg:

  • Típus = 1, "METHOD": metódus keret.
  • Típus = 2, "HEADER": tartalomfejléc-keret
  • Típus = 3, "BODY": tartalomtörzs keret.
  • Típus = 4, "HEARTBEAT": szívverés keret.

A csatornaszám 0 minden olyan keret esetében, amely globális a kapcsolathoz, és 1-65535 a meghatározott csatornákra hivatkozó keretekhez.

A méretmező a hasznos teher mérete, a keretvégi oktett nélkül. Míg az AMQP megbízható csatlakoztatott protokollt feltételez, a keret végét használjuk a nem megfelelő kliens- vagy szervermegvalósítások által okozott keretezési hibák észlelésére.

A protokoll végrehajtásának elvei:

  • A keretvégi oktettnek mindig %xCE hexadecimális értékkel kell rendelkeznie.
  • Ha egy partner olyan típusú keretet kap, amely nem tartozik e meghatározott típusok közé, akkor ezt végzetes protokollhibaként kell kezelnie, és anélkül kell lezárnia a kapcsolatot, hogy további adatokat küldene róla.
  • Amikor egy partner beolvas egy keretet, ellenőriznie kell, hogy a keret vége érvényes-e, mielőtt megpróbálná dekódolni a keretet. Ha a keret vége nem érvényes, akkor ezt végzetes protokollhibaként kell kezelnie, és anélkül kell lezárnia a kapcsolatot, hogy további adatokat küldene róla. Információkat kell naplóznia a problémáról, mivel ez hibára utal a kiszolgáló vagy a kliens keretkódjának megvalósításában.
  • Egy partner NEM küldhet a megbeszélt méretnél nagyobb kereteket. A túl nagy keretet fogadó partnernek 501-es (kerethiba) válaszkóddal kapcsolódási kivételt KELL jeleznie.
  • A csatorna számának nullának kell lennie minden szívverés keretnél, valamint a Connection osztályra hivatkozó metódus-, fejléc- és törzskereteknél. Az egyik ilyen kerethez nem nulla csatornaszámot kapó partnernek 503-as (invalid parancs) válaszkóddal KELL jeleznie a kapcsolódási kivételt.
Módszer hasznos terhek

A metódus kerettestek adatmezők invariáns listájából, úgynevezett „argumentumokból” állnak. Minden metódustörzs osztály- és metódusazonosítókkal kezdődik:

0 2 4 +----------+----------------------------- - - | osztály - azonosító | módszer - id | érvek ... +----------+----------------------------- - - rövid rövid ...

A protokoll végrehajtásának elvei:

  • Az osztályazonosító és a metódusazonosító az AMQP osztály- és metódusspecifikációiban meghatározott állandók.
  • Az argumentumok az egyes módszerekre jellemző AMQP-mezők halmaza
  • A %x00.01–%xEF.FF értékosztály-azonosító a szabványos AMQP-osztályok számára van fenntartva.
  • A %xF0.00 és %xFF.FF (%d61440-%d65535) közötti osztályazonosítók használhatók, ha nem szabványos kiterjesztési osztályokhoz vannak implementálva.
AMQP adatmezők

Az AMQP két szintű adatmező-specifikációval rendelkezik: a metódus argumentumokhoz használt natív adatmezők és a mezőtáblákban lévő alkalmazások között átadott adatmezők. A mezőtáblák natív adatmezők felső indexét tartalmazzák.

Egész számok

Az AMQP a következő natív egész típusokat határozza meg:

  • Előjel nélküli oktett (8 bit).
  • Előjel nélküli rövid egész számok (16 bit).
  • Előjel nélküli hosszú egész számok (32 bit).
  • Előjel nélküli hosszú hosszú egész számok (64 bit).

Az egész számok és a karakterláncok hossza mindig előjel nélküli, és hálózati bájt sorrendben tárolódik. Nem azt az esetet próbáljuk optimalizálni, amikor két alacsony-magas rendszer (pl. két Intel processzor) beszél egymással.

A protokoll végrehajtásának elvei:

  • A tervezőknek nem szabad azt feltételezniük, hogy a keretben kódolt egész számok a memória szóhatáraihoz igazodnak.
Bitek

Az AMQP meghatározza a saját bitmező típusát. A bitek egész oktettekre halmozódnak fel. Ha egy keretben két vagy több bit érintkezik, egy vagy több oktettbe csomagolódnak, minden oktett legalacsonyabb bitjével kezdve. Nincs követelmény, hogy egy keretben az összes bitérték egybefüggő legyen, de ez általában a keretméretek minimalizálása érdekében történik.

Strings

Az AMQP karakterláncok változó hosszúságúak, és egy egész szám, amelyet nulla vagy több adatoktett követ. Az AMQP két natív sortípust határoz meg:

  • 8 bites előjel nélküli egész számként tárolt rövid karakterláncok, amelyeket nulla vagy több oktett adat követ. A rövid karakterláncok legfeljebb 255 oktett UTF-8 adatot tartalmazhatnak, de nem tartalmazhatnak bináris null oktetteket.
  • Hosszú karakterláncok 32 bites előjel nélküli egész számként tárolva, amelyet nulla vagy több oktett adat követ. A hosszú karakterláncok bármilyen adatot tartalmazhatnak
Időbélyegek

Az időbélyegek tárolása 64 bites POSIX time_t formátumban történik, egy másodperces pontossággal. A 64 bites használatával elkerüljük a 31 bites és 32 bites time_t értékekhez kapcsolódó jövőbeni tördelési problémákat.

Táblázat margói

A táblázat mezői hosszú karakterláncok, amelyek csomagolt név-érték párokat tartalmaznak. A névérték párok egy rövid karakterláncként vannak kódolva, amely megadja a nevet, és egy oktettként, amely az érték típusát adja meg, majd ezt követi maga az érték. A táblázatok érvényes mezőtípusai az integer, bit, string és timestamp natív típusok kiterjesztései, és a nyelvtanban láthatók. A több oktettet tartalmazó egész mezők mindig hálózati bájt sorrendben kerülnek tárolásra.

A protokoll végrehajtásának elvei:

  • A mezőneveknek "$" vagy "#" betűvel kell kezdődniük, és folytatódhatnak "$" vagy "#" betűkkel, számokkal vagy aláhúzásjelekkel, legfeljebb 128 karakter hosszúságig.
  • A szervernek érvényesíteni KELL a mezőneveket, és amikor érvénytelen mezőnevet kap, 503-as (szintaktikai hiba) válaszkóddal KELL jeleznie egy kapcsolati kivételt.
  • A tizedesértékek nem a lebegőpontos értékek támogatására szolgálnak, hanem a fixpontos üzleti értékek, például a valutaárfolyamok és az összegek támogatására. Ezek oktettként vannak kódolva, amely a helyek számát jelöli, amelyet egy előjeles hosszú egész szám követ. Oktett „tizedesjegyek” – nincs aláírva.
  • Az ismétlődő mezők illegálisak. Egy partner viselkedése egy ismétlődő mezőket tartalmazó táblával kapcsolatban nem definiált.
Tartalom kivágása

Bizonyos meghatározott módszerek (közzététel, kézbesítés stb.) feldolgozzák a tartalmat. Az egyes módszerek specifikációit a "Funkcionális specifikációk" fejezetben találja. A tartalmat feldolgozó módszerek feltétel nélkül ezt teszik.

A tartalom egy vagy több képkockát tartalmazó listából áll, az alábbiak szerint:

  1. Pontosan egy tartalomfejléc-keret, amely tulajdonságokat biztosít a tartalomhoz.
  2. Opcionálisan egy vagy több tartalomtörzs-keret

A tartalom képkockái egy adott csatornán szigorúan egymás után következnek. Vagyis keverhetők más csatornák képkockáival, de nem keverhető két tartalomkeret ugyanarról a csatornáról, és nem „fedhetik át” egymást, valamint az azonos tartalomhoz tartozó tartalomkeretek nem keverhetők össze ugyanazon a csatornán lévő metóduskockákkal. . (eredeti. Egy adott csatornán lévő tartalomkockák szigorúan egymás után következnek. Vagyis keverhetők más csatornák képkockáival, de nem keverhetők vagy fedhetők át két tartalomkeret ugyanabból a csatornából, és egyetlen tartalom tartalomkockái sem keverhetők össze. keverve metódus keretekkel ugyanazon a csatornán.)

Vegye figyelembe, hogy minden nem tartalmi keret kifejezetten a tartalom végét jelzi. Míg a tartalom mérete jól ismert a tartalom fejlécéből (és így a tartalomkockák száma), ez lehetővé teszi a feladó számára, hogy megszakítsa a tartalmat anélkül, hogy be kellene zárnia a csatornát.

A protokoll végrehajtásának elvei:

  • A hiányos vagy rosszul formázott tartalmat fogadó partnernek 505-ös (váratlan keret) válaszkóddal kapcsolódási kivételt kell adnia. Ide tartoznak a hiányzó tartalomfejlécek, a tartalomfejlécekben szereplő helytelen osztályazonosítók, a hiányzó tartalomtörzs-keretek stb.
Tartalom címe

A tartalom hasznos fejlécének formátuma a következő:

0 2 4 12 14 +----------+--------+-----------+----------------+ ------------- --- _ | osztály - azonosító | súly | testméret | _ ingatlan zászlók | ingatlan lista ... +----------+--------+-----------+----------------+ ------------- --- _ rövid rövid hosszú hosszú rövid maradék ...

A protokoll végrehajtásának elvei:

  • Az osztályazonosítónak meg kell egyeznie a metóduskeret osztályazonosítójával. A partnernek érvénytelen osztályazonosítóra kell válaszolnia egy 501-es (kerethiba) válaszkóddal rendelkező kapcsolati kivétel megadásával.
  • A súlymező nincs használatban, és nullának kell lennie.
  • A törzsméret egy 64 bites érték, amely a tartalomtörzs teljes méretét adja meg, amely a tartalomtörzs következő képkockáinak törzsméreteinek összege. A nulla azt jelzi, hogy nincsenek tartalomtörzs keretek.
  • A tulajdonságjelzők olyan bitek tömbje, amelyek jelzik az egyes tulajdonságértékek meglétét vagy hiányát a sorozatban. A bitek a legmagasabbtól a legalacsonyabbig vannak rendezve. 15 pont az első tulajdonsághoz.
  • A tulajdonságjelzők 16-nál több tulajdonságot is megadhatnak. Ha az utolsó bit (0) be van állítva, az azt jelenti, hogy azt egy másik tulajdonságjelző mező követi. Számos ingatlanjelző mező található.
  • A tulajdonságértékek osztályspecifikus AMQP adatmezők.
  • A bittulajdonságokat csak a megfelelő tulajdonságjelző (1 vagy 0) jelzi, és soha nem szerepelnek a tulajdonságlistában.
  • A tartalomkockákban a csatornaszám nem lehet nulla. Egy tartalomkeretben nulla csatornaszámot fogadó partnernek kapcsolódási kivételt KELL jeleznie 504-es (csatornahiba) válaszkóddal.
Tartalom törzse

A tartalomtörzs hasznos terhelése egy "átlátszatlan" bináris blokk, amely egy keretvégi oktettre végződik:

+----------------------+ +------------+ | Átlátszatlan bináris hasznos teher | | keret - vége | +----------------------+ +------------+

A tartalomtörzs tetszőleges számú keretre osztható. A maximális hasznos adattartalom méretét mindkét partner egyezteti a kapcsolat egyeztetése során.

A protokoll végrehajtásának elvei:

  • A partnernek fel kell dolgoznia a több keretre felosztott tartalomtörzset, egyetlen készletként tárolva ezeket a kereteket, és vagy úgy, ahogy vannak, újra kell küldenie, kisebb keretekre bontani, vagy egyetlen blokkban kell összevonnia az alkalmazáshoz való eljuttatáshoz.
szívverés keretek

A szívverés keretei jelzik a címzettnek, hogy a küldő még életben van. A Heartbeat keretek gyakorisága és időzítése a kapcsolat beállítása során egyeztetésre kerül.

A protokoll végrehajtásának elvei:

  • A szívverés keretek csatornaszámának nullának kell lennie. Az érvénytelen Heartbeat keretet fogadó partnernek 501-es (Frame Error) válaszkóddal kapcsolódási kivételt kell dobnia.
  • Ha a peer nem támogatja a Heartbeat funkciót, el KELL dobnia a Heartbeat keretet anélkül, hogy bármilyen hibát vagy meghibásodást jelezne.
  • A kliensnek el kell kezdenie a Heartbeat küldését a Connection.Tune metódus fogadása után, és el kell kezdenie a Heartbeat figyelését a Connection.Open fogadása után. A szervernek el kell kezdenie a Heartbeat küldését és figyelését a Connection.Tune-Ok vétele után
  • A csomópontnak minden erőfeszítést meg kell tennie, hogy bizonyos időközönként szívverést küldjön. A szívverés bármikor elküldhető. Bármely elküldött oktett érvényes Heartbeat-csere, ezért a szívveréseket csak akkor kell elküldeni, ha a szívverés nélküli AMQP-forgalom egynél több szívverés-intervallumra nem kerül elküldésre. Ha a peer nem észlel bejövő forgalmat (azaz fogadott oktetteket) két vagy több szívverés intervallumon keresztül, akkor a Connection.Close/Close-Ok kézfogás hívása nélkül KELL zárnia a kapcsolatot, és naplózni kell a hibát.
  • A szívverésnek addig kell folytatódnia, amíg az aljzat be nem záródik, beleértve a csatlakozás alatt és után is. Bezárás/Bezárás-Ok kézfogás

Csatorna multiplexelés

Az AMQP lehetővé teszi a társaknak, hogy több független vezérlési folyamatot hozzanak létre. Minden csatorna virtuális kapcsolatként működik, amely egy aljzaton osztozik:

keretek keretek keretek keretek +-----------+-----------+------------+------------+ | csatorna | csatorna | csatorna | csatorna | +-----------+-----------+------------+------------+ | aljzat | +-------------------------------------------------- ----+

A protokoll végrehajtásának elvei:

  • Egy AMQP-társ több csatornát is támogathat. A csatornák maximális számát a kapcsolat egyeztetése során határozzák meg, és egy partner ezt a számot legfeljebb 1-ig tárgyalhatja.
  • Minden partnernek tisztességes módon KELL egyensúlyoznia a forgalmat az összes nyitott csatornán. Ez a kiegyenlítés történhet képkockánként vagy a csatornánkénti forgalom mennyisége alapján. Egy partner NEM engedheti meg, hogy egy nagyon elfoglalt csatorna korlátozza egy kevésbé elfoglalt csatorna előrehaladását.

Garantált láthatóság

A szervernek biztosítania kell, hogy a kliens megfigyelései a szerver állapotáról konzisztensek legyenek.

A következő példa bemutatja, mit jelent ebben az összefüggésben az ügyfél megfigyelése:

  • Az 1. és a 2. kliens ugyanahhoz a virtuális gazdagéphez csatlakozik
  • Az 1. kliens várólista deklarál
  • Az 1. ügyfél megkapja a Declare.Ok-t
  • Az 1. ügyfél elmondja a 2. ügyfélnek
  • A 2. kliens passzív deklarációt készít ugyanarról a sorról

A láthatósági garancia biztosítja, hogy a 2. ügyfél látja a sort

A csatorna bezárása

A szerver lezártnak tekinti a csatornát, ha a következők bármelyike ​​megtörténik:

  • A partner bezárja a csatornát vagy a szülő kapcsolatot a Bezárás/Bezárás-Ok kézfogással
  • Vagy a peer dob kivételt a csatornán, vagy a szülő kapcsolat.
  • A csomópont vagy zárja be a szülő kapcsolatot Close/Close-Ok kézfogás nélkül

Amikor a szerver bezár egy csatornát, a csatornán lévő összes nyugtázatlan üzenet megjelölésre kerül újrakézbesítésre. Amikor a szerver bezár egy kapcsolatot, eltávolítja a kapcsolathoz tartozó összes automatikusan törölt entitást.

Tartalom szinkronizálás

Egyes esetekben a szinkron kérés-válasz módszerek befolyásolják a tartalom aszinkron kézbesítését ugyanazon a csatornán, beleértve:

  • Basic.Consume és Basic.Cancel módszerek, amelyek elindítják és leállítják az üzenetek áramlását az üzenetsorból
  • a Basic.Recover metódus, amely az üzenetek újrakézbesítését kéri a csatornához
  • Queue.Bind, Queue.Unbind és Queue.Purge metódusok, amelyek befolyásolják az üzenetsorba irányított üzenetek áramlását

A protokoll végrehajtásának elvei:

  • A kérés-válasz hatása nem lehet látható a csatornán a válaszmódszer előtt, és láthatónak kell lennie utána.

Tartalom rendelési garancia

A metódusok csatornán való áthaladásának sorrendje stabil: a metódusok vétele ugyanabban a sorrendben történik, amelyben elküldik őket. A szállítási rétegben ezt a TCP/IP protokoll biztosítja. Ráadásul a tartalmat stabilan dolgozza fel a szerver. Különösen azok a tartalmak maradnak rendezve, amelyek a szerveren belül ugyanazt az utat követik. Egy adott prioritású, egyetlen útvonalon áthaladó tartalom esetén a tartalomfeldolgozási útvonalat úgy határozzuk meg, hogy egy bejövő csatornából, egy központból, egy sorból és egy kimenő csatornából áll.

A protokoll végrehajtásának elvei:

  • A szervernek meg KELL őriznie az egyetlen tartalomfeldolgozási útvonalon áthaladó tartalom sorrendjét, kivéve, ha az újraeladási mezőt megváltoztatták a Basic.Deliver vagy a Basic.Get-Ok metódusokban, és összhangban a szabályokkal, amelyek meghatározzák, hogy a mező milyen feltételek mellett lehetséges. legyen beállítva.

Hibakezelés

Kivételek

A szabványos "kivételek" programozási modellt használva az AMQP nem jelzi a sikert, csak a kudarcot. Az AMQP a kizárások két szintjét határozza meg:

  1. Csatornakizárások. Bezárják a hibát okozó csatornát. A csatornakivételek általában „puha” hibákból adódnak, amelyek nem érintik az alkalmazás többi részét.
  2. Csatlakozási kivételek . Lezárják a socket-kapcsolatot, és általában "kemény" hibák miatt következnek be, amelyek programozási hibára, rossz konfigurációra vagy más figyelmet igénylő eseményre utalnak.

Formálisan dokumentáljuk az állításokat az egyes osztályok és metódusok definíciójában.

Válaszkód formátuma

Az AMQP válaszkódok követik az IETF RFC 2821 „Válaszkód súlyossága és elmélete” definícióját.

Megvalósítások

Az AMQP protokoll jellemzői

  • Az AMQP karakterláncai megkülönböztetik a kis- és nagybetűket
  • Verziószámítási konvenció – a verziószám két vagy három számjegyből áll: major.minor.revision Ebben az esetben a revízió nem kötelező. A számok értéke 0 és 99 között lehet. A 100-tól nagyobb számok belső használatra vannak fenntartva. Az 1.1-es verzió egyenértékű az 1.1.0-s verzióval

Jegyzetek

  1. A Commodity Enterprise Middleware felé . Letöltve: 2010. június 14. Az eredetiből archiválva : 2010. március 5..

Irodalom

  • Emrah Ayanoglu; Yusuf Aytas; Dotan Nahum. A RabbitMQ elsajátítása. - Packt Publishing, 2016. - 286 p. — ISBN 978-1-78398-153-3 .

Linkek