{"id":35906,"date":"2019-10-31T22:07:29","date_gmt":"2019-10-31T19:07:29","guid":{"rendered":"https:\/\/prohoster.info\/blog\/perehod-ot-monolita-k-mikroservisam-istoriya-i-praktika\/"},"modified":"2019-10-31T22:07:29","modified_gmt":"2019-10-31T19:07:29","slug":"perehod-ot-monolita-k-mikroservisam-istoriya-i-praktika","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/perehod-ot-monolita-k-mikroservisam-istoriya-i-praktika","title":{"rendered":"\u00dcleminek monoliidilt mikroteenustele: ajalugu ja praktika","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Selles artiklis r\u00e4\u00e4gin, kuidas projekt, milles t\u00f6\u00f6tan, muutus suurest monoliidist mikroteenuste kogumiks.<\/p>\n<p>Projekt alustas oma teekonda \u00fcsna ammu, 2000. aasta alguses. Esimesed versioonid olid kirjutatud Visual Basic 6-s. Aja jooksul sai selgeks, et selle keele arendamine tulevikus osutub keeruliseks, kuna IDE ja keel ise arenesid aeglaselt. 2000. aastate l\u00f5pus otsustati liikuda perspektiivikama C# keele juurde. Uus versioon kirjutati paralleelselt vana t\u00e4iustamisega, kus j\u00e4rjest rohkem koodi viidi .NET-i. C#-il p\u00f5hinev tagaplaan oli algselt suunatud teenuse arhitektuurile, kuid arendamisel kasutati tavalisi raamatukogusid koos loogikaga, ja teenuseid k\u00e4ivitati \u00fches protsessis. Tulemusena saime rakenduse, mida nimetasime \"teenuse monoliidiks\". <\/p>\n<p>\u00dcheks v\u00e4hestest sellise \u00fchenduse eelistest oli v\u00f5imalus teenustel \u00fcksteist v\u00e4lise API kaudu kutsuda. Oli ilmseid eeltingimusi liikuda \u00f5ige teenuse ja tulevikus ka mikroteenuse arhitektuuri poole. <\/p>\n<p>Meie dekomposteerimise t\u00f6\u00f6 algas umbes 2015. aastal. Veel pole me saavutanud ideaalset seisundit - on alles j\u00e4\u00e4nud osi suurest projektist, mida on raske nimeta monoliitideks, aga nad ei sarnane ka mikroteenustega. Sellegipoolest on edusamm m\u00e4rkimisv\u00e4\u00e4rne. <br \/>\nSeda ma ka artiklis kirjeldan.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcleminek monoliidilt mikroteenustele: ajalugu ja praktika\" src=\"\/wp-content\/uploads\/2019\/07\/132bb4ea6b9dbcdd202ee090f2b86289.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Sisu<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"#1\"> Olemasoleva lahenduse arhitektuur ja probleemid<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#2\">Ootused mikroteenustele<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#3\">\u00dclemineku probleemid<\/a><\/noindex><\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"#4\">Kuidas liikuda monoliidilt mikroteenustele<\/a><\/noindex>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"#5\">Esimene meetod<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#6\">Teine meetod<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#7\">Kolmas meetod<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#8\">Neljas meetod<\/a><\/noindex><\/li>\n<\/ul>\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#9\">T\u00f6\u00f6 andmebaasiga<\/a><\/noindex>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"#10\">Olemasolevate tabelite eraldamine<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#11\">Eraldamine koos \u00fcmbert\u00f6\u00f6tlemisega<\/a><\/noindex><\/li>\n<\/ul>\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#12\">T\u00f6\u00f6 l\u00e4htekoodiga<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#13\">Infrastruktuuri probleemid<\/a><\/noindex>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"#16\">K\u00e4sitsi installimine keskkondadesse<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#14\">Erinev logimine<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#15\">Seotud teenuste testimine ja silumine<\/a><\/noindex><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><noindex><a rel=\"nofollow\" name=\"1\"><\/a><\/noindex><b><\/p>\n<h3>Olemasoleva lahenduse arhitektuur ja probleemid<\/h3>\n<p><\/b><br \/>\nAlgne arhitektuur n\u00e4gi v\u00e4lja j\u00e4rgmine: UI - eraldi rakendus, monoliitne osa oli kirjutatud Visual Basic 6-s, .NET rakendus oli koosne lahti seotud teenustest, mis t\u00f6\u00f6tasid \u00fcsna suure andmebaasiga.<\/p>\n<p><b>Eelmise lahenduse puudused<\/b><\/p>\n<p><u>\u00dcksik rikkepunkt<\/u><br \/>\nMeil oli \u00fcks t\u00f5rke koht: .NET rakendus k\u00e4itus \u00fches protsessis. Kui m\u00f5nes moodulis esines rike, kukkus kogu rakendus \u00e4ra ja tuli see taask\u00e4ivitada. Kuna automatiseerime suurt hulka protsesse erinevatele kasutajatele, ei saanud me m\u00f5neks ajaks t\u00f6\u00f6tada k\u00f5ik, kui \u00fcks neist eba\u00f5nnestus. Ja programmit\u00f5rge korral ei aidanud ka varundamine. <\/p>\n<p><u>T\u00f6\u00f6tundide j\u00e4rjekord<\/u><br \/>\nSee probleem on pigem organisatsiooniline. Meie rakenduses on palju kliente, ja k\u00f5ik nad soovivad oma arendust\u00f6\u00f6dega v\u00f5imalikult kiiresti edasi minna. Varem polnud seda v\u00f5imalik samaaegselt teha ja k\u00f5ik kliendid said j\u00e4rjekorda. See protsess tekitas \u00e4ri seas negatiivset suhtumist, kuna neil tuli t\u00f5estada, et nende \u00fclesanne on v\u00e4\u00e4rtuslik. Arendusmeeskond kulutas aega, et seda j\u00e4rjekorda korraldada. See v\u00f5ttis palju aega ja energiat, ning toode ei suutnud l\u00f5puks muutuda nii kiiresti, kui nad oleksid soovinud.<\/p>\n<p><u>Ressursside ebapiisav kasutamine<\/u><br \/>\nTeenuste paigutamine \u00fchte protsessi t\u00e4hendas, et me kopeerisime alati konfiguratsiooni serverilt serverile t\u00e4ielikult. Soovisime paigutada k\u00f5ige koormatud teenused eraldi, et mitte raisata ressursse ja saavutada oma kasutamise skeemi paindlikum juhtimine.<\/p>\n<p><u>Moodsa tehnoloogia rakendamine on keeruline.<\/u><br \/>\nTuttav probleem igale arendajale: on soov tuua projekti moodsaid tehnoloogiaid, kuid v\u00f5imalused puuduvad. Suure monoliitse lahenduse puhul muutub iga olemasoleva teegi v\u00e4rskendamine, r\u00e4\u00e4kimata uuele \u00fcleminekust, \u00fcsna keeruliseks \u00fclesandeks. Tuleb pika aega t\u00f5estada tiimijuhile, et see toodab rohkem kasu kui kulutatud n\u00e4rve. <\/p>\n<p><u>Muudatuste v\u00e4ljastamise keerukus.<\/u><br \/>\nSee oli k\u00f5ige t\u00f5sisem probleem - andsime v\u00e4lja versioone iga kahe kuu tagant. <br \/>\nIga versioon muutus pangale t\u00f5eliseks katastroofiks, hoolimata testimisest ja arendajate pingutustest. \u00c4ri m\u00f5istis, et tal ei ole n\u00e4dal alguses osa funktsionaalsusest kasutamiseks. Ja arendajad m\u00f5istsid, et neid ootab ees n\u00e4dal t\u00f5siste probleemidega. <br \/>\nSoov olukorda muuta oli k\u00f5igil. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"2\"><\/a><\/noindex><b><\/p>\n<h3>Ootused mikroteenustele<\/h3>\n<p><\/b><br \/>\n<u>Komponendid antakse v\u00e4lja nende valmiduse j\u00e4rgi. <\/u>Komponendid antakse v\u00e4lja valmiduse j\u00e4rgi lahenduse dekompositsiooni ja erinevate protsesside eraldamise t\u00f5ttu.<\/p>\n<p><u>V\u00e4ikesed tootemeeskonnad.<\/u> See on oluline, kuna suure meeskonna, kes t\u00f6\u00f6tas vana monoliidi kallal, haldamine oli keeruline. Selline meeskond pidi t\u00f6\u00f6tama rangete protsesside j\u00e4rgi, kuid sooviti rohkem loovust ja iseseisvust. Selleks saaksid endale lubada ainult v\u00e4iksed meeskonnad.<\/p>\n<p><u>Teenuste isoleerimine eraldi protsessides.<\/u> Ideaalis oleks soovinud isoleerida konteineritesse, kuid suur hulk .NET Frameworki p\u00f5hiseid teenuseid t\u00f6\u00f6tab ainult Windowsi all. Praegu on k\u00fcll hakanud ilmuma teenuseid .NET Core'i peal, kuid neid on veel v\u00e4he.<\/p>\n<p><u>Paigaldamise paindlikkus.<\/u> Sooviksime kombineerida teenuseid nii, nagu meile vajalik, mitte nii, nagu kood sunnib.<\/p>\n<p><u>Uute tehnoloogiate kasutamine.<\/u> See huvitab iga programmeerijat.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"3\"><\/a><\/noindex><b><\/p>\n<h3>\u00dclemineku probleemid<\/h3>\n<p><\/b><br \/>\nMuidugi, kui monoliidi jagamine mikroteenusteks oleks lihtne, ei r\u00e4\u00e4giks me sellest konverentsidel ja ei kirjutaks artikleid. Sellel protsessil on palju undercurrents'e, kirjeldan peamisi, mis takistasid meid.<\/p>\n<p><b>Esimene probleem<\/b> t\u00fc\u00fcpiline enamikule monoliitidele: \u00e4riloogika sidusus. Kui me kirjutame monoliiti, tahame taaskasutada meie klasse, et mitte kirjutada liigset koodi. Kuid mikroteenustele \u00fcleminek toob selle probleemina esile: kogu kood on piisavalt rangelt seotud ja teenuste eraldamine on keeruline.<\/p>\n<p>T\u00f6\u00f6de alustamise hetkeks oli hoidlates \u00fcle 500 projekti ja rohkem kui 700 tuhat koodirea. See on piisavalt suur lahendus ja <b>teine probleem<\/b>. Lihtsalt v\u00f5tta ja jagada see mikroteenusteks ei olnud v\u00f5imalik.<\/p>\n<p><b>Kolmas probleem<\/b> \u2013 vajaliku infrastruktuuri puudumine. Tegelikult tegelesime algkoodi k\u00e4sitsi kopeerimisega serveritesse.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"4\"><\/a><\/noindex><b><\/p>\n<h3>Kuidas liikuda monoliidilt mikroteenustele<\/h3>\n<p><\/b><br \/>\n<u>Mikroteenuste eraldamine<\/u><\/p>\n<p>Esiteks, me m\u00e4\u00e4ratlesime endale kohe, et mikroteenuste eraldamine on iteratiivne protsess. Meilt n\u00f5uti alati samaaegselt \u00e4ri\u00fclesannete arendamist. Kuidas me seda tehniliselt teostame \u2013 see on juba meie probleem. Seet\u00f5ttu valmistusime iteratiivseks protsessiks. Teistmoodi ei ole v\u00f5imalik, kui teil on suur rakendus, ja see ei ole algselt valmis selleks, et seda uuesti kirjutada.<\/p>\n<p>Milliseid meetodeid me mikroteenuste eraldamiseks kasutame?<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"5\"><\/a><\/noindex><b>Esimene meetod <\/b>\u2014 tuua olemasolevad moodulid teenustena v\u00e4lja. Meil on selles osas vedanud: juba oli olemas teenuseid, mis t\u00f6\u00f6tasid WCF protokolli kaudu. Need olid jaotatud eraldi kogumitesse. Me edastasime need eraldi, lisades igale kogumile v\u00e4ikese k\u00e4ivitamismooduli. See oli kirjutatud suurep\u00e4rase Topshelf raamatukogu abil, mis v\u00f5imaldab rakendust k\u00e4ivitada nii teenusena kui ka konsoolidena. See on mugav silumise jaoks, kuna ei ole vaja lisa projekte lahendusse.<\/p>\n<p>Teenused olid seotud \u00e4riloogikaga, kuna nad kasutasid \u00fchiseid kogumeid ja t\u00f6\u00f6tasid \u00fchise andmebaasiga. Neid oli raske pidada puhtaks mikroteenuseks. Kuid me saime neid teenuseid v\u00e4lja anda eraldi erinevates protsessides. Isegi see v\u00f5imaldas v\u00e4hendada nendevahelist m\u00f5ju, v\u00e4hendades paralleelse arenduse probleemi ja \u00fchte rikkepunkti.<\/p>\n<p>Hosti kogumik on Program klassis vaid \u00fcks koodirida. T\u00f6\u00f6d Topshelfiga oleme peitnud abiklassi.<\/p>\n<pre><code class=\"plaintext\">namespace RBA.Services.Accounts.Host\n{\n   internal class Program\n   {\n      private static void Main(string[] args)\n      {\n        HostRunner.Run(\"RBA.Services.Accounts.Host\");\n\n       }\n    }\n}\n<\/code><\/pre>\n<p>\n<noindex><a rel=\"nofollow\" name=\"6\"><\/a><\/noindex><b>Teine mikroteenuste eraldamise viis:<\/b> luua neid uute probleemide lahendamiseks. Kui samas monoliit ei kasva, on see juba hea, see t\u00e4hendab, et liikume \u00f5iges suunas. Uute probleemide lahendamiseks oleme p\u00fc\u00fcdnud teha eraldi teenuseid. Kui see oli v\u00f5imalik, siis oleme loonud rohkem \u201ekanonilisi\u201c teenuseid, mis haldavad t\u00e4ielikult oma andmemudelit ja eraldi andmebaasi. <\/p>\n<p>Meie, nagu paljud teised, alustasime autentimis- ja autoriseerimisteenustega. Need sobivad selleks ideaalselt. Nad on iseseisvad, nende andmemudel on tavaliselt eraldi. Nad ei suhtu monoliiti, vaid ainult monoliit p\u00f6\u00f6rdub nende poole teatud probleemide lahendamiseks. Nendel teenustel on v\u00f5imalik alustada \u00fcleminekut uuele arhitektuurile, testida nende peal infrastruktuuri, katsetada erinevaid l\u00e4henemisviise, mis on seotud v\u00f5rgurakendustega jne. Meie organisatsioonis ei ole tiime, kellel ei oleks \u00f5nnestunud luua autentimisteenust. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"7\"><\/a><\/noindex><b>Kolmas viis mikroteenuste eristamiseks<\/b>, mida me kasutame, on meie jaoks veidi spetsiifiline. See on \u00e4riloogika eraldamine UI-kihist. Meie peamine UI-rakendus on desktop-versioon, mis on nagu ka backend kirjutatud C#-s. Arendajad eksisid perioodiliselt ja eraldasid UI-sse loogika osi, mis pidanuks eksisteerima backend-is ja mida oleks v\u00f5inud taaskasutada. <\/p>\n<p>Kui vaadata t\u00f5elist n\u00e4idet UI-osa koodist, siis on selge, et suur osa sellest lahendusest sisaldab t\u00f5eliselt \u00e4riloogikat, mis on kasulik muudes protsessides, mitte ainult UI-vormi koostamisel. <\/p>\n<p><img decoding=\"async\" alt=\"\u00dcleminek monoliidilt mikroteenustele: ajalugu ja praktika\" src=\"\/wp-content\/uploads\/2019\/07\/74c7b90ff94b343816ab3ac2fa0673c6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTegelikku UI loogikat on seal ainult viimasel paaril real. Me viisime selle serverisse, et oleks v\u00f5imalik taaskasutada, v\u00e4hendades seel\u00e4bi UI-d ja saavutades \u00f5ige arhitektuuri.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"8\"><\/a><\/noindex><b>Neljas, k\u00f5ige olulisem viis mikroteenuste eraldamiseks<\/b>, mis v\u00f5imaldab monoliiti v\u00e4hendada, on olemasolevate teenuste v\u00e4lja viimine koos \u00fcmbert\u00f6\u00f6tamisega. Kui me viime olemasolevad moodulid sellisena v\u00e4lja, ei pruugi tulemus alati arendajatele meeldida, ja \u00e4ri protsess ajast, mil funktsionaalsus loodi, v\u00f5ib olla vananenud. Refaktooringu abil saame toetada uut \u00e4riprotsessi, kuna \u00e4ri n\u00f5uded muutuvad pidevalt. Saame parandada algkoodi, eemaldada teadaolevaid vigu, luua kvaliteetsem andmemudel. Saame palju eeliseid.<\/p>\n<p>Teenuste eraldamine, millel on piiratud kontekst, on tihedalt seotud spetsiifilise disainiga. See m\u00f5isted on seotud domeenimudeli osaga, kus k\u00f5ik termini on \u00fcheselt m\u00e4\u00e4ratletud. Vaadakem n\u00e4iteks kindlustuste ja arvete konteksti. Meil on monoliitne rakendus, kus on vaja kindlustustes t\u00f6\u00f6tada arvega. Me eeldame, et arendaja leiab teisest komplektist olemasoleva klassi \u201eArve\u201c, seob selle klassiga \u201eKindlustus\u201c ning me saame t\u00f6\u00f6tava koodi. DRY printsiip on j\u00e4rgitud, \u00fclesanne l\u00e4heb olemasoleva koodi kasutamise t\u00f5ttu kiiremini t\u00e4idetud.<\/p>\n<p>Tulemuseks selgub, et arvete ja kindlustuste kontekstid on omavahel seotud. Kui tulevad uued n\u00f5udmised, siis see seos takistab arendust, suurendades juba niigi keerulise \u00e4riloogika keerukust. Selle probleemi lahendamiseks tuleb koodis leida piirid kontekstide vahel ja eemaldada nende rikkumised. N\u00e4iteks v\u00f5ib kindlustuste konteksti jaoks olla piisav 20-kohaline arve number ja arve avamise kuup\u00e4ev. <\/p>\n<p>Ette eristada neid piiratud kontekste \u00fcksteisest ja alustada mikroteenuste eraldamise protsessi monoliitsest lahendusest, kasutasime l\u00e4henemist, mis h\u00f5lmas v\u00e4list API loomist rakenduse sees. Kui me teadsime, et m\u00f5ni moodul peab muutuma mikroteenuseks, muudetakse seda protsessi raames, tegime me kohe v\u00e4ljakutseid sellele loogikale, mis kuulub teise piiratud konteksti, l\u00e4bi v\u00e4liste k\u00f5nede. N\u00e4iteks REST-i v\u00f5i WCF kaudu.<\/p>\n<p>Oleme endale kindlalt otsustanud, et ei v\u00e4ldi koodi, mis n\u00f5uab jaotatud tehingute tegemist. Meie puhul osutus selle reegli j\u00e4rgimine piisavalt lihtsaks. Meie jaoks ei ole kunagi tekkinud olukordi, kus ranged jaotatud tehingud oleksid t\u00f5eliselt vajalikud - moodulite vahelise l\u00f5ppkoosk\u00f5la tagamine on t\u00e4iesti piisav.<\/p>\n<p>Vaatame \u00fchte konkreetset n\u00e4idet. Meil on orkestrite m\u00f5isted \u2014 konveier, mis t\u00f6\u00f6tleb \"taotluse\" objekti. See loob j\u00e4rjestikku kliendi, konto ja pangakaardi. Kui klient ja konto on edukalt loodud, kuid kaardi loomine eba\u00f5nnestub, ei muutu taotlus staatuseks \"edukalt\" ja j\u00e4\u00e4b staatuseks \"kaart ei ole loodud\". Tulevikus l\u00f5pus\u00fcsteem haarab selle ja l\u00f5petab selle. S\u00fcsteem on m\u00f5nda aega ebak\u00f5las, kuid see meid \u00fcldiselt rahuldab.<\/p>\n<p>Kui siiski tekib olukord, kus tuleb koosolekuks osa andmeid salvestada, peame t\u00f5en\u00e4oliselt minema teenuse suuremaks koondamiseks, et seda \u00fches protsessis t\u00f6\u00f6delda. <\/p>\n<p>Vaatame mikroteenuse eraldamise n\u00e4idet. Kuidas saaksime seda suhteliselt ohutult tootmisse viia? Selles n\u00e4ites on meil s\u00fcsteemi eraldi osa \u2014 palgahalduse moodul, mille koodist soovime osa muuta mikroteenuseks.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcleminek monoliidilt mikroteenustele: ajalugu ja praktika\" src=\"\/wp-content\/uploads\/2019\/07\/346af271b0c3f99897d330e56f713f18.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEsiteks loome mikroteenuse, kirjutades koodi \u00fcmber. Parandame m\u00f5ned detailid, mis meid mitte rahuldatud. Rakendame uusi \u00e4rianal\u00fc\u00fcse kliendi poolt. Lisame \u00fchendusse UI ja tagaplaani vahel API Gateway, mis tagab k\u00f5nede edastamise. <\/p>\n<p><img decoding=\"async\" alt=\"\u00dcleminek monoliidilt mikroteenustele: ajalugu ja praktika\" src=\"\/wp-content\/uploads\/2019\/07\/bec8d68f20f3ec53af0cef225a51c2b3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSeej\u00e4rel juurutame selle konfiguratsiooni tootmisse, kuid pilootseisundis. Enamik meie kasutajatest j\u00e4tkab endiselt t\u00f6\u00f6tlust vanade \u00e4riprotsesside kaudu. Uute kasutajate jaoks arendame v\u00e4lja uue versiooni monoliitset rakendust, mis seda protsessi enam ei sisalda. Tegelikult toimib meil pilootina monoliidi ja mikroteenuse kombinatsioon.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcleminek monoliidilt mikroteenustele: ajalugu ja praktika\" src=\"\/wp-content\/uploads\/2019\/07\/27e98812746bb7f142fa3a3c3a03b52f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEduka piloodi korral m\u00f5istame, et uus konfiguratsioon on t\u00f5eliselt toimiv ning saame vanade monoliite tasakaalust eemaldada ja j\u00e4tta uue konfiguratsiooni vana lahenduse kohale.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcleminek monoliidilt mikroteenustele: ajalugu ja praktika\" src=\"\/wp-content\/uploads\/2019\/07\/11dcf1d771b57d3921c0aa91b82646e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKokkuv\u00f5ttes kasutame praktiliselt k\u00f5iki olemasolevaid meetodeid monoliitse l\u00e4htekoodi jagamiseks. K\u00f5ik need v\u00f5imaldavad meil v\u00e4hendada rakenduse osi ja viia need uutele raamatukogudele, tagades kvaliteetsemat l\u00e4htekoodi.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"9\"><\/a><\/noindex><b><\/p>\n<h3>T\u00f6\u00f6 andmebaasiga<\/h3>\n<p><\/b><br \/>\nAndmed ei jagune nii h\u00e4sti nagu l\u00e4htekood, kuna need sisaldavad mitte ainult praegust skeemi, vaid ka kogunenud ajaloolisi andmeid.<\/p>\n<p>Meie andmebaasil, nagu paljudel teistel, oli veel \u00fcks oluline puudus \u2014 tohutu suurus. Seda andmebaasi kavandati segase monoliidi \u00e4ri loogika j\u00e4\u00e4giga, ja erinevate piiratud kontekstide tabelite vahel tekkisid seosed.<\/p>\n<p>Meie puhul, lisaks k\u00f5igile muredele (suur andmebaas, hulk seoseid, m\u00f5nikord arusaamatud piirid tabelite vahel), tekkis probleem, millega paljudes suurtes projektides kokku puututakse: jagatud andmebaasi mustri kasutamine. Andmed v\u00f5eti tabelitest vaate kaudu, replikatsiooniga ja saadetud teistesse s\u00fcsteemidesse, kus seda replikatsiooni vajati. Tulemuseks oli see, et me ei saanud tabeleid eraldi skeemi viia, sest neid kasutati aktiivselt.<\/p>\n<p>Jagamisel aitab meid just see piiramine, mis koodis olemas on. See annab tavaliselt meile piisavalt hea \u00fclevaate sellest, kuidas me jagame andmeid andmebaasi tasandil. Me m\u00f5istame, millised tabelid kuuluvad \u00fchte piiratud konteksti ja millised teise.<\/p>\n<p>Oleme rakendanud kahte globaalselt meetodit andmebaasi eraldamiseks: olemasolevate tabelite eraldamine ja eraldamine \u00fcmberehitamisega.<\/p>\n<p>Olemasolevate tabelite eraldamine on meetod, mida on hea rakendada, kui andmestruktuur on kvaliteetne, rahuldab \u00e4rianal\u00fc\u00fcse ning k\u00f5ik on sellega rahul. Sel juhul saame olemasolevad tabelid eraldada eraldi skeemiks.<\/p>\n<p>Eraldamine \u00fcmberehitamisega on vajalik, kui \u00e4ri mudel on oluliselt muutunud ja tabelid ei rahulda meid enam \u00fcldse.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"10\"><\/a><\/noindex><b>Olemasolevate tabelite eraldamine.<\/b> Peame m\u00e4\u00e4rama, mida me eraldame. Ilma selle teadmisega ei saa midagi saavutada, ja siin aitab meid koodi piiratud konteksti eraldamine. Reeglina, kui suudame m\u00f5ista konteksti piire algkoodis, saame aru, millised tabelid peaksid eraldamist saama.<\/p>\n<p>Kujutage ette lahendust, kus kaks monoliidi moodulit suhtlevad \u00fche andmebaasiga. Me peame tagama, et eraldatavate tabelite osaga suudleb ainult \u00fcks moodul, samas kui teine hakkab sellega suhtlema API kaudu. Esialgu piisab, kui API kaudu toimub ainult kirjutamine. See on h\u00e4davajalik tingimus, et saaksime r\u00e4\u00e4kida mikroteenuste s\u00f5ltumatusest. Lugemise seosed v\u00f5ivad j\u00e4\u00e4da, kuni see ei tekita suurt probleemi.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcleminek monoliidilt mikroteenustele: ajalugu ja praktika\" src=\"\/wp-content\/uploads\/2019\/07\/1602637ad752ac055f475cfa45d95e95.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJ\u00e4rgmise sammuna saame juba koodiosa, mis t\u00f6\u00f6tab eraldatavate tabelitega, koos v\u00f5i ilma \u00fcmber t\u00f6\u00f6tamiseta, eraldi mikroteenuseks eraldada ja k\u00e4ivitada eraldi protsessis, konteineris. See on eraldi teenus, millel on seos monoliidi andmebaasiga ja nende tabelitega, mis ei kuulu otseselt tema alla. Monoliit suhtleb endiselt lugemise kaudu eraldatud osaga. <\/p>\n<p><img decoding=\"async\" alt=\"\u00dcleminek monoliidilt mikroteenustele: ajalugu ja praktika\" src=\"\/wp-content\/uploads\/2019\/07\/36011f4e6be4f6a2f19f2f074b645dcb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHiljem eemaldame selle seose, mille puhul ka monoliidi rakenduse andmete lugemine eraldatavatest tabelitest viiakse API peale.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcleminek monoliidilt mikroteenustele: ajalugu ja praktika\" src=\"\/wp-content\/uploads\/2019\/07\/290f91bbfccac2a4b384078e4cf4e337.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEemaldame esmalt peamisest andmebaasist tabelid, millega t\u00f6\u00f6tab ainult uus mikros\u00fcsteem. Me saame tabelid viia eraldi skeemi v\u00f5i isegi eraldi f\u00fc\u00fcsilisse andmebaasi. \u00dchendus lugemiseks mikros\u00fcsteemi ja monoliidi andmebaasi vahel j\u00e4\u00e4b, kuid selles pole midagi hullu; sellises konfiguratsioonis v\u00f5ib see piisavalt kaua t\u00f6\u00f6tada.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcleminek monoliidilt mikroteenustele: ajalugu ja praktika\" src=\"\/wp-content\/uploads\/2019\/07\/ab947ac6a38ffbccd4e2b51103aef609.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nViimane samm on k\u00f5ik sidemed t\u00e4ielikult eemaldada. Sel juhul v\u00f5ib meil olla vajalik andmete migreerimine peamisest andmebaasist. M\u00f5nikord tahame taaskasutada m\u00f5ningaid v\u00e4lisosistest s\u00fcsteemidest replikatsioone, v\u00f5i katalooge mitmes andmebaasis. See juhtub meil perioodiliselt.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcleminek monoliidilt mikroteenustele: ajalugu ja praktika\" src=\"\/wp-content\/uploads\/2019\/07\/f40cf17dd56b9575751e370c44f08344.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<noindex><a rel=\"nofollow\" name=\"11\"><\/a><\/noindex><b>Eraldamine koos t\u00f6\u00f6tlemisega.<\/b> See meetod on v\u00e4ga sarnane esimesele, ainult et see toimub vastupidises j\u00e4rjestuses. Meil \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f kohe uus andmebaas ja uus mikros\u00fcsteem, mis suhtleb monoliidiga API kaudu. Kuid selle juurde j\u00e4\u00e4b andmebaasi tabelite kogum, mille tahame tulevikus eemaldada. Me ei vaja seda enam, uues mudelis asendasime selle.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcleminek monoliidilt mikroteenustele: ajalugu ja praktika\" src=\"\/wp-content\/uploads\/2019\/07\/c94932033e47cfa1fd56595ab9a19246.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSelle skeemi toimimiseks vajame ilmselt \u00fcleminekuperioodi.<\/p>\n<p>Edasi on kaks v\u00f5imalikku l\u00e4henemist.<\/p>\n<p><b>Esimene<\/b>: me dublime k\u00f5ik andmed uutes ja vanades andmebaasides. Sellisel juhul tekib meil andmete \u00fclepakkumine, mis v\u00f5ib p\u00f5hjustada s\u00fcnkroonimisprobleeme. Kuid saame siiski v\u00f5tta kaks erinevat klienti. \u00dcks t\u00f6\u00f6tab uue versiooniga, teine vanaga.<\/p>\n<p><b>Teine<\/b>: jagame andmeid mingite \u00e4ri tunnuste j\u00e4rgi. N\u00e4iteks, meil oli s\u00fcsteemis 5 toodet, mis on salvestatud vanasse andmebaasi. Kuues toode uue \u00e4riprojekti raames paigutatakse uude andmebaasi. Kuid meil on vaja API Gateway't, mis s\u00fcnkroonib need andmed ja n\u00e4itab kliendile, kust ja mida v\u00f5tta.<\/p>\n<p>M\u00f5lemad l\u00e4henemised on t\u00f6\u00f6tavad, valige vastavalt olukorrale.<\/p>\n<p>P\u00e4rast seda, kui kinnitame, et k\u00f5ik t\u00f6\u00f6tab, saab osa monoliidist, mis t\u00f6\u00f6tab vanade andmebaasi struktuuridega, v\u00e4lja l\u00fclitada. <\/p>\n<p><img decoding=\"async\" alt=\"\u00dcleminek monoliidilt mikroteenustele: ajalugu ja praktika\" src=\"\/wp-content\/uploads\/2019\/07\/973bf5015bdf49a290a5b901f89628cc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nViimase sammuna on vana andmestruktuuri eemaldamine. <\/p>\n<p><img decoding=\"async\" alt=\"\u00dcleminek monoliidilt mikroteenustele: ajalugu ja praktika\" src=\"\/wp-content\/uploads\/2019\/07\/fe83acc07077b7eb3717138e3c20c005.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKokkuv\u00f5tteks v\u00f5ib \u00f6elda, et meil on andmebaasidega probleeme: keeruline on nendega t\u00f6\u00f6tada v\u00f5rreldes l\u00e4htekoodiga, jagamine on keerulisem, kuid seda saab ja tuleb teha. Oleme leidnud m\u00f5ned viisid, mis v\u00f5imaldavad seda teha piisavalt turvaliselt; siiski andmete osas on viga lihtsam teha kui l\u00e4htekoodiga. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"12\"><\/a><\/noindex><b><\/p>\n<h3>T\u00f6\u00f6 l\u00e4htekoodiga<\/h3>\n<p><\/b><br \/>\nNii n\u00e4gi algkoodi skeem v\u00e4lja, kui hakkasime monoliitset projekti anal\u00fc\u00fcsima.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcleminek monoliidilt mikroteenustele: ajalugu ja praktika\" src=\"\/wp-content\/uploads\/2019\/07\/a6d886e37117ccf8f63106d6616aa653.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSeda saab tinglikult jagada kolmeks kihiks. See on k\u00e4ivitavate moodulite, pistikute, teenuste ja eraldi tegevuste kiht. Tegelikult olid need sissep\u00e4\u00e4supunktid monoliitses lahenduses. K\u00f5ik need olid tihedalt seotud Common kihiga. Selles oli \u00e4riloogika, mida teenused kasutasid \u00fchiselt, ning palju seoseid. Iga teenus ja pistikupesa kasutas kuni 10 ja enam common-kogumit, olenevalt nende suurusest ja arendajate aususest.<\/p>\n<p>Meil oli \u00f5nne, meil olid infrastruktuuri raamatukogud, mida sai kasutada eraldi. <\/p>\n<p>M\u00f5nikord juhtus, et m\u00f5ned Common-objektid ei kuulunud tegelikult sellesse kihti, vaid olid infrastruktuuri raamatukogud. See lahendati \u00fcmbernimetamisega.<\/p>\n<p>K\u00f5ige enam tekitas muret piiratud kontekstid. M\u00f5nikord segunesid 3-4 konteksti \u00fches Common'i kogus ja kasutasid \u00fcksteist sama \u00e4rifunktsiooni raames. Oli vajalik m\u00f5ista, kus on need v\u00f5imalikud eraldada ja milliste piiride j\u00e4rgi, ning mida edasi teha selle eraldamise kaardistamisega l\u00e4htekoodi kogudele.<\/p>\n<p>Me koostasime m\u00f5ned reeglid koodi jagamise protsessiks.<\/p>\n<p><b>Esimene<\/b>: me enamorado de la idea de no querer compartir la l\u00f3gica de negocios entre servicios, actividades y plugins. Quer\u00edamos hacer que la l\u00f3gica de negocios fuera independiente dentro de los microservicios. Por otro lado, los microservicios, en un escenario ideal, se perciben como servicios que existen completamente de forma independiente. Creo que este enfoque es algo derrochador y dif\u00edcil de alcanzar, ya que, por ejemplo, los servicios en C# estar\u00e1n siempre conectados a la biblioteca est\u00e1ndar. Nuestro sistema est\u00e1 escrito en C#, otras tecnolog\u00edas a\u00fan no se han utilizado. Por lo tanto, decidimos que pod\u00edamos permitirnos usar compilaciones t\u00e9cnicas comunes. Lo principal es que no contengan fragmentos de l\u00f3gica de negocios. Si tienes un envoltorio conveniente sobre la ORM que utilizas, copiarlo de un servicio a otro es muy costoso.<\/p>\n<p>Meie meeskond on asjatundjate erialase disaini f\u00e4nn, seet\u00f5ttu sobis meile suurep\u00e4raselt \"sibulaarhitektuur\". Meie teenuste aluseks ei ole data access layer, vaid domeeniloogikaga koostamine, mis sisaldab ainult \u00e4riloogikat ja on vabastatud infrastruktuuri seosest. Samuti saame me domeenikoostist iseseisvalt t\u00e4iendada raamistikest tulenevate probleemide lahendamiseks.<\/p>\n<p>Sel hetkel kohtasime esmakordselt t\u00f5sist probleemi. Teenus pidi viitama \u00fchele domeenikogule, loogika soovisime teha s\u00f5ltumatuks, ja DRY p\u00f5him\u00f5te segas meid tugevalt. Arendajad soovisid v\u00e4ltida dubleerimist, kasutades naaberkogude klasse, ja tulemuseks hakkasid domeenid j\u00e4lle omavahel siduma. Anal\u00fc\u00fcsisime tulemusi ja otsustasime, et probleem v\u00f5ib olla seotud ka l\u00e4htekoodi hoidlaga. Meil oli suur repoid, kus asusid k\u00f5ik l\u00e4htekoodid. Projekti lahendust oli v\u00e4ga keeruline kohalikult masinal kokku panna. Seet\u00f5ttu loodi projekti osade jaoks eraldi v\u00e4iksed lahendused, ja keegi ei pidanud keelama neid lisada m\u00f5nda \u00fchiskogusse v\u00f5i domeenikogusse ja seda uuesti kasutada. Ainsaks t\u00f6\u00f6riistaks, mis ei lubanud meil seda teha, oli koodivaatlus. Kuid m\u00f5nikord andis ka see t\u00f5rkeid.<\/p>\n<p>Seega hakkasime liikuma eraldi hoidlate mudeli suunas. \u00c4ri loogika ei voolanud enam teenusest teenusesse, domeenid muutusid t\u00f5eliselt s\u00f5ltumatuks. Piiratud kontekste toetatakse selgemalt. Kuidas me samas infrastruktuuri raamatukogusid taaskasutame? Me eraldasime need eraldi hoidlasse, seej\u00e4rel panime need Nuget-pakettideks, mille panime Artifactory'sse. Iga muudatusega toimub ehitamine ja avaldamine automaatselt.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcleminek monoliidilt mikroteenustele: ajalugu ja praktika\" src=\"\/wp-content\/uploads\/2019\/07\/8ddbc750dc7c6d397a459acf7825de90.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMeie teenused hakkasid viitama sisemistele infrastruktuuri pakettidele t\u00e4pselt nagu v\u00e4limistele. V\u00e4limised raamatukogud laadime alla Nugetist. Artifactory'ga, kuhu me need paketid panime, t\u00f6\u00f6tamiseks kasutasime kahte paketihaldurit. V\u00e4ikestes hoidlates kasutasime samuti Nugetit. Mitme teenusega hoidlates kasutasime Paket'i, mis tagab suurema versioonide \u00fchtsuse moodulite vahel.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcleminek monoliidilt mikroteenustele: ajalugu ja praktika\" src=\"\/wp-content\/uploads\/2019\/07\/672a25a70a481bff68baebe963184ccd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNii et t\u00f6\u00f6tades l\u00e4htekoodiga, muutes veidi arhitektuuri ja eraldades hoidlaid, muudame oma teenused s\u00f5ltumatumaks.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"13\"><\/a><\/noindex><b><\/p>\n<h3>Infrastruktuuri probleemid<\/h3>\n<p><\/b><br \/>\nEnamik mikroteenustele \u00fclemineku probleemidest on seotud infrastruktuuriga. Teil on vaja automatiseeritud juurutamist ning uusi teeke, et infrastruktuur t\u00f6\u00f6taks.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"16\"><\/a><\/noindex><b>K\u00e4sitsi installimine keskkondadesse<\/b><\/p>\n<p>Esialgu paigaldasime lahendused keskkondadesse k\u00e4sitsi. Selle protsessi automatiseerimiseks l\u00f5ime CI\/CD torustiku. Valisime pideva tarnimise (continuous delivery) protsessi, kuna pidev juurutamine (continuous deployment) ei sobi meie \u00e4riprotsesside jaoks veel. Seet\u00f5ttu toimub juurutamine nupu vajutamisega, testimine aga automaatselt.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcleminek monoliidilt mikroteenustele: ajalugu ja praktika\" src=\"\/wp-content\/uploads\/2019\/07\/0fc092326a48813398c6f3a031197bab.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKasutame Atlassianit, Bitbucketit l\u00e4htekoodi hoidmiseks ja Bamboo't ehitamiseks. Meile meeldib kirjutada ehitusskripte Cake'is, kuna see on sama, mis C#. Artifactory'sse tulevad juba valmis paketid, ning Ansible saadetakse automaatselt testserveritesse, mille j\u00e4rel saab neid kohe testida.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcleminek monoliidilt mikroteenustele: ajalugu ja praktika\" src=\"\/wp-content\/uploads\/2019\/07\/fcc743cfaa4a24b906ceeb40ec1ba0a0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<noindex><a rel=\"nofollow\" name=\"14\"><\/a><\/noindex><b><\/p>\n<h3>Erinev logimine<\/h3>\n<p><\/b><br \/>\nOma ajal oli monoliidi ideedest \u00fcks \u00fchise logimise tagamine. Me pidime ka aru saama, mida teha eraldi logidega, mis on kettale salvestatud. Logid meie juures kirjutatakse tekstifailidesse. Otsustasime kasutada standardset ELK-steki. Me ei hakanud logima otse ELK-sse teenusepakkujate kaudu, vaid otsustasime, et t\u00e4iustame tekstiloge ja salvestame neisse j\u00e4lgimise ID identifikaatorina, lisades teenuse nime, et neid logisid hiljem saaks anal\u00fc\u00fcsida.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcleminek monoliidilt mikroteenustele: ajalugu ja praktika\" src=\"\/wp-content\/uploads\/2019\/07\/8e58c66ac134e65abe34b59939f31483.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nFilebeati abil saame v\u00f5imaluse koguda meie logisid <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/et\/server\/\"   title=\"serverite\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"1338\">serverite<\/a>, seej\u00e4rel neid muuta, kasutada Kibanat p\u00e4ringute loomiseks kasutajaliideses ja vaadata, kuidas teenuste vahel kutsumine toimus. Selle juures aitab ID j\u00e4lgimine suuresti.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"15\"><\/a><\/noindex><b><\/p>\n<h3>Seotud teenuste testimine ja silumine<\/h3>\n<p><\/b><br \/>\nAlguses ei olnud meil t\u00e4pselt arusaamist, kuidas arendatavaid teenuseid siluda. Monoliidiga oli k\u00f5ik lihtne, k\u00e4ivitasime selle kohalikel masinatel. Alguses proovisime sama teha ka mikroteenustega, kuid m\u00f5nikord on \u00fche mikroteenuse t\u00e4ielikuks k\u00e4ivitamiseks vajalik k\u00e4ivitada ka mitu muud teenust, mis on ebamugav. Me m\u00f5istsime, et on vajalik liikuda mudelile, kus j\u00e4tame kohalikele masinatele ainult teenuse v\u00f5i teenused, mida soovime siluda. \u00dclej\u00e4\u00e4nud teenuseid kasutatakse serveritest, mis vastavad tootmise konfiguratsioonile. P\u00e4rast silumist, testimise k\u00e4igus, v\u00e4ljastatakse testimise serverile ainult muudetud teenused iga \u00fclesande jaoks. Nii testitakse lahendust sellises vormis, nagu see tulevikus tootmises olema hakkab.<\/p>\n<p>On serverid, millel on ainult teenuste tootmisversioonid. Need serverid on vajalikud intsidentide puhul, tarnimise kontrollimise jaoks enne juurutamist ja sisemiste koolituste jaoks.<\/p>\n<p>Meil on lisandunud automaatse testimise protsess, kasutades populaarset Specflow teeki. Testid k\u00e4ivitatakse automaatselt NUnit'i abil kohe p\u00e4rast juurutamist Ansible'ist. Kui \u00fclesande katmine on t\u00e4ielikult automaatne, pole k\u00e4sitsi testimist vaja. Kuigi m\u00f5nikord on siiski vajalik t\u00e4iendav k\u00e4sitsi testimine. Teatud \u00fclesande jaoks k\u00e4ivitatavate testide m\u00e4\u00e4ratlemiseks kasutame Jira sildiaid.<\/p>\n<p>T\u00e4iendavalt on suurenenud vajadus koormustestimise j\u00e4rele, mida varem viidi l\u00e4bi vaid harvadel juhtudel. Testide k\u00e4ivitamiseks kasutame JMeter'i, nende s\u00e4ilitamiseks InfluxDB-d ning protsessi graafikute koostamiseks Grafana't.<\/p>\n<p><b><\/p>\n<h3>Mida me saavutasime?<\/h3>\n<p><\/b><br \/>\nEsiteks oleme vabanenud m\u00f5isted 'vabastamine'. Kaks kuud kestnud monstruehivad vabastamised, mil see hiiglane juurutati tootmisotsustesse, katkestades ajutiselt \u00e4ri protsessid, on kadunud. N\u00fc\u00fcd juurutame teenuseid keskmiselt iga 1,5 p\u00e4eva tagant, koondades neid, kuna nad l\u00e4hevad kasutusele p\u00e4rast koosk\u00f5lastamist.<\/p>\n<p>Meie s\u00fcsteemis ei esine kriitilisi rikkeid. Kui me v\u00e4ljastame mikroteenuse veaga, siis seonduv funktsionaalsus l\u00f5petab t\u00f6\u00f6, kuid \u00fclej\u00e4\u00e4nud funktsionaalsus ei kahjustu. See parandab tunduvalt kasutajakogemust.<\/p>\n<p>Me saame hallata juurutamise skeemi. Saame eraldada teenuste grupid eraldi \u00fclej\u00e4\u00e4nud lahendusest, kui see on vajalik.<\/p>\n<p>Lisaks oleme oluliselt v\u00e4hendanud suurt muudatusprotsesside j\u00e4rjekorda. Meil on tekkinud eraldi tootmismeeskonnad, mis t\u00f6\u00f6tavad osa teenustega s\u00f5ltumatult. Siin sobib juba h\u00e4sti Scrum-protsess. Konkreetse meeskonna v\u00f5ib omada eraldi tooteomanik, kes seab neile \u00fclesandeid. <\/p>\n<p><b><\/p>\n<h3>Kokkuv\u00f5te<\/h3>\n<p><\/b><\/p>\n<ul>\n<li>Mikroteenused sobivad h\u00e4sti keeruliste s\u00fcsteemide dekomponeerimiseks. Protsessi k\u00e4igus hakkame aru saama, mis meie s\u00fcsteemis on, millised piiratud kontekstid esinevad ja kus nende piirid asuvad. See v\u00f5imaldab \u00f5igesti jaotada muudatused moodulite l\u00f5ikes, v\u00e4ltides samas koodi segadusseminemist. <\/li>\n<li>Mikroteenused pakuvad organisatsioonilisi eeliseid. Nendest r\u00e4\u00e4gitakse sageli ainult arhitektuurina, kuid iga arhitektuur on vajalik \u00e4ri vajaduste rahuldamiseks, mitte iseenesest. Seet\u00f5ttu v\u00f5ime \u00f6elda, et mikroteenused sobivad h\u00e4sti v\u00e4ikeste meeskondade \u00fclesannete lahendamiseks, arvestades, et Scrum on praegu v\u00e4ga populaarne.<\/li>\n<li>Jagamine on iteratiivne protsess. Ei saa v\u00f5tta rakendust ja lihtsalt jagada seda mikroteenusteks. Tootest, mis nii saadakse, on v\u00e4ga v\u00e4he t\u00f5en\u00e4olist, et see t\u00f6\u00f6tab. Mikroteenuste eraldamisel on kasulik olemasolev p\u00e4rand \u00fcmber kirjutada, muutes selle koodiks, mis meile meeldib ja mis paremini rahuldab \u00e4ri vajadusi funktsionaalsuse ja kiirusel.\n<p><i>V\u00e4ike ettevaatus:<\/i> Mikroteenuste kasutuselev\u00f5tmise kulud on piisavalt suured. Ainult infrastruktuuriprobleemide lahendamiseks kulus palju aega. Seet\u00f5ttu, kui teil on v\u00e4ike rakendus, mis ei vaja spetsiifilist skaleerimist, ega ole palju kliente, kes konkureerivad teie meeskonna t\u00e4helepanu ja aja nimel, siis v\u00f5ib-olla ei ole mikroteenused t\u00e4na teie jaoks vajalikud. See on \u00fcsna kulukas. Kui alustada protsessi mikroteenustega, on algkulud suuremad kui sama projekti alustamine monoliidi arendamisega. <\/p>\n<p>P.S. Veel emotsionaalsem jutustus (nagu isiklikult teile) \u2013 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=qTNbx18DzpQ\">lingi kaudu<\/a><\/noindex>. <br \/>\nSiin on ettekande t\u00e4isversioon.<\/li>\n<\/ul>\n<p>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/raiffeisenbank\/blog\/458404\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u0440\u043e\u0435\u043a\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u0441\u044f \u0438\u0437 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u0430 \u0432 \u043d\u0430\u0431\u043e\u0440 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u041f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u0447\u0430\u043b \u0441\u0432\u043e\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u0430\u0432\u043d\u043e, \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 2000. \u041f\u0435\u0440\u0432\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u044b\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 Visual Basic 6. \u0421 \u0442\u0435\u0447\u0435\u043d\u0438\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0442\u0430\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043d\u0430 \u044d\u0442\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a IDE [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":26858,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-35906","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u0440\u043e\u0435\u043a\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u0441\u044f \u0438\u0437 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u0430 \u0432 \u043d\u0430\u0431\u043e\u0440 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u041f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u0447\u0430\u043b \u0441\u0432\u043e\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u0430\u0432\u043d\u043e, \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 2000. \u041f\u0435\u0440\u0432\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u044b\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 Visual Basic 6. \u0421 \u0442\u0435\u0447\u0435\u043d\u0438\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0442\u0430\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043d\u0430 \u044d\u0442\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a IDE\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/perehod-ot-monolita-k-mikroservisam-istoriya-i-praktika\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043e\u0442 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u0430 \u043a \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c: \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u0440\u043e\u0435\u043a\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u0441\u044f \u0438\u0437 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u0430 \u0432 \u043d\u0430\u0431\u043e\u0440 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u041f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u0447\u0430\u043b \u0441\u0432\u043e\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u0430\u0432\u043d\u043e, \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 2000. \u041f\u0435\u0440\u0432\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u044b\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 Visual Basic 6. \u0421 \u0442\u0435\u0447\u0435\u043d\u0438\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0442\u0430\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043d\u0430 \u044d\u0442\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a IDE\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/perehod-ot-monolita-k-mikroservisam-istoriya-i-praktika\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:07:29+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:07:29+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47 \u00dcleminek monoliidilt mikroteenustele: lugu ja praktika | ProHoster","description":"Selles artiklis r\u00e4\u00e4gin sellest, kuidas projekt, milles t\u00f6\u00f6tan, muutus suurest monoliidist mikroteenuste kogumiks. Projekt alustas oma lugu \u00fcsna ammu, 2000. aastate alguses. Esimesed versioonid olid kirjutatud Visual Basic 6. Aja jooksul sai selgeks, et sellel keelel arendamine saab tulevikus olema keeruline.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/perehod-ot-monolita-k-mikroservisam-istoriya-i-praktika","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043e\u0442 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u0430 \u043a \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c: \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 | ProHoster","og:description":"\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u0440\u043e\u0435\u043a\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u0441\u044f \u0438\u0437 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u0430 \u0432 \u043d\u0430\u0431\u043e\u0440 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u041f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u0447\u0430\u043b \u0441\u0432\u043e\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u0430\u0432\u043d\u043e, \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 2000. \u041f\u0435\u0440\u0432\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u044b\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 Visual Basic 6. \u0421 \u0442\u0435\u0447\u0435\u043d\u0438\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0442\u0430\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043d\u0430 \u044d\u0442\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a IDE","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/perehod-ot-monolita-k-mikroservisam-istoriya-i-praktika","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:07:29+00:00","article:modified_time":"2019-10-31T19:07:29+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35906","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-02-09 17:04:56","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:54:38","updated":"2026-02-09 17:04:56"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/35906","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=35906"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/35906\/revisions"}],"predecessor-version":[{"id":158582,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/35906\/revisions\/158582"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/26858"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=35906"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=35906"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=35906"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}