19. september Moskvast esimene teemaĂŒritus HUG (Highload++ User Group), mis oli pĂŒhendatud mikroteenustele. Seal kĂ”las ettekande pealkirjaga âMikroteenuste haldamine: suurusel on tĂ€htsus, isegi kui teil on Kubernetesâ, kus jagasime ettevĂ”tte âFlantâ ulatuslikku kogemust mikroteenustega arendatud projektide haldamisel. EelkĂ”ige on see kasulik kĂ”igile arendajatele, kes mĂ”tlevad selle lĂ€henemise kasutamisele oma kĂ€esolevates vĂ”i tulevastes projektides.

Tutvustame (50 minutit, palju informatiivsem kui artikkel), samuti pÔhijooned selle kohta kirjalikus vormis.
NB: Video ja esitlus on saadaval ka selle publikatsiooni lÔpus.
Sissejuhatus
Tavaliselt on hea lugu, millel on sissejuhatus, pÔhijutt ja lÔpplahendus. See ettekande sarnaneb rohkem sissejuhatusele, ja mis peamine, traagilisele. Oluline on mainida, et selles esitatud vaade mikroteenustele on poolteist lekke.
Alustan sellise graafikuga, mille autor on (2015. aastal) Martin Fowler:

Graafikust on nÀha, et monoliitne rakendus, kui see jÔuab teatud suuruseni, hakkab tÔhusus kahanema. Mikroteenused eristuvad selle poolest, et nende algne tÔhusus on madalam, kuid keerukuse suurenedes ei ole nende efektiivsuse langus nii mÀrgatav.
TĂ€iendame seda graafikut Kubernetes'i kasutamise puhul:

Miks muutus mikroteenustega rakenduse jaoks paremaks? Sest see arhitektuur seab tĂ”siseid nĂ”udmisi arhitektuurile, mis omakorda katab suurepĂ€raselt Kubernetes'i vĂ”imalused. Teiselt poolt, osa sellest funktsionaalsusest on kasulik ka monoliidile, eriti seetĂ”ttu, et tĂŒĂŒpiline tĂ€napĂ€eva monoliit ei ole pĂ€ris monoliit (detailid tulevad edasi ettekandes).
Nagu nÀha, ei erine lÔpp-graafik (kui nii monoliitne kui mikroteenustele rakendused on Kubernetes'i infrastruktuuris) oluliselt algsest. Edasi on juttu rakendustest, mida hallatakse Kubernetes'i abil.
Kasulik ja kahjulik mikroteenuste sĂŒsteem
Ja siin on peamine mÔte:

Mis siis ikkagi on normaalne mikroteenuste arhitektuur? See peaks tooma teile tÔelist kasu, suurendades töö efektiivsust. Kui naasta graafiku juurde, siis siin see on:

Kui nimetada seda kasulikuks, siis graafiku teisel poolel on kahjulik mikroteenuste sĂŒsteem (töötamist takistav):

Tulek tagasi peamise mĂ”tte juurde: kas tasub ĂŒldse usaldada minu kogemust? KĂ€esoleva aasta algusest olen vaadanud 85 projekti. Mitte kĂ”ik need ei olnud mikroteenustel baseeruvad (sellise arhitektuuriga oli umbes kolmandik kuni pooled neist), kuid see on ikkagi suur number. Meie (ettevĂ”te âFlantâ) saame vĂ€liseid teenusepakkujatena nĂ€ha laia valikut rakendusi, mida arendavad nii vĂ€ikesed firmad (5 arendajat) kui ka suured (~500 arendajat). TĂ€iendav pluss on see, et nĂ€eme, kuidas need rakendused elavad ja arenevad lĂ€bi aastate.
Miks mikroteenused?
KĂŒsimusele mikroteenuste kasulikkuse kohta on juba mainitud Martin Fowlerilt:
- selged modulaarsete piiride mÀÀratlemised;
- iseseisev juurutamine;
- tehnoloogiate vabadus.
Olen palju rÀÀkinud arhitektide ja tarkvaraarendajatega ning kĂŒsinud, miks neile mikroteenused vajalikud on. Ja koostasin oma ootuste nimekirja. Siin on, mis vĂ€lja tuli:

Kui kirjeldada âtundeâ kaudu mĂ”ningaid punkte, siis:
- selged moodulipiirded: meil on hirmus monoliit, aga nĂŒĂŒd on kĂ”ik korralikult laiali jagatud Git-repositooriatesse, kus kĂ”ik on âriiulitelâ, mitte segamini soojaga pehmest;
- iseseisev juurutamine: saame teenuseid iseseisvalt vÀlja anda, et arendamine kÀiks kiiremini (paralleelselt uusi funktsioone avaldades);
- arendamise sĂ”ltumatud: saame anda selle mikroteenuse ĂŒhele meeskonnale/arendajale, ja teise â teisele, mis vĂ”imaldab meil kiiremini arendada;
- bilotkasuurem usaldusvÀÀrsus: kui juhtub osaline halvenemine (kukub ĂŒks mikroteenus 20st), siis lakkab töötamast vaid ĂŒks nupp, samas sĂŒsteem tervikuna jĂ€tkab toimimist.
TĂŒĂŒpiline (kahjulik) mikroteenuste arhitektuur
Kuna selgitada, miks tegelikkuses ei ole kÔik nii, nagu me ootame, esitan kogutud pildi mikroteenuste arhitektuurist, mis pÔhineb kogemustel paljusid erinevaid projekte.
NÀiteks vÔib vÀlja tuua abstraktse veebipoe, mis plaanib konkureerida Amazoniga vÔi vÀhemalt OZONiga. Tema mikroteenuste arhitektuur nÀeb vÀlja jÀrgmine:

KokkuvÔtlikult on need mikroteenused kirjutatud erinevatesse platvormidesse:

Kuna igal mikroteenusel peab olema iseseisvus, vajab paljud neist oma andmebaasi ja vahemÀlu. LÔplik arhitektuur on jÀrgmine:

Millised on selle tagajÀrjed?
Fowler'il on selle kohta â «mikroteenuste» kasutamise «hind»:

Ja me vaatame, kas meie ootused on tÀidetud.
Selged moodulite piirid...
Aga kui palju mikroteenuseid peame tegelikult parandama, et muudatus vĂ€lja anda? Kas me suudame ĂŒldse aru saada, kuidas kĂ”ik töötab, ilma jaotamata jĂ€lgimiseta (sest iga pĂ€ringut töötleb pool mikroteenuseid)?
On olemas muster «», aga siin on see ĂŒldse saanud jaotatud tĂŒkikeseks. Selle kinnituseks â siin on umbkaudne illustreerimine, kuidas pĂ€ringud liiguvad:

Juhtimise iseseisus...
Töötatud vĂ€lja: me saame iga mikroteenuse eraldi vĂ€lja anda. Kuid praktikas tuleb arvestada, et igal ajal vĂ€ljastatakse mitmeid mikroteenuseid, ja peame arvestama nende vĂ€ljaandmise jĂ€rjekorda.Ideaalis tuleks meil ĂŒldse testida eraldi kontuuris, kas me vĂ€ljastame vĂ€ljaande Ă”igesti.
Tehnoloogia valimise vabadus...
See on olemas. Kuid tasub meeles pidada, et sageli piirneb vabadus ettearvamatusega. On vÀga oluline mitte valida tehnoloogiaid lihtsalt selleks, et nendega «mÀngida».
Arendamise iseseisus...
Kuidas luua testkontuur kogu rakenduse jaoks (nii paljude komponentide hulgast)? Ja selle sĂ€ilitamine ajakohasena. KĂ”ik see viib selleni, et reaalne testkontuuride arv, mida me ĂŒleĂŒldse saame hoida, osutub minimaalseteks..
Aga kuidas kÔik see kohapeal kÀivitada?.. Tundub, et sageli teeb arendaja oma tööd iseseisvalt, kuid «juhuslikult», kuna peab ootama, millal testimiskontuur vabaks saab.
Erinev skaleerimine...
Jah, kuid see on piiratud kasutatavate DBMS-ide valdkonnas. KÀsitletud arhitektuuri nÀites ei ole probleeme Cassandra's, kuid MySQL ja PostgreSQL puhul on need olemas.
Silotkauur usaldusvÀÀrsus...
Nagu selgub, rikub ĂŒhe mikroteenuse rike sageli kogu sĂŒsteemi nĂ”uetekohast toimimist; lisaks on olemas uus probleem: iga mikroteenuse rikkepunktide usaldusvÀÀrseks muutmine on vĂ€ga keeruline. Sest mikroteenustes kasutatakse erinevaid tehnoloogiaid (memcache, Redis jne), igaĂŒhe jaoks tuleb kĂ”ik hoolikalt lĂ€bi mĂ”elda ja rakendada, mis on muidugi vĂ”imalik, kuid vajab tohutult ressursse.
Koormuse mÔÔdetavusâŠ
Sellega on tÔesti kÔik hÀsti.
Mikroteenuste âkergeusksusââŠ
Meil on nĂŒĂŒd mitte ainult suured vĂ”rgukoormused (DNS-i ja muude taoliste pĂ€ringute suurenemine), vaid ka mitmete alam-pĂ€ringute tĂ”ttu oleme hakanud andmeid replikeerima (vahefailide talletamine), mis tĂ”i kaasa mĂ€rkimisvÀÀrse hulga salvestusmahtu.
Ja siin on meie ootuste tÀitmise tulemus:

Kuid see pole veel kÔik!
Sest:
- TÔenÀoliselt vajame me sÔnumite buss.
- Kuidas teha ajakohane varukoopia soovitud hetkel? Ainuke reaalne variant on liikluse peatamine. Aga kuidas seda teha tootmises?
- Kui rÀÀgime mitme piirkonna toetamisest, siis igaĂŒhes stabiilsuse tagamine on vĂ€ga töömahukas ĂŒlesanne.
- Kesksete muudatuste tegemise probleem kerkib esile. NĂ€iteks, kui peame PHP versiooni uuendama, siis tuleb teha commite igaĂŒhesse hoidlasse (neid on kĂŒmneid).
- Töötamise keerukuse kasv nÀib esmapilgul eksponentsiaalne.
Mida sellega kÔigega teha?
Alustage monoliitse rakendusega. Fowler'i kogemus kinnitab, et praktiliselt kĂ”ik edukad mikroteenuste rakendused algasid monoliidist, mis kasvas liiga suureks ja seejĂ€rel jagati. Samal ajal on praktiliselt kĂ”ik sĂŒsteemid, mis on algusest peale ehitatud mikroteenustena, varem vĂ”i hiljem tĂ”siste probleemidega silmitsi seisnud.
Veel ĂŒks vÀÀrtuslik mĂ”te on see, et mikroteenuste arhitektuuriga projekti edu jaoks peate vĂ€ga hĂ€sti tundma nii teemat kui ka mikroteenuste loomise protsessi.Ja parim viis teema tundmiseks on teha monoliit.
Aga mis teha, kui oleme juba sellesse olukorda sattunud?
Iga probleemi esimene samm on sellega leppida ja mÔista, et see on probleem; me ei soovi enam kannatada.
Kui oleme Ăleliia kasvanud monoliidi puhul (kui meie vĂ”imalused ressursse juurde osta on lĂ”ppenud) selle lĂ”hkumiseks, siis sel juhul on vastupidi: kui liigse mikroteenuse hulk ei aita enam, vaid segab â lĂ”igake ĂŒleliigne ja suursĂŒmme!
NĂ€iteks, arvestades eeltoodud nelja piltiâŠ
Vabanege kahtlastest mikroteenustest:

Kombineerige kÔik mikroteenused, mis vastutavad frontendi genereerimise eest:

âŠ ĂŒhe mikroteenuse, mis on kirjutatud ĂŒhes (kaasaegses ja normaalses, nagu te ise arvate) keeles/frameworkis:

Sel on ĂŒks ORM (ĂŒks andmebaas) ja alguses paar rakendust:

⊠aga tegelikult saab sinna viia palju rohkem, saavutades sellise tulemuse:

Kuberneteses kÀivitame kÔik need eraldi eksemplarid, seega saame endiselt mÔÔta koormust ja skalata neid eraldi.
KokkuvÔtteks
Vaadake suuremalt pilti. VĂ€ga sageli tekivad kĂ”ik need probleemid mikroteenustega seoses, kui keegi vĂ”tis oma ĂŒlesande, kuid soovis "mĂ€ngida mikroteenustega".
SÔnas "mikroteenused" on osa "mikro" liigne. Nad on "mikro" ainult seetÔttu, et nad on vÀiksemad kui tohutu monoliit. Kuid Àrge arvake, et nad on midagi vÀikest.
Ja viimase mÔtte jaoks naame esialgse graafiku juurde:

Kirjutatud mĂ€rkused selle juurde (ĂŒleval paremal) kokkuvĂ”ttes seisnevad selles, et teie projekti teostava meeskonna oskused on alati esmatĂ€htsad â just nemad mĂ€ngivad vĂ”tmerolli teie valikus mikroteenuste ja monoliidi vahel. Kui meeskonnal puuduvad oskused, kuid nad hakkavad looma mikroteenuseid, on lugu kindlasti saatuslik.
Videod ja slaidid
Esitlusvideo (~50 minutit; kahjuks ei edasta see kĂŒlastajate hulga emotsioone, mis mÀÀras konverentsi meeleolu, aga nii on see):

Ettekande esitlemine:
P.S.
Teised ettekanded meie blogis:
- «» (Dmitri Stoljarov; 28. mai 2018 RootConf'il);
- «» (Dmitri Stoljarov; 7. november 2017 HighLoad++'s);
- «» (Dmitri Stoljarov; 6. juuni 2017 RootConf'il);
- «» (Dmitri Stolyarov; 8. november 2016 HighLoad++-l);
- «» (Dmitri Stolyarov; 31. mai 2016 RootConfil).
TÔenÀoliselt huvitavad teid ka jÀrgmised publikatsioonid:
- «»;
- «»;
- «».
Allikas: habr.com
