Viestit palvelupohjaisessa arkkitehtuurissa

(Joan Zapata) (8. joulukuuta 2020)

Palvelukeskeinen arkkitehtuuri (SOA) on osoittautunut sen vahvuudet käytännöllisesti katsoen kaikilla toimialoilla tuottaa skaalautuvia ja kehittyviä järjestelmiä. SOA: lla on monia merkityksiä, mutta sen keskeinen ajatus monimutkaisen sovelluksen jakamisesta pienemmiksi, uudelleenkäytettäviksi ja löyhästi yhdistetyiksi palveluiksi on edennyt pitkälle 1990-luvun lopusta lähtien. Olemme ottaneet konseptin käyttöön ensimmäisestä päivästä lähtien ja kolmen vuoden kuluttua meillä on nyt noin kaksikymmentä verkkotunnuslähtöistä irrotettua palvelua, jotka jäsentävät taustajärjestelmämme. Se antoi meille mahdollisuuden käyttää haluamiamme kieliä – kuten Kotlin , Elixir – ja työkaluja halusimme – kuten Tapahtumahankinta – käsillä olevaan tehtävään.

Mutta useiden palveluiden saaminen tuo mukanaan omat haasteensa, joista ensimmäinen miten saada palvelut kommunikoimaan keskenään ? Siellä on paljon strategioita, ja tämä artikkeli on Memo Bankissa käyttämiemme kokemusten tuotto.

Aloitetaan kahdesta palvelusta ja esimerkistä tästä yksinkertaisesta käyttötapauksesta:

PYSY HTTPS: n kautta

Kuten monet taustajärjestelmäsovellukset, aloitimme REST -puheluilla HTTPS: llä.

Palvelujen välisiä syklisiä riippuvuuksia on vältettävä hinnalla millä hyvänsä, joten sopimukset ei voi suoraan käske asiakkaita aktivoida uusi asiakas heti sopimuksen allekirjoittamisen jälkeen. Sen sijaan asiakkaiden on lähetettävä säännöllisesti pyyntöjä sopimuksiin tietääkseen, milloin tehtävä on valmis.

HTTPS on hieno alku ja ehdottomasti jotain, joka on pidettävä työkalupakissa: se on helppo asentaa, tuettu laajasti ja käytetään myös altistamaan sovellusliittymät käyttöliittymäsovelluksille. Tässä järjestelmässä on kuitenkin yksi iso ongelma, se on synkroninen (vaikkakaan ei välttämättä estä). Se tarkoittaa, että kun sopimukset toimivat, asiakkaat odottavat aktiivisella yhteydellä. Kun sitä käytetään mittakaavassa, se tarkoittaa, että hitain palvelu voi hidastaa koko järjestelmää. Se tarkoittaa myös, että kun sopimukset -palvelu ei ole käytettävissä, myöskään asiakas -palvelu ei ole sitä, jota kutsutaan kaskadivirheeksi.

Kuinka käsittelemme tästä asiasta? Käytimme kahta erilaista mallia: erillinen ja jatkuva viestintä.

Diskreetit viestit

Otetaan ensimmäisen käyttötapa: asiakkaat haluavat sopimuksia lähettääksesi sopimuksen.

Tätä varten voimme ratkaista ongelman käyttämällä erillistä viestintämekanismia: jonot . Voit nähdä jonon korkean käytettävyyden kolmannen osapuolen postilaatikkona. Silloinkin kun pääpalvelu ei ole käytettävissä, postilaatikko hyväksyy viestit. Useat saman palvelun esiintymät voivat kuluttaa saman jonon, jolloin jono toimii kuormituksen tasaajana ja varmistaa, että jokaista viestiä käsitellään ainakin kerran. Kun viesti on käsitelty, postilaatikko voi unohtaa sen.

Käytämme jonoja -komentojen lähettämiseen (esim. ”SendContract”) palvelusta toiseen. Sillä on useita etuja:

  • Soittajapalvelu ei ole riippuvainen saatavuudesta vastaanottava palvelu ja voi jatkaa toimintaansa heti, kun komento on jonossa;
  • Vastaanotin pystyy käsittelemään komennot omassa tahdissaan , ja voimme helposti skaalata vastaanottopalvelua ylös tai alas sen jonojen kuormituksen mukaan;
  • bonuksena epäonnistuminen voidaan helposti eristää ja käsitellä manuaalisesti (toivomme kattavan kuolleiden kirjainjonojen aiheen toisessa artikkelissa).

Jatkuva viestintä

Katsotaan nyt toinen käyttötapaus, kun sopimus on allekirjoitettu, sopimusten on kerrottava siitä asiakkaille tapahtui, jotta se voi aktivoida asiakkaan.

On houkuttelevaa käyttää toista jonoa täällä, mutta kuten aiemmin sanoimme, emme halua syklistä riippuvuutta, joten sopimukset eivät tiedä mitä tahansa asiakkaista . Siksi se ei voi lähettää ActivateCustomer -komentoa, eikä se voi tietää, milloin ja mihin komento lähetetään.

Ratkaisimme tämän ongelman käyttämällä jatkuvaa viestintämekanismia: suoratoistoja .Voit nähdä virran järjestettynä tapahtumasarjana, jota voidaan käyttää reaaliajassa, mutta joka on myös saatavana ajan myötä. Toisin kuin jonot, jotka eivät liity lyhytaikaisiin komentoihin, virrat kertovat jatkuvan tarinan .

Jokainen Memo Bankin palvelu lähettää tapahtumat kuvaavat resurssien elinkaarta. Näiden tapahtumien rakentaminen ja ylläpitäminen on olennainen osa kehitystä riippumatta siitä, tarvitaanko tätä tapahtumaa välittömästi. Se on osa rutiinia, aivan kuten automaattiset testit ja mittarit.

Näistä tapahtumista tulee siten luotettava aikaleimattu loki muuttumaton tosiasiat . Ja koska ne ovat osa lähettävän palvelun API: ta, niitä voi kuluttaa mikä tahansa muu palvelu, sekä reaaliajassa (yksi kerrallaan) että tulevaisuudessa. Näillä tapahtumilla on valtava arvo jäljitettävyydelle ja data-analyysille .

Yhteenvetona:

  • Jonoja käytetään komentojen lähettämiseen tietty palvelu;
  • virtoja käytetään paljastamaan faktoja tietty palvelu.

Kaikki riippuvuuksista

Yllä oleva kaavio saattaa saada sinut miettimään, vaikka katsotkin nuolia, eikö siinä ole syklinen riippuvuus asiakkaiden ja sopimusten?

välillä Ei, se ei. Riippuvuutta ei määritellä datan suunnalla, vaan tietopalveluilla on toistensa suhteen. Täällä asiakkaat tietävät sopimuksista , se kertoo sille mitä tehdä ja kuuntelee tarinaansa. Mutta sopimukset eivät tiedä mitään asiakkaista, sen ei tarvitse tietää, kuka lähettää komennot, eikä kuka kuuntele sen tarinaa.

Molemmat jono ja virta ovat osa sopimukset -sovellusliittymää, ja asiakkaat riippuvat tästä sovellusliittymästä.

nimetään komentojen ja tosiseikkojen käytäntö on erittäin tärkeä tämän ajatuksen välittämiseksi. Käytämme komentoille aina peruslomaketta, kuten ”SendContract”, ja aikaisempaa partikkelimuotoa tosiseikoille, kuten ”ContractSent”.

Huomaa, että se sopii kätevästi ydinpankkijärjestelmän arkkitehtuuriin perustuu CQRS / ES: ään . Tässä terminologiassa komennot ovat samat ja tapahtumat ovat tosiasioita.

Kuinka valita riippuvuuden suunta

Kun otetaan huomioon edellä selitetyt periaatteet, tämä ratkaisu olisi yhtä pätevä:

Mutta jos molemmat ratkaisut ovat kelvollisia, miten valita toinen toisen sijaan? No, se riippuu sinusta.

Kaikki riippuu haluamasi riippuvuuden suunnasta asetettavaksi.

A: asiakkaat riippuu sopimuksista . B: sopimukset riippuu asiakkaista .

Tässä on joitain kysymyksiä, jotka yleensä kysymme itseltämme:

  • Voiko yksi palvelu olla helposti muiden agnostinen?
    Esimerkiksi, kunhan annamme sisällön sopimuksille , sopimukset voivat olla täysin agnostisia siitä, mikä palvelu sitä käyttää. On vaikeampaa kuvitella asiakkaiden olevan agnostisia siitä, että se vaatii sopimuksen. Se kannattaa A: ta.
  • Entä jos yksi palvelu olisi kolmas osapuoli?
    Esimerkiksi Memo Bankilla ei olisi järkevää ulkoistaa asiakkaita , mutta se voisi olla sopimuksilla . Näin ollen tämä on myös A: n eduksi.
  • Ohjaako yksi palvelu muita palveluja?
    Implisiittinen orkestrointi on huono, löydät siitä lisätietoja tässä keskustelussa , jonka on kirjoittanut Bernd Ruecker. Asiakkaan luominen on monimutkainen työnkulku , johon liittyy monia palveluita (sähköpostiviestien, ilmoitusten lähettäminen, pankkitilin luominen jne.), Joten asiakkaat ovat todennäköisesti orkesteri.Orkesterin asettaminen riippuvaiseksi muista palveluista – eikä päinvastoin – tekee koodista helpommin ymmärrettävän, koska koko työnkulku löytyy yhdestä paikasta. Se tukee myös A: ta.
  • Luo se syklin kokonaisarkkitehtuurissa?
    Vaikka palvelujen välillä ei olisikaan yhteyttä, ne molemmat riippuvat muista palveluista. Oletetaan, että asiakkaat riippuvat käyttäjistä ja käyttäjät riippuvat jo sopimuksista . Jos valitsisimme ratkaisun B, se loisi syklin kolmella palvelulla. Tämä tukee myös A: ta.

Johtopäätös

Viestintä on yksi ensimmäisistä kysymyksistä, joihin meidän on vastattava luotaessa palvelukeskeistä arkkitehtuuria. HTTPS: n ja REST: n käyttö näyttää aluksi suorimmalta ratkaisulta, mutta sillä on rajoituksia. Arsenaali valmistui -jonoilla ja -virroilla , ja asetimme pääasiassa kaksi ohjetta.

Ensinnäkin jokaisen palvelun tulisi striimata tapahtumat kun tosiasiat tapahtuvat tässä palvelussa, vaikka emme vielä tarvitsekaan näitä tapahtumia. Näiden tapahtumien tulisi kertoa tarina siitä, mitä palvelussa tapahtuu, kuten ”ContractSent”, ”ContractSigned”. Tämä sopii erinomaisesti jäljitettävyyteen – jota vaaditaan pankkina -, mutta myös jokaisen palvelun sovellusliittymän vahvistamiseksi ja järjestelmän helpottamiseksi kaikkien tiimien kanssa.

Toiseksi, kyse on riippuvuudet . Riippuvuudet muokkaavat järjestelmää, ja sykliset riippuvuudet ovat vihollisia numero yksi. Kun riippuvuudet on asetettu oikein, viestityökalut ovat juuri täällä, jotta data kulkee mihin tahansa suuntaan.

Alun perin julkaistu osoitteessa https://memo.bank/en/magazine .

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *