Üzenetküldés szolgáltatás-orientált architektúrában

(Joan Zapata) (2020. december 8.)

Szolgáltatás-orientált architektúra (SOA) bebizonyosodott erősségei gyakorlatilag minden iparágban skálázható és evolúciós rendszerek előállításához. A SOA-nak sok jelentése van, de az alapötlete, hogy egy komplex alkalmazást kisebb, újrafelhasználható és lazán összekapcsolt szolgáltatásokra bontson, hosszú utat tett meg az 1990-es évek vége óta. Elfogadtuk a koncepciót az első naptól kezdve, és három év után most mintegy húsz, domain-alapú, függetlenített szolgáltatással rendelkezünk, amelyek strukturálják háttérprogramjainkat. Lehetővé tette számunkra a kedvelt nyelvek – például Kotlin , Elixir – és az eszközök használatát szerettük volna – például Események beszerzése – a feladathoz.

De ha több szolgáltatás van, azzal saját kihívásokkal jár, az első hogyan lehet a szolgáltatásokat kommunikálni egymással ? Nagyon sok stratégia létezik, és ez a cikk a Memo Banknál használt tapasztalatok megtérülése.

Kezdjük két szolgáltatással és példaként ezt az egyszerű használati esetet:

Pihenjen HTTPS-en keresztül

Mint sok háttéralkalmazás, a REST hívásokkal indítottunk HTTPS. id = “5cf388fc6e”>

A szolgáltatások közötti ciklikus függőségeket mindenáron el kell kerülni, ezért szerződések nem mondhatja el közvetlenül az ügyfelek nek, hogy aktiválják az új ügyfelet, amint a szerződés aláírásra kerül. Ehelyett az ügyfeleknek rendszeresen kéréseket kell küldenie a szerződések hez, hogy megtudják, mikor fejeződött be a feladat.

A HTTPS nagyszerű kezdet, és mindenképpen meg kell tartani az eszköztárban: egyszerűen beállítható, széles körben támogatott és az API-k kiszolgáltatására is használták a frontend alkalmazásokat. De ezzel a sémával egy nagy probléma van, ez szinkron (bár nem feltétlenül blokkol). Ez azt jelenti, hogy amíg a szerződések működnek, az ügyfelek aktív kapcsolattal várnak. Méretarányosan használva ez azt jelenti, hogy a leglassabb szolgáltatás lelassíthatja az egész rendszert. Ez azt is jelenti, hogy amikor a szerződések szolgáltatás nem érhető el, az ügyfelek szolgáltatás sem az, amelyet kaszkádos hibának nevezünk.

Hogyan kezeltük ez a probléma? Két különböző mintát használtunk: diszkrét és folyamatos üzenetküldés.

Diszkrét üzenetküldés

Vegyük az első felhasználási esetet: ügyfelek szerződéseket szerződés elküldéséhez.

Ehhez diszkrét üzenetkezelési mechanizmus segítségével oldhatjuk meg a problémát: sorok . A várólistát magas rendelkezésre állású külső postaládaként láthatja. A postafiók akkor is elfogadja az üzeneteket, ha a fő szolgáltatás nem érhető el. Ugyanannak a szolgáltatásnak több példánya ugyanazt a várakozási sort fogyaszthatja, ebben az esetben a sor terheléselosztóként működik, és biztosítja, hogy minden üzenetet legalább egyszer kezeljenek. Miután kezelt egy üzenetet, a postafiók megfeledkezhet róla.

Sorokat használunk a parancsok elküldéséhez (pl. „SendContract”) egyik szolgálatról a másikra. Számos előnye van:

  • A hívó szolgáltatás nem támaszkodik a elérhetőségére. a fogadó szolgáltatás, és folytathatja munkáját, amint a parancs sorban van;
  • A vevő a parancsokat a saját ütemében tudja kezelni , és a vevőkészülék szolgáltatását könnyedén felfelé vagy lefelé méretezhetjük a sorok terhelésétől függően;
  • bónuszként: hiba könnyen izolálható és manuálisan kezelhető (reméljük, hogy a halott betűsorok témáját egy másik cikkben tárgyaljuk).

Folyamatos üzenetküldés

Most nézzük meg a második felhasználási esetet, amikor a szerződést aláírják, a szerződéseknek tudatniuk kell az ügyfelekkel történt, így aktiválhatja az ügyfelet.

Kísértő, hogy itt újabb sort használunk, de mint korábban mondtuk, nem akarunk ciklikus függőséget, ezért a szerződések nem tudják bármi ügyfelekről . Így nem küldhet „ActivateCustomer” parancsot, és nem tudja, hogy mikor és hova küldje el a parancsot.

Ezt a problémát egy folyamatos üzenetkezelési mechanizmus segítségével oldottuk meg: folyamok .A folyamot rendezett eseménysorozatként tekintheti meg, amely valós időben felhasználható, de idővel elérhetővé is válik. Ellentétben a sorokkal, amelyek nem kapcsolódnak efemer parancsokhoz, a folyamok egy állandó történetet mondanak el .

A Memo Bank minden szolgáltatása sugároz egy események leírják az erőforrások életciklusát. Ezen események felépítése és fenntartása minden fejlesztés szerves része , függetlenül attól, hogy erre az eseményre azonnal szükség van-e. Ez a rutin része, csakúgy, mint az automatizált tesztek és mutatók.

Ezek az események így időbélyegzett naplójává válnak. / div> megváltoztathatatlan tények . És mivel a kibocsátó szolgáltatás API-jának részei, bármely más szolgáltatás felhasználhatja őket, valós időben (egyenként) és a jövőben is. Ezeknek az eseményeknek óriási értéke van az nyomon követhetőség szempontjából és adatelemzés .

Összefoglalva:

  • A várólisták parancsok küldésére szolgálnak egy adott szolgáltatás;
  • az adatfolyamokat arra használják, hogy tényeket tárjanak fel egy adott szolgáltatás.

Minden a függőségekről

A fenti ábra elgondolkodtathatja Önt, ha a nyilakat nézzük, nem vezet-e be egy ciklikus függőség ügyfelek és szerződések?

Nem. A függőséget nem az adatok iránya határozza meg, hanem a tudásszolgáltatások egymással. Itt az ügyfelek tudnak a szerződésekről , megmondja neki, mit kell tennie, és meghallgatja a történetét. De a szerződések nem tudnak semmit az ügyfelekről , nem kell tudnia, ki küldi a parancsokat, és ki sem hallgatja a történetét.

Mindkettő a várólista és az adatfolyam a szerződések API része, és az ügyfelek ettől az API-tól függenek.

elnevezése parancsok és tények megegyezése nagyon fontos ennek az elképzelésnek az átadásához. Mindig használunk egy alapformát a parancsokhoz, például a „SendContract”, és egy múltbeli tagláncot a tényekhez, például a „ContractSent”.

Ne feledje, hogy kényelmesen illeszkedik az alapbank rendszerünk architektúrájához a CQRS / ES alapján . Ebben a terminológiában a parancsok azonosak, az események pedig tények.

Hogyan válasszuk ki a függőség irányát

Figyelembe véve a korábban ismertetett elveket, ez a megoldás ugyanolyan érvényes lenne:

De ha mindkét megoldás érvényes, hogyan válasszunk egyet a másik helyett? Nos, rajtad múlik.

Minden a függvénye a kívánt függőség irányába. beállítani.

A: ügyfelek a szerződésektől függ . B: szerződések ügyfelektől függ .

Íme néhány kérdés, amelyeket általában felteszünk magunknak:

  • Egy szolgáltatás könnyen agnosztikus lehet másokkal szemben?
    Itt például, amíg a tartalmat átadjuk a szerződések nek, A szerződések teljesen agnosztikusak lehetnek arról, hogy melyik szolgáltatás használja. Nehezebb elképzelni, hogy az ügyfelek agnosztikusak legyenek azzal kapcsolatban, hogy szerződésre van szükség. Ez A. javára szól.
  • Mi lenne, ha az egyik szolgáltatás harmadik fél lenne?
    Például a Memo Banknak nem lenne értelme kiszervezni az ügyfeleket , de a szerződéseknél igen. Így ez az A javát is szolgálja.
  • Szervezi-e egy szolgáltatás más szolgáltatásokat?
    Az implicit hangszerelés rossz, erről többet megtudhat Bernd Ruecker ebben a beszélgetésében . Az ügyfél létrehozása egy összetett munkafolyamat , amely számos szolgáltatást magában foglal (e-mailek, értesítések küldése, bankszámla létrehozása stb.), Így az ügyfelek valószínűleg itt hangszerelők.Ha a hangszerelőt más szolgáltatásoktól függik – és nem fordítva -, akkor sokkal könnyebben érthetővé válik a kód, mivel a teljes munkafolyamat egyetlen helyen található. Ez szintén A. javára szól.
  • Létrehoz egy ciklust a teljes architektúrában?
    Még ha nincs is kapcsolat a két szolgáltatás között, mindkettő más szolgáltatástól függ. Tegyük fel, hogy az ügyfelek a felhasználók tól, a felhasználók pedig már a szerződésektől függ. Ha a B megoldást választanánk, az a három szolgáltatással létrehozna egy ciklust. Ez az A. javát is szolgálja.

Következtetés

Az üzenetküldés az egyik első kérdés, amelyre választ kell adnunk a szolgáltatásorientált architektúra létrehozásakor. A HTTPS és a REST használata elsőre a legegyenesebb megoldásnak tűnik, de vannak korlátai. Arzenálunkat sorokkal és folyamokkal , és főként két irányelvet határozunk meg.

Először minden szolgáltatásnak át kell adnia események amikor tények történnek ezen a szolgáltatáson belül, még akkor is, ha még nincs szükségünk ezekre az eseményekre. Ezeknek az eseményeknek egy történetet kell elmesélniük arról, hogy mi történik a szolgáltatásban, például „ContractSent”, „ContractSigned”. Ez nagyszerű a nyomon követhetőség szempontjából – amire bankként van szükség -, de az egyes szolgáltatások API-jának konszolidálásához és a rendszer minden csapat számára történő könnyebbé tételéhez is.

Másodszor, a függőségek . A függőségek alakítják a rendszert, és ciklikus függőségek az első számú ellenségek. Miután a függőségeket megfelelően beállítottuk, az üzenetküldő eszközök csak itt vannak, hogy az adatok bármilyen irányba áramolhassanak.

Eredetileg a https://memo.bank/en/magazine .

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük