Irrottautuminen monoliitista

div id = ”184e66f46f”>

A monoliittia hallitsevat koodiapinat

Coniossa kaikki alkoi siitä, mitä yleisesti kutsutaan ”monoliittiksi”. Toisin sanoen yksi kooditieto, joka sisältää kaiken koko sovelluksesta: sen käyttöliittymäkomponentit, taustakomponentit, API-palvelut, taustatehtävät; helvetti, jopa huutaa komentosarjoja. Ja se toimi hyvin alussa. Vain pari ohjelmistosuunnittelijaa, jotka työskentelevät koodikannan erillisillä alueilla (niin vähän mahdollisuuksia koodimuutosristiriitoihin), on helppo ottaa käyttöön. Keskity täysin sovellustoimintojen kirjoittamiseen huolimatta paljon muusta. Kuinka lähestyimme käyttöönottoa? Kun vain harvat beeta-asiakkaat ovat tietoisia ikääntyvästä etenemisestä, ei ollut todellinen ongelma sulkea palveluja hetkeksi, ottaa käyttöön koko kooditietokanta (riippumatta siitä, kuinka pienet tai suuret yleiset muutokset olivat ja sisälsivätkö ne tietokantojen siirrot), ja tuoda sitten palvelut uudelleen esiin.

Oli ehdottomasti tyydyttävää nähdä tuotteen muotoutuvan alusta alkaen ja saada arvostusta loppuasiakkailta. Tiesimme kuitenkin hyvin, että tämä lähestymistapa ei sovi nykyaikaiselle Fintech-yritykselle.

Mitä sitten?

Useimmissa sovelluksissa asiakkaat ovat melko suvaitsevaisia. Kyllä, Whatsapp saattaa lopettaa toimintansa ja sillä voi olla seisokkeja muutaman tunnin ajan: ehdottomasti haittaa, mutta ei havaittavaa ongelmaa. Sama koskee Pokemon Goia tai suosikkipelisovellustasi. ei kuitenkaan ole kyse rahasta : mieliala muuttuu, jos et voi kirjautua pankkitilillesi tai et pysty tehdä kauppaa. Tämä on vielä pahempaa kryptovaluuttaohjelmien tapauksessa: useimmat ihmiset muistavat menneisyyden surulliset virheet, ja aina, kun he eivät pysty käyttämään kryptovaluuttavarojaan edes lyhyeksi ajaksi, syntyy spekulaatioita. Se on reilua. Se on rahasi, ja sinulla pitäisi olla vain vähän tai ei lainkaan ongelmia, kun haluat käyttää sitä.

Yllä oleva Monolith ei sovi tällaiseen skenaarioon: tuotannon koodipohjan muutokset vaativat täydellisen käyttöönoton, siihen liittyvillä seisokkeilla. Pyrimme päivittäin parantamaan palveluitamme korjaamalla virheitä, tekemällä käyttöliittymämme entistä ystävällisemmäksi, poistamalla vanhat toiminnot ja lisäämällä uusia, joilla on parempi käyttö. Julkaisemme nämä päivitykset usein päivittäin, jotta asiakkaamme voivat hyötyä välittömästi, ja pyrimme olemaan vaikuttamatta asiakkaan kokemuksiin. Toisin sanoen minkä tahansa kaavan, jonka keksimme kulissien takana, on oltava näkymättömiä ulkomaailmalle (ainakin useimmiten). Joten muutimme pois monoliitista ja valitsimme sen, mitä yleensä kutsutaan ”mikroservice-arkkitehtuuriksi”.

Evoluutio mikropalvelujen kautta

Massiivinen tiukasti liimattu yksittäinen koodikanta hajotetaan nyt pienemmiksi osiksi, joista kukin edustaa tiettyä palvelua. Aina kun palvelut suoritetaan, palvelut kommunikoivat keskenään synkronisesti tavallisen HTTP-protokollan kautta ja asynkronisesti jonojen kautta (hoitaa esimerkiksi RabbitMQ ja Apache Kafka).

Vuorovaikutukset mikropalvelujen arkkitehtuurissa

On melko haastavaa aloittaa monoliitin hajottaminen pienempiin komponentteihin, mutta sen arvoinen vaivaa. Armeijan kannalta se on hyvin samanlainen kuin mitä Julius Caesar teki hallitakseen tasaisesti Gallian suurta aluetta: ” jaa ja valloita ”.

1) Tuotetta voidaan käyttää jatkuvasti. Koodipäivitys koskee nyt vain mikropalvelua: useimmissa tapauksissa se voidaan ottaa välittömästi käyttöön tuotantoon ja vapauttaa ilman vaikutusta asiakkaaseen.

2) Koodia on helpompi hallita. Yritysorganisaation näkökulmasta asiat muuttuvat, kun 2 ohjelmistosuunnittelijan tiimistä tulee 10 ohjelmistosuunnittelijan tiimi. Se on tehokkaampaa ja vähemmän koodiristiriitoja, kun jokainen tiimin jäsen on vastuussa omasta mikropalvelustaan.

3) Koodia on helpompi ylläpitää. Mikroservice-arkkitehtuuri vaatii luonnostaan ​​käyttöliittymän määrittelyä kommunikoimaan ulkoisen maailman kanssa (olkoon se sitten käyttöliittymäsovellus tai jokin muu taustapalvelu), ja se on täysin eristetty muista näkökulmista. Tämä antaa mahdollisuuden tarkistaa, suunnitella uudelleen tai jopa kirjoittaa kokonaan uudestaan ​​alusta alkaen (jopa eri kielillä, jos se on kätevää) sovelluksen yksittäisiä komponentteja vaikuttamatta muihin.

4) Suorituskykyä voidaan parantaa. Jokainen mikropalvelu voi nyt käyttää sopivinta kieltään. Raskaat salauslaskentakomponentit voidaan esimerkiksi optimoida C: ssä, kun taas API-palvelut Pythonissa ja pitkäkestoiset tehtävät Go: ssa.

5) Parannettu koodien eristäminen ja suojaus. Jokainen mikropalvelu voidaan suorittaa omassa Docker-säilöessään, mikä tarjoaa etuoikeuden eristämisen, verkko- ja dataerotuksen ja valtavan skaalautumispotentiaalin kasvun kannalta ensiarvoisen tärkeän.

Ovatko mikroservit vastauksen?

Ilmaista lounasta ei tietenkään ole. Mikroservice-arkkitehtuurilla on myös omat kovat haasteensa:

1) Operatiivinen monimutkaisuus. DevOps-insinöörejä tarvitaan ehdottomasti uuden käyttöönottoprosessin monimutkaisuuden tasoittamiseksi.

2) Laitteisto paisuu. Mikropalveluja ajetaan usein Docker-säiliöissä; heti kun mikropalvelujen määrä kasvaa, on entistä haastavampaa suorittaa koko sovellus samalla laitteistolla kuin aikaisemmin.

3) Viestinnän väliset kustannukset: jokaisen pyynnön on ehkä oltava vuorovaikutuksessa yhden tai useamman eri käyttäjän kanssa. mikropalvelut verkon kautta. Tämä voi lisätä viivästystä ja siihen voi liittyä väliaikaisia ​​vikoja. Joustavien palvelujen toteuttamiseksi ja koko järjestelmän skaalautuvuuden parantamiseksi on välttämätöntä siirtää vuorovaikutukset asynkroniseen viestintään (esim. Apache Kafkan ja / tai RabbitMQ: n avulla)

4) Lopullinen johdonmukaisuus. Tämä on luultavasti mikroservice-arkkitehtuurin vaikein haaste. Yhden mikropalvelun avulla on mahdollista luoda RDBMS-tapahtumia sen rajojen sisäpuolelle. . Valitettavasti yleinen ongelma hajautetuissa arkkitehtuureissa on kuitenkin käsitellä useita tapahtumia, jotka eivät ole samoissa rajoissa. Tämän seurauksena järjestelmä voi päätyä laittomaan ja palautumattomaan tilaan. Tällaisten ongelmien lieventämiseksi Conio käyttää erilaisia ​​strategioita:

  1. Seuraamalla verkkotunnuksen ohjaaman suunnittelun käytäntöjä, hajota ylemmän tason toimialueet aliverkkotunnuksiksi ja rajoita ne yksitellen rajattuihin konteksteihin ; kukin rajattu konteksti toteutetaan mikropalveluna, jossa sovelletaan tapahtumarajoja. Tämä ratkaisee mahdollisuuden olla epäjohdonmukaisia ​​tietyille aliverkkotunnuksille.
  2. Toteuta idempotentteja asynkronisia vuorovaikutuksia, jotka ennemmin tai myöhemmin ratkaisevat epäjohdonmukaisuudet.
  3. Vältä aina, kun mahdollista, toimia, joihin saattaa liittyä useita aliverkkotunnuksia.

5) Monimutkainen raportointi. Koska kukin aliverkkotunnus asuu tietyssä rajatussa kontekstissa, monimutkaiset raportit, joihin liittyy useita aliverkkotunnuksia, saattavat vaatia tietojen kyselemistä useista tietolähteistä: tällä voi olla negatiivinen vaikutus sekä verkkotunnusten ilmaisukykyyn että järjestelmän skaalautuvuuteen. Tässä Conio -sovelluksessa olemme ottaneet käyttöön CQRS-arkkitehtuurin tukemaan backoffice-toiminnan ja liiketoiminnan analyysiraportteja.

6 ) Kirjausjärjestelmä. Jokainen hajautetun järjestelmän elementti edistää koko järjestelmän lokin luomista. On kuitenkin tarpeen toteuttaa työkaluja, jotka voivat luoda tarvittavat yhteydet kaikkien tällaisten erillisten lokien välille, jotta jokaiselle vuorovaikutukselle on yhtenäinen loki. Tässä Coniossa käytämme ELK (ElasticSearch, Logstash, Kibana) -pinoa lokitietojen tallentamiseen ja kyselyyn: jokainen loki on rikastettu tarvittavilla korrelaatiotunnuksilla, jotka sallivat yllä mainitun yhtenäisen lokin.

Älä koskaan pysäytä evoluutiota

Meidän mielestämme? Alkuperäisen yksittäisen koodikannan hajottamista on pidettävä pitkäaikaisena tehtävänä , jatkuvasti hienosäätöin. Coniolla kesti pari vuotta, jolloin siirrymme askel askeleelta yhdestä massiivisesta koodipohjalta yli 100 -mikroservioon. Olemme päässeet pisteeseen, jossa tunnemme olevamme ylpeitä tuloksista, mutta samalla jatkamme tutkimista. Uusia optimointeja on useita: siirrytäänkö Docker Swarmista Kubernetesiin? Siirretäänkö backend-for-frontend-palvelut palvelimettomiin lambda-toimintoihin? Vaihdetaanko koko jatkuvaan käyttöönottoon? Mahdollisuudet ovat rajattomat.

Olemme täällä koskettaneet useita aiheita ja tekniikoita. Seuraavissa artikkeleissa jaamme lisätietoja havainnoistamme ja edistymisestä. Jos haluat, voit kommentoida ja kertoa meille kokemuksestasi.

Vastaa

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