It-tranżizzjoni minn monolith għal mikroservizzi: storja u prattika

F'dan l-artikolu, ser nitkellem dwar kif il-proġett li qed naħdem fuqu ttrasforma minn monolith kbir għal sett ta 'mikroservizzi.

Il-proġett beda l-istorja tiegħu pjuttost żmien twil ilu, fil-bidu tas-sena 2000. L-ewwel verżjonijiet inkitbu bil-Visual Basic 6. Maż-żmien, deher ċar li l-iżvilupp f'din il-lingwa se jkun diffiċli biex jiġi appoġġat fil-futur, peress li l-IDE u l-lingwa nnifisha huma żviluppati ħażin. Fl-aħħar tas-snin 2000, ġie deċiż li jaqilbu għall-C# aktar promettenti. Il-verżjoni l-ġdida nkitbet b'mod parallel mar-reviżjoni tal-qadima, bil-mod il-mod aktar u aktar kodiċi nkiteb f'.NET. Backend f'C# inizjalment kien iffukat fuq arkitettura tas-servizz, iżda matul l-iżvilupp, intużaw libreriji komuni b'loġika, u s-servizzi tnedew fi proċess wieħed. Ir-riżultat kien applikazzjoni li nsejħulha "monolitu tas-servizz."

Wieħed mill-ftit vantaġġi ta 'din il-kombinazzjoni kien il-kapaċità tas-servizzi li jċemplu lil xulxin permezz ta' API esterna. Kien hemm prerekwiżiti ċari għat-tranżizzjoni għal servizz aktar korrett, u fil-futur, arkitettura tal-mikroservizz.

Bdejna x-xogħol tagħna fuq id-dekompożizzjoni madwar l-2015. Għadna ma lħaqniex stat ideali – għad hemm partijiet minn proġett kbir li ma tantx jistgħu jissejħu monoliths, iżda lanqas ma jidhru qishom mikroservizzi. Madankollu, il-progress huwa sinifikanti.
Se nitkellem dwarha fl-artiklu.

It-tranżizzjoni minn monolith għal mikroservizzi: storja u prattika

Kontenut

Arkitettura u problemi tas-soluzzjoni eżistenti


Inizjalment, l-arkitettura dehret hekk: l-UI hija applikazzjoni separata, il-parti monolitika hija miktuba f'Visual Basic 6, l-applikazzjoni .NET hija sett ta 'servizzi relatati li jaħdmu ma' database pjuttost kbir.

Żvantaġġi tas-soluzzjoni preċedenti

Punt uniku ta' falliment
Kellna punt wieħed ta’ falliment: l-applikazzjoni .NET dam fi proċess wieħed. Jekk xi modulu falla, l-applikazzjoni kollha falliet u kellha terġa' tinbeda. Peress li aħna awtomatizzaw numru kbir ta 'proċessi għal utenti differenti, minħabba falliment f'wieħed minnhom, kulħadd ma setax jaħdem għal xi żmien. U f'każ ta 'żball tas-softwer, anki backup ma għenx.

Kju ta' titjib
Dan l-iżvantaġġ huwa pjuttost organizzattiv. L-applikazzjoni tagħna għandha ħafna klijenti, u kollha jridu jtejbuha kemm jista 'jkun malajr. Preċedentement, kien impossibbli li jsir dan b'mod parallel, u l-klijenti kollha kienu fil-linja. Dan il-proċess kien negattiv għan-negozji għaliex kellhom jipprovaw li l-kompitu tagħhom kien siewi. U t-tim ta 'żvilupp qatta' ħin jorganizza dan il-kju. Dan ħa ħafna ħin u sforz, u l-prodott fl-aħħar mill-aħħar ma setax jinbidel malajr kemm xtaqu.

Użu subottimali tar-riżorsi
Meta jospitaw servizzi fi proċess wieħed, aħna dejjem ikkuppjajna kompletament il-konfigurazzjoni minn server għal server. Ridna npoġġu s-servizzi l-aktar mgħobbija separatament sabiex ma naħlux ir-riżorsi u niksbu kontroll aktar flessibbli fuq l-iskema ta’ skjerament tagħna.

Diffiċli biex jiġu implimentati teknoloġiji moderni
Problema familjari għall-iżviluppaturi kollha: hemm xewqa li jiġu introdotti teknoloġiji moderni fil-proġett, iżda m'hemm l-ebda opportunità. B'soluzzjoni monolitika kbira, kwalunkwe aġġornament tal-librerija attwali, biex ma nsemmux it-tranżizzjoni għal waħda ġdida, jinbidel f'kompitu pjuttost mhux trivjali. Jieħu żmien twil biex jipprova lill-mexxej tat-tim li dan se jġib aktar bonuses minn nervituri moħlija.

Diffikultà biex toħroġ bidliet
Din kienet l-aktar problema serja - konna noħorġu rilaxxi kull xahrejn.
Kull rilaxx inbidel f'diżastru reali għall-bank, minkejja l-ittestjar u l-isforzi tal-iżviluppaturi. In-negozju fehem li fil-bidu tal-ġimgħa xi wħud mill-funzjonalità tiegħu ma kinux se jaħdmu. U l-iżviluppaturi fehmu li kienet tistenniehom ġimgħa ta’ inċidenti serji.
Kulħadd kellu xewqa li jibdel is-sitwazzjoni.

Aspettattivi mill-mikroservizzi


Ħruġ ta' komponenti meta lesti. Kunsinna ta 'komponenti meta lesti billi tiddikomponi s-soluzzjoni u tissepara proċessi differenti.

Timijiet żgħar tal-prodott. Dan huwa importanti għaliex tim kbir li jaħdem fuq il-monolith l-antik kien diffiċli biex jiġi mmaniġġjat. Tim bħal dan kien sfurzat jaħdem skond proċess strett, iżda riedu aktar kreattività u indipendenza. Timijiet żgħar biss setgħu jaffordjaw dan.

Iżolament ta' servizzi fi proċessi separati. Idealment, ridt niżolaha f'kontenituri, iżda numru kbir ta 'servizzi miktuba fil-.NET Framework jimxu biss fuq il-Windows. Is-servizzi bbażati fuq .NET Core issa qed jidhru, iżda għadhom ftit minnhom.

Flessibilità fl-iskjerament. Nixtiequ ngħaqqdu s-servizzi kif għandna bżonnhom, u mhux il-mod kif il-kodiċi jġiegħlu.

Użu ta' teknoloġiji ġodda. Dan huwa interessanti għal kull programmatur.

Problemi ta’ tranżizzjoni


Naturalment, kieku kien faċli li tkisser monolitu f'mikroservizzi, ma jkun hemm l-ebda ħtieġa li titkellem dwarha f'konferenzi u tikteb artikli. Hemm ħafna nases f'dan il-proċess; ser niddeskrivi dawk ewlenin li xekkluna.

L-ewwel problema tipiku għall-biċċa l-kbira tal-monoliti: koerenza tal-loġika tan-negozju. Meta niktbu monolith, irridu nużaw mill-ġdid il-klassijiet tagħna biex ma niktbux kodiċi bla bżonn. U meta tiċċaqlaq għal mikroservizzi, din issir problema: il-kodiċi kollu huwa akkoppjat pjuttost sewwa, u huwa diffiċli li s-servizzi jiġu separati.

Fiż-żmien tal-bidu tax-xogħol, ir-repożitorju kellu aktar minn 500 proġett u aktar minn 700 elf linja ta 'kodiċi. Din hija deċiżjoni pjuttost kbira u it-tieni problema. Ma kienx possibbli li sempliċement teħodha u taqsamha f'mikroservizzi.

It-tielet problema — nuqqas ta' infrastruttura meħtieġa. Fil-fatt, konna manwalment nikkupjaw il-kodiċi tas-sors lis-servers.

Kif timxi minn monolith għal mikroservizzi


Provvista ta' Mikroservizzi

L-ewwelnett, aħna immedjatament iddeterminajna għalina nfusna li s-separazzjoni tal-mikroservizzi hija proċess iterattiv. Konna dejjem mitluba niżviluppaw problemi tan-negozju b'mod parallel. Kif se nimplimentaw dan teknikament diġà hija l-problema tagħna. Għalhekk, ħejjejna għal proċess iterattiv. Mhux se taħdem b'xi mod ieħor jekk għandek applikazzjoni kbira u inizjalment mhix lesta biex terġa' tinkiteb.

Liema metodi nużaw biex niżolaw il-mikroservizzi?

L-ewwel mod — iċċaqlaq moduli eżistenti bħala servizzi. F'dan ir-rigward, kellna xorti: diġà kien hemm servizzi reġistrati li ħadmu bl-użu tal-protokoll WCF. Huma ġew separati f'assemblaġġi separati. Aħna portatihom separatament, billi żidna lanċjar żgħir għal kull bini. Inkiteb bl-użu tal-librerija meraviljuża Topshelf, li tippermettilek tmexxi l-applikazzjoni kemm bħala servizz kif ukoll bħala console. Dan huwa konvenjenti għad-debugging peress li l-ebda proġett addizzjonali mhu meħtieġ fis-soluzzjoni.

Is-servizzi kienu konnessi skond il-loġika tan-negozju, peress li użaw assemblaġġi komuni u ħadmu ma 'database komuni. Bilkemm jistgħu jissejħu mikroservizzi fil-forma pura tagħhom. Madankollu, nistgħu nipprovdu dawn is-servizzi separatament, fi proċessi differenti. Dan waħdu għamilha possibbli li titnaqqas l-influwenza tagħhom fuq xulxin, tnaqqas il-problema bl-iżvilupp parallel u punt wieħed ta 'falliment.

L-assemblaġġ mal-ospitant huwa biss linja waħda ta 'kodiċi fil-klassi tal-Programm. Ħbejna x-xogħol ma' Topshelf fi klassi awżiljarja.

namespace RBA.Services.Accounts.Host
{
   internal class Program
   {
      private static void Main(string[] args)
      {
        HostRunner<Accounts>.Run("RBA.Services.Accounts.Host");

       }
    }
}

It-tieni mod kif jiġu allokati mikroservizzi huwa: joħolquhom biex isolvu problemi ġodda. Jekk fl-istess ħin il-monolith ma jikberx, dan diġà huwa eċċellenti, li jfisser li qed nimxu fid-direzzjoni t-tajba. Biex insolvu problemi ġodda, ippruvajna noħolqu servizzi separati. Jekk kien hemm opportunità bħal din, allura ħloqna aktar servizzi "kanoniċi" li jimmaniġġjaw kompletament il-mudell tad-dejta tagħhom stess, database separata.

Aħna, bħal ħafna, bdejna b'servizzi ta 'awtentikazzjoni u awtorizzazzjoni. Huma perfetti għal dan. Huma indipendenti, bħala regola, għandhom mudell ta 'dejta separat. Huma stess ma jinteraġixxux mal-monolith, biss jirrikorri għalihom biex isolvu xi problemi. Billi tuża dawn is-servizzi, tista 'tibda t-tranżizzjoni għal arkitettura ġdida, tiddibaggja l-infrastruttura fuqhom, tipprova xi approċċi relatati mal-libreriji tan-netwerk, eċċ. M'għandna l-ebda timijiet fl-organizzazzjoni tagħna li ma setgħux joħolqu servizz ta' awtentikazzjoni.

It-tielet mod biex jiġu allokati mikroservizziDak li nużaw huwa ftit speċifiku għalina. Din hija t-tneħħija tal-loġika tan-negozju mis-saff tal-UI. L-applikazzjoni ewlenija tagħna tal-UI hija desktop; hija, bħall-backend, hija miktuba f'C#. L-iżviluppaturi perjodikament għamlu żbalji u ttrasferixxew partijiet tal-loġika għall-UI li kellhom jeżistu fil-backend u jerġgħu jintużaw.

Jekk tħares lejn eżempju reali mill-kodiċi tal-parti UI, tista 'tara li ħafna minn din is-soluzzjoni fiha loġika tan-negozju reali li hija utli fi proċessi oħra, mhux biss għall-bini tal-formola UI.

It-tranżizzjoni minn monolith għal mikroservizzi: storja u prattika

Il-loġika reali tal-UI tinsab hemm biss fl-aħħar ftit linji. Aħna ttrasferijna lis-server sabiex ikun jista 'jerġa' jintuża, u b'hekk naqqas l-UI u ksibna l-arkitettura korretta.

Ir-raba 'u l-aktar mod importanti biex jiġu iżolati l-mikroservizzi, li jagħmilha possibbli li jitnaqqas il-monolith, hija t-tneħħija ta 'servizzi eżistenti bl-ipproċessar. Meta nieħdu l-moduli eżistenti kif inhu, ir-riżultat mhux dejjem ikun għall-predisposizzjoni tal-iżviluppaturi, u l-proċess tan-negozju jista 'jkun skadut minn meta nħolqot il-funzjonalità. Bir-refactoring, nistgħu nappoġġaw proċess tan-negozju ġdid minħabba li r-rekwiżiti tan-negozju qed jinbidlu kontinwament. Nistgħu ntejbu l-kodiċi tas-sors, inneħħu d-difetti magħrufa, u noħolqu mudell tad-dejta aħjar. Hemm ħafna benefiċċji akkumulati.

Is-separazzjoni tas-servizzi mill-ipproċessar hija marbuta b'mod inseparabbli mal-kunċett ta' kuntest limitat. Dan huwa kunċett minn Domain Driven Design. Dan ifisser taqsima tal-mudell tad-dominju li fiha t-termini kollha ta 'lingwa waħda huma definiti b'mod uniku. Ejja nħarsu lejn il-kuntest tal-assigurazzjoni u l-kontijiet bħala eżempju. Għandna applikazzjoni monolitika, u għandna bżonn naħdmu mal-kont fl-assigurazzjoni. Nistennew li l-iżviluppatur isib klassi tal-Kont eżistenti f'assemblaġġ ieħor, jirreferiha mill-klassi tal-Assigurazzjoni, u jkollna kodiċi tax-xogħol. Il-prinċipju DRY se jiġi rispettat, il-kompitu se jsir aktar malajr bl-użu ta 'kodiċi eżistenti.

Bħala riżultat, jirriżulta li l-kuntesti tal-kontijiet u l-assigurazzjoni huma konnessi. Hekk kif joħorġu rekwiżiti ġodda, dan l-akkoppjar se jinterferixxi mal-iżvilupp, u jżid il-kumplessità tal-loġika tan-negozju diġà kumplessa. Biex issolvi din il-problema, trid issib il-konfini bejn il-kuntesti fil-kodiċi u tneħħi l-vjolazzjonijiet tagħhom. Pereżempju, fil-kuntest tal-assigurazzjoni, huwa pjuttost possibbli li numru tal-kont tal-Bank Ċentrali b'20 ċifra u d-data tal-ftuħ tal-kont ikunu biżżejjed.

Biex nisseparaw dawn il-kuntesti konfinati minn xulxin u nibdew il-proċess ta’ separazzjoni tal-mikroservizzi minn soluzzjoni monolitika, użajna approċċ bħall-ħolqien ta’ APIs esterni fl-applikazzjoni. Jekk konna nafu li xi modulu għandu jsir mikroservizz, b'xi mod modifikat fi ħdan il-proċess, allura immedjatament għamilna sejħiet għal-loġika li tappartjeni għal kuntest limitat ieħor permezz ta 'sejħiet esterni. Pereżempju, permezz ta' REST jew WCF.

Iddeċidejna bis-sħiħ li ma nevitawx kodiċi li jkun jeħtieġ tranżazzjonijiet distribwiti. Fil-każ tagħna, irriżulta li kien pjuttost faċli li ssegwi din ir-regola. Għadna ma ltqajna ma sitwazzjonijiet fejn transazzjonijiet imqassma stretti huma verament meħtieġa - il-konsistenza finali bejn il-moduli hija pjuttost biżżejjed.

Ejja nħarsu lejn eżempju speċifiku. Għandna l-kunċett ta 'orkestratur - pipeline li jipproċessa l-entità tal-"applikazzjoni". Min-naħa tiegħu joħloq klijent, kont u karta bankarja. Jekk il-klijent u l-kont jinħolqu b'suċċess, iżda l-ħolqien tal-karta jonqos, l-applikazzjoni ma tiċċaqlaqx għall-istatus ta '"suċċess" u tibqa' fl-istatus "karta mhux maħluqa". Fil-futur, l-attività fl-isfond se tiġborha u tispiċċaha. Is-sistema ilha fi stat ta 'inkonsistenza għal xi żmien, iżda aħna ġeneralment sodisfatti b'dan.

Jekk tinħoloq sitwazzjoni meta jkun meħtieġ li nissejvjaw parti mid-dejta b'mod konsistenti, x'aktarx se mmorru għall-konsolidazzjoni tas-servizz sabiex nipproċessawha fi proċess wieħed.

Ejja nħarsu lejn eżempju ta 'allokazzjoni ta' mikroservizz. Kif tista 'ġġibha għall-produzzjoni b'mod relattivament sikur? F'dan l-eżempju, għandna parti separata tas-sistema - modulu ta 'servizz tal-pagi, waħda mit-taqsimiet tal-kodiċi li nixtiequ nagħmlu mikroservizz.

It-tranżizzjoni minn monolith għal mikroservizzi: storja u prattika

L-ewwelnett, noħolqu mikroservizz billi niktbu mill-ġdid il-kodiċi. Qed intejbu xi aspetti li ma konniex kuntenti bihom. Aħna nimplimentaw rekwiżiti kummerċjali ġodda mill-klijent. Aħna nżidu API Gateway mal-konnessjoni bejn l-UI u l-backend, li se tipprovdi call forwarding.

It-tranżizzjoni minn monolith għal mikroservizzi: storja u prattika

Sussegwentement, nirrilaxxaw din il-konfigurazzjoni biex titħaddem, iżda fi stat pilota. Ħafna mill-utenti tagħna għadhom jaħdmu bi proċessi tan-negozju qodma. Għal utenti ġodda, qed niżviluppaw verżjoni ġdida tal-applikazzjoni monolitika li m'għadhiex fiha dan il-proċess. Essenzjalment, għandna taħlita ta 'monolith u mikroservizz li jaħdem bħala pilota.

It-tranżizzjoni minn monolith għal mikroservizzi: storja u prattika

Bi pilota ta 'suċċess, aħna nifhmu li l-konfigurazzjoni l-ġdida hija tabilħaqq operabbli, nistgħu nneħħu l-monolith l-antik mill-ekwazzjoni u nħallu l-konfigurazzjoni l-ġdida minflok is-soluzzjoni l-antika.

It-tranżizzjoni minn monolith għal mikroservizzi: storja u prattika

B'kollox, nużaw kważi l-metodi eżistenti kollha għall-qsim tal-kodiċi tas-sors ta 'monolith. Kollha kemm huma jippermettulna nnaqqsu d-daqs ta 'partijiet ta' l-applikazzjoni u jittraduċuhom għal libreriji ġodda, jagħmlu kodiċi sors aħjar.

Ħidma mad-database


Id-database tista 'tinqasam agħar mill-kodiċi tas-sors, peress li fiha mhux biss l-iskema attwali, iżda wkoll data storika akkumulata.

Id-database tagħna, bħal ħafna oħrajn, kellha żvantaġġ ieħor importanti - id-daqs enormi tagħha. Din id-database kienet iddisinjata skond il-loġika tan-negozju kkomplikata ta 'monolith, u relazzjonijiet akkumulati bejn it-tabelli ta' diversi kuntesti konfinati.

Fil-każ tagħna, biex jaqbżu l-problemi kollha (database kbira, ħafna konnessjonijiet, xi drabi konfini mhux ċari bejn it-tabelli), qamet problema li sseħħ f'ħafna proġetti kbar: l-użu tal-mudell tad-database kondiviż. Id-dejta ttieħdet mit-tabelli permezz tal-vista, permezz tar-replikazzjoni, u ntbagħtet lil sistemi oħra fejn din ir-replikazzjoni kienet meħtieġa. Bħala riżultat, ma stajniex nimxu t-tabelli fi skema separata minħabba li ntużaw b'mod attiv.

L-istess diviżjoni f'kuntesti limitati fil-kodiċi tgħinna fis-separazzjoni. Normalment tagħtina idea pjuttost tajba ta’ kif inkissru d-dejta fil-livell tad-database. Nifhmu liema tabelli jappartjenu għal kuntest limitat u liema għal ieħor.

Aħna użajna żewġ metodi globali ta 'qsim tad-database: qsim ta' tabelli eżistenti u qsim bl-ipproċessar.

Il-qsim ta 'tabelli eżistenti huwa metodu tajjeb biex jintuża jekk l-istruttura tad-dejta hija tajba, tissodisfa r-rekwiżiti tan-negozju, u kulħadd ikun kuntent biha. F'dan il-każ, nistgħu nisseparaw it-tabelli eżistenti fi skema separata.

Dipartiment bl-ipproċessar huwa meħtieġ meta l-mudell tan-negozju nbidel ħafna, u t-tabelli m'għadhomx jissodisfawna xejn.

Qsim ta' tabelli eżistenti. Irridu niddeterminaw dak li se nisseparaw. Mingħajr dan l-għarfien, xejn mhu se jaħdem, u hawn is-separazzjoni tal-kuntesti limitati fil-kodiċi tgħinna. Bħala regola, jekk tista 'tifhem il-konfini tal-kuntesti fil-kodiċi tas-sors, isir ċar liema tabelli għandhom jiġu inklużi fil-lista għad-dipartiment.

Ejja nimmaġinaw li għandna soluzzjoni li fiha żewġ moduli monolitiċi jinteraġixxu ma 'database waħda. Irridu niżguraw li modulu wieħed biss jinteraġixxi mat-taqsima tat-tabelli separati, u l-ieħor jibda jinteraġixxi magħha permezz tal-API. Biex tibda, huwa biżżejjed li r-reġistrazzjoni titwettaq biss permezz tal-API. Din hija kundizzjoni meħtieġa biex nitkellmu dwar l-indipendenza tal-mikroservizzi. Il-konnessjonijiet tal-qari jistgħu jibqgħu sakemm ma jkunx hemm problema kbira.

It-tranżizzjoni minn monolith għal mikroservizzi: storja u prattika

Il-pass li jmiss huwa li nistgħu nisseparaw is-sezzjoni tal-kodiċi li taħdem b'tabelli separati, bi proċessar jew mingħajru, f'mikroservizz separat u nħaddmuh fi proċess separat, kontenitur. Dan se jkun servizz separat b'konnessjoni mad-database monolith u dawk it-tabelli li ma jirrelatawx direttament magħha. Il-monolith għadu jinteraġixxi għall-qari mal-parti li tista 'tinqala'.

It-tranżizzjoni minn monolith għal mikroservizzi: storja u prattika

Aktar tard se nneħħu din il-konnessjoni, jiġifieri, il-qari tad-dejta minn applikazzjoni monolitika minn tabelli separati se jiġi trasferit ukoll għall-API.

It-tranżizzjoni minn monolith għal mikroservizzi: storja u prattika

Sussegwentement, aħna se nagħżlu mid-database ġenerali t-tabelli li bihom jaħdem biss il-mikroservizz il-ġdid. Nistgħu nimxu t-tabelli għal skema separata jew saħansitra għal database fiżika separata. Għad hemm konnessjoni tal-qari bejn il-mikroservizz u d-database monolith, iżda m'hemm xejn għalfejn tinkwieta, f'din il-konfigurazzjoni tista 'tgħix għal żmien pjuttost twil.

It-tranżizzjoni minn monolith għal mikroservizzi: storja u prattika

L-aħħar pass huwa li tneħħi kompletament il-konnessjonijiet kollha. F'dan il-każ, jista 'jkollna bżonn nimigraw id-data mid-database prinċipali. Xi drabi rridu nużaw mill-ġdid xi data jew direttorji replikati minn sistemi esterni f'diversi databases. Dan jiġrilna perjodikament.

It-tranżizzjoni minn monolith għal mikroservizzi: storja u prattika

Dipartiment tal-ipproċessar. Dan il-metodu huwa simili ħafna għall-ewwel wieħed, biss f'ordni inversa. Aħna immedjatament nallokaw database ġdida u mikroservizz ġdid li jinteraġixxi mal-monolith permezz ta 'API. Iżda fl-istess ħin, jibqa 'sett ta' tabelli tad-database li rridu nħassru fil-futur. M'għadniex bżonnha; biddilna fil-mudell il-ġdid.

It-tranżizzjoni minn monolith għal mikroservizzi: storja u prattika

Biex din l-iskema taħdem, x'aktarx ikollna bżonn perjodu ta' tranżizzjoni.

Imbagħad hemm żewġ approċċi possibbli.

Ewwel: nidduplikaw id-data kollha fid-databases il-ġodda u l-qodma. F'dan il-każ, għandna redundancy tad-data u jistgħu jinqalgħu problemi ta 'sinkronizzazzjoni. Imma nistgħu nieħdu żewġ klijenti differenti. Wieħed se jaħdem mal-verżjoni l-ġdida, l-ieħor mal-qadima.

It-tieni: naqsmu d-dejta skont xi kriterji tan-negozju. Pereżempju, kellna 5 prodotti fis-sistema li kienu maħżuna fid-database l-antika. Aħna npoġġu s-sitt wieħed fi ħdan il-kompitu kummerċjali l-ġdid f'database ġdida. Imma se jkollna bżonn API Gateway li se jissinkronizza din id-dejta u juri lill-klijent minn fejn u minn xiex.

Iż-żewġ approċċi jaħdmu, agħżel skont is-sitwazzjoni.

Wara li nkunu ċerti li kollox jaħdem, il-parti tal-monolith li taħdem ma 'strutturi ta' database antiki tista 'tiġi diżattivata.

It-tranżizzjoni minn monolith għal mikroservizzi: storja u prattika

L-aħħar pass huwa li jitneħħew l-istrutturi tad-dejta qodma.

It-tranżizzjoni minn monolith għal mikroservizzi: storja u prattika

Fil-qosor, nistgħu ngħidu li għandna problemi bid-database: huwa diffiċli li taħdem magħha meta mqabbla mal-kodiċi tas-sors, huwa aktar diffiċli li taqsam, iżda jista 'u għandu jsir. Sibna xi modi li jippermettulna nagħmlu dan b'mod pjuttost sigur, iżda xorta huwa aktar faċli li nagħmlu żbalji bid-dejta milli bil-kodiċi tas-sors.

Ħidma bil-kodiċi tas-sors


Hekk dehret id-dijagramma tal-kodiċi tas-sors meta bdejna nanalizzaw il-proġett monolitiku.

It-tranżizzjoni minn monolith għal mikroservizzi: storja u prattika

Jista 'jkun bejn wieħed u ieħor maqsum fi tliet saffi. Dan huwa saff ta 'moduli, plugins, servizzi u attivitajiet individwali mnedija. Fil-fatt, dawn kienu punti ta’ dħul f’soluzzjoni monolitika. Kollha kemm huma ġew issiġillati sewwa b'saff Komuni. Kellha loġika tan-negozju li s-servizzi jaqsmu u ħafna konnessjonijiet. Kull servizz u plugin uża sa 10 jew aktar assemblaġġi komuni, skont id-daqs tagħhom u l-kuxjenza tal-iżviluppaturi.

Konna xxurtjati li għandna libreriji infrastrutturali li setgħu jintużaw separatament.

Xi drabi qamet sitwazzjoni meta xi oġġetti komuni fil-fatt ma kinux jappartjenu għal dan is-saff, iżda kienu libreriji tal-infrastruttura. Dan ġie solvut billi tissemma mill-ġdid.

L-akbar tħassib kien kuntesti limitati. Ġara li 3-4 kuntesti tħalltu f'assemblaġġ Komuni wieħed u użaw lil xulxin fi ħdan l-istess funzjonijiet tan-negozju. Kien meħtieġ li wieħed jifhem fejn dan jista 'jinqasam u tul liema konfini, u x'għandek tagħmel wara bl-immappjar ta' din id-diviżjoni f'assemblaġġi ta 'kodiċi tas-sors.

Aħna fformulajna diversi regoli għall-proċess tal-qsim tal-kodiċi.

L-ewwel: Ma ridniex aktar naqsmu l-loġika tan-negozju bejn is-servizzi, l-attivitajiet u l-plugins. Ridna nagħmlu l-loġika tan-negozju indipendenti fi ħdan il-mikroservizzi. Il-mikroservizzi, min-naħa l-oħra, huma idealment meqjusa bħala servizzi li jeżistu b'mod kompletament indipendenti. Nemmen li dan l-approċċ huwa kemmxejn ta 'ħela, u huwa diffiċli li jinkiseb, għaliex, pereżempju, servizzi f'C# fi kwalunkwe każ se jkunu konnessi minn librerija standard. Is-sistema tagħna hija miktuba f'C#; għadna ma użajnax teknoloġiji oħra. Għalhekk, iddeċidejna li nistgħu naffordjaw li nużaw assemblaġġi tekniċi komuni. Il-ħaġa prinċipali hija li ma fihom l-ebda framment tal-loġika tan-negozju. Jekk għandek tgeżwir ta 'konvenjenza fuq l-ORM li qed tuża, allura l-ikkupjar minn servizz għal servizz jiswa ħafna.

It-tim tagħna huwa fan tad-disinn immexxi mid-dominju, għalhekk l-arkitettura tal-basal kienet tajba ħafna għalina. Il-bażi tas-servizzi tagħna mhijiex is-saff ta 'aċċess għad-dejta, iżda assemblaġġ b'loġika tad-dominju, li fih biss loġika tan-negozju u m'għandha l-ebda konnessjoni mal-infrastruttura. Fl-istess ħin, nistgħu nimmodifikaw b'mod indipendenti l-assemblaġġ tad-dominju biex insolvu problemi relatati mal-oqfsa.

F'dan l-istadju ltqajna ma' l-ewwel problema serja tagħna. Is-servizz kellu jirreferi għal assemblaġġ ta 'dominju wieħed, ridna nagħmlu l-loġika indipendenti, u l-prinċipju DRY ixekkelna ħafna hawn. L-iżviluppaturi riedu jużaw mill-ġdid klassijiet minn assemblaġġi ġirien biex jevitaw id-duplikazzjoni, u b'riżultat ta 'dan, id-dominji reġgħu bdew jiġu konnessi flimkien. Aħna analizzajna r-riżultati u ddeċidejna li forsi l-problema tinsab ukoll fiż-żona tal-apparat tal-ħażna tal-kodiċi tas-sors. Kellna repożitorju kbir li fih il-kodiċi tas-sors kollu. Is-soluzzjoni għall-proġett kollu kienet diffiċli ħafna biex tinġabar fuq magna lokali. Għalhekk, inħolqu soluzzjonijiet żgħar separati għal partijiet tal-proġett, u ħadd ma pprojbixxa li żżid xi assemblaġġ komuni jew ta 'dominju magħhom u li jerġa' jużahom. L-unika għodda li ma ħalliniex nagħmlu dan kienet ir-reviżjoni tal-kodiċi. Imma kultant falla wkoll.

Imbagħad bdejna nimxu għal mudell b'repożitorji separati. Il-loġika tan-negozju m'għadhiex tgħaddi minn servizz għal servizz, id-dominji saru verament indipendenti. Il-kuntesti limitati huma appoġġjati b'mod aktar ċar. Kif nerġgħu nużaw il-libreriji tal-infrastruttura? Separajnahom f'repożitorju separat, imbagħad poġġihom f'pakketti Nuget, li poġġiejna f'Artifactory. Bi kwalunkwe bidla, l-assemblaġġ u l-pubblikazzjoni jseħħu awtomatikament.

It-tranżizzjoni minn monolith għal mikroservizzi: storja u prattika

Is-servizzi tagħna bdew jirreferu għall-pakketti tal-infrastruttura interna bl-istess mod bħal dawk esterni. Iniżżlu libreriji esterni minn Nuget. Biex naħdmu ma 'Artifactory, fejn poġġejna dawn il-pakketti, użajna żewġ maniġers tal-pakketti. F'repożitorji żgħar użajna wkoll Nuget. F'repożitorji b'diversi servizzi, użajna Paket, li jipprovdi aktar konsistenza tal-verżjoni bejn il-moduli.

It-tranżizzjoni minn monolith għal mikroservizzi: storja u prattika

Għalhekk, billi naħdmu fuq il-kodiċi tas-sors, nibdlu ftit l-arkitettura u nisseparaw ir-repożitorji, nagħmlu s-servizzi tagħna aktar indipendenti.

Problemi ta' infrastruttura


Ħafna mill-aspetti negattivi biex wieħed jiċċaqlaq għal mikroservizzi huma relatati mal-infrastruttura. Ikollok bżonn skjerament awtomatizzat, ser ikollok bżonn libreriji ġodda biex tmexxi l-infrastruttura.

Installazzjoni manwali f'ambjenti

Inizjalment, installajna s-soluzzjoni għall-ambjenti manwalment. Biex awtomat dan il-proċess, ħloqna pipeline CI/CD. Għażilna l-proċess ta’ konsenja kontinwa minħabba li l-iskjerament kontinwu għadu mhux aċċettabbli għalina mil-lat tal-proċessi tan-negozju. Għalhekk, it-trażmissjoni għall-operazzjoni titwettaq permezz ta 'buttuna, u għall-ittestjar - awtomatikament.

It-tranżizzjoni minn monolith għal mikroservizzi: storja u prattika

Aħna nużaw Atlassian, Bitbucket għall-ħażna tal-kodiċi tas-sors u Bamboo għall-bini. Aħna nħobbu niktbu scripts tal-bini f'Cake għax huwa l-istess bħal C#. Pakketti lesti jaslu għand Artifactory, u Ansible jasal awtomatikament fis-servers tat-test, u wara jkunu jistgħu jiġu ttestjati immedjatament.

It-tranżizzjoni minn monolith għal mikroservizzi: storja u prattika

Logging separat


F'ħin wieħed, waħda mill-ideat tal-monolith kienet li tipprovdi qtugħ kondiviż. Kellna wkoll nifhmu x'għandna nagħmlu biċ-zkuk individwali li huma fuq id-diski. Iz-zkuk tagħna huma miktuba fil-fajls tat-test. Iddeċidejna li nużaw munzell ELK standard. Aħna ma ktibniex lil ELK direttament permezz tal-fornituri, iżda ddeċidejna li nimmodifikaw ir-reġistri tat-test u niktbu l-ID tat-traċċa fihom bħala identifikatur, billi nżidu l-isem tas-servizz, sabiex dawn ir-reġistri jkunu jistgħu jiġu analizzati aktar tard.

It-tranżizzjoni minn monolith għal mikroservizzi: storja u prattika

Bl-użu tal-Filebeat, ikollna l-opportunità li niġbru r-zkuk tagħna mis-servers, imbagħad nittrasformawhom, nużaw Kibana biex nibnu mistoqsijiet fl-UI u naraw kif is-sejħa marret bejn is-servizzi. Trace ID jgħin ħafna f'dan.

Servizzi relatati ta' ttestjar u debugging


Inizjalment, ma fhimniex bis-sħiħ kif niddibaggjaw is-servizzi li qed jiġu żviluppati. Kollox kien sempliċi bil-monolith; ħadna fuq magna lokali. Għall-ewwel ippruvaw jagħmlu l-istess bil-mikroservizzi, iżda xi drabi biex tniedi għal kollox mikroservizz wieħed jeħtieġ li tniedi diversi oħrajn, u dan huwa inkonvenjenti. Irrealizzajna li rridu nimxu għal mudell fejn inħallu fuq il-magna lokali biss is-servizz jew is-servizzi li rridu niddebugjaw. Is-servizzi li jifdal jintużaw minn servers li jaqblu mal-konfigurazzjoni ma 'prod. Wara d-debugging, waqt l-ittestjar, għal kull kompitu, is-servizzi mibdula biss jinħarġu lis-server tat-test. Għalhekk, is-soluzzjoni hija ttestjata fil-forma li fiha se tidher fil-produzzjoni fil-futur.

Hemm servers li jmexxu biss verżjonijiet tal-produzzjoni tas-servizzi. Dawn is-servers huma meħtieġa f'każ ta' inċidenti, biex jiċċekkjaw il-kunsinna qabel l-iskjerament u għal taħriġ intern.

Żidna proċess ta’ ttestjar awtomatizzat bl-użu tal-librerija popolari Specflow. It-testijiet isiru awtomatikament bl-użu ta' NUnit immedjatament wara l-iskjerament minn Ansible. Jekk il-kopertura tal-kompitu hija kompletament awtomatika, allura m'hemmx bżonn ta 'ttestjar manwali. Għalkemm xi drabi ttestjar manwali addizzjonali għadu meħtieġ. Aħna nużaw tikketti f'Jira biex niddeterminaw liema testijiet inwettqu għal kwistjoni speċifika.

Barra minn hekk, il-ħtieġa għall-ittestjar tat-tagħbija żdiedet; qabel kienet titwettaq biss f'każijiet rari. Aħna nużaw JMeter biex imexxu testijiet, InfluxDB biex jaħżnuhom, u Grafana biex nibnu graffs tal-proċess.

X’ksibna?


L-ewwelnett, neħles mill-kunċett ta '"rilaxx". Għaddew ir-rilaxxi mostrużi ta 'xahrejn meta dan il-kolossu ġie skjerat f'ambjent ta' produzzjoni, li jfixkel temporanjament il-proċessi tan-negozju. Issa aħna niskjeraw is-servizzi bħala medja kull jum u nofs, u niġbruhom f'raggruppament għax jibdew joperaw wara l-approvazzjoni.

M'hemm l-ebda fallimenti fatali fis-sistema tagħna. Jekk nirrilaxxaw mikroservizz bi bug, allura l-funzjonalità assoċjata miegħu tinkiser, u l-funzjonalità l-oħra kollha ma tiġix affettwata. Dan itejjeb ħafna l-esperjenza tal-utent.

Nistgħu nikkontrollaw il-mudell tal-iskjerament. Tista' tagħżel gruppi ta' servizzi separatament mill-bqija tas-soluzzjoni, jekk meħtieġ.

Barra minn hekk, naqqasna b'mod sinifikanti l-problema b'kju kbir ta 'titjib. Issa għandna timijiet ta 'prodotti separati li jaħdmu ma' wħud mis-servizzi b'mod indipendenti. Il-proċess Scrum diġà huwa tajjeb hawn. Tim speċifiku jista' jkollu Sid tal-Prodott separat li jassenjalu l-kompiti.

Sommarju

  • Il-mikroservizzi huma adattati tajjeb għad-dekompożizzjoni ta' sistemi kumplessi. Fil-proċess, nibdew nifhmu x'hemm fis-sistema tagħna, liema kuntesti limitati hemm, fejn jinsabu l-konfini tagħhom. Dan jippermettilek tqassam b'mod korrett it-titjib fost il-moduli u tevita l-konfużjoni tal-kodiċi.
  • Il-mikroservizzi jipprovdu benefiċċji organizzattivi. Ħafna drabi jitkellmu dwarhom biss bħala arkitettura, iżda kull arkitettura hija meħtieġa biex issolvi l-ħtiġijiet tan-negozju, u mhux waħedha. Għalhekk, nistgħu ngħidu li l-mikroservizzi huma adattati tajjeb biex isolvu problemi fi timijiet żgħar, peress li Scrum huwa popolari ħafna issa.
  • Is-separazzjoni hija proċess iterattiv. Ma tistax tieħu applikazzjoni u sempliċement taqsamha f'mikroservizzi. Il-prodott li jirriżulta mhux probabbli li jkun funzjonali. Meta tiddedika mikroservizzi, huwa ta 'benefiċċju li terġa' tikteb il-wirt eżistenti, jiġifieri, nibdluh f'kodiċi li nħobbu u jissodisfa aħjar il-ħtiġijiet tan-negozju f'termini ta 'funzjonalità u veloċità.

    Avviż żgħir: L-ispejjeż ta 'ċaqliq għal mikroservizzi huma pjuttost sinifikanti. Ħa ħafna żmien biex issolvi l-problema tal-infrastruttura waħedha. Mela jekk għandek applikazzjoni żgħira li ma teħtieġx skala speċifika, sakemm ma jkollokx numru kbir ta 'klijenti li jikkompetu għall-attenzjoni u l-ħin tat-tim tiegħek, allura l-mikroservizzi jistgħu ma jkunux dak li għandek bżonn illum. Huwa pjuttost għoli. Jekk tibda l-proċess b'mikroservizzi, allura l-ispejjeż inizjalment ikunu ogħla milli kieku tibda l-istess proġett bl-iżvilupp ta 'monolith.

    PS Storja aktar emozzjonali (u bħallikieku għalik personalment) - skond rabta.
    Hawnhekk hawn il-verżjoni sħiħa tar-rapport.

Sors: www.habr.com

Żid kumment