19. september Moskvas esimene temaatiline HUG (Highload++ User Group) koosolek, mis oli pĂŒhendatud mikroteenustele. Seal esitleti ettekannet "Mikroteenuste kasutamine: suurus on oluline, isegi kui teil on Kubernetes", kus jagasime laialdast kogemust ettevĂ”ttest "Flant" mikroteenuste arhitektuuriga projektide kĂ€itamisel. See on eelkĂ”ige kasulik kĂ”igile arendajatele, kes mĂ”tlevad, kuidas seda lĂ€henemist oma praegustes vĂ”i tulevastes projektides rakendada.

Tutvustame (50 minutit, palju informatiivsem kui artikkel), samuti peamine kokkuvÔte tekstivormis.
NB: Video ja esitlus on samuti saadaval selle publitseerimise lÔpus.
Sissejuhatus
Tavaliselt sisaldab hea lugu sissejuhatust, pĂ”hijuttu ja lĂ”petust. See ettekande meenutab rohkem sissejuhatust, tĂ”si kĂŒll, traagilist. Samuti on oluline mĂ€rkida, et see esitab mikroteenustele vaatepunkti haavatavuse.
Alustan sellise graafikuga, mille autor on (2015. aastal) Martin Fowler:

Graafikult on nÀha, et monoliitsete rakenduste puhul, mis jÔuavad teatud suuruseni, hakkab tootlikkus langema. Mikroteenused erinevad selle poolest, et nende algne tootlikkus on madalam, kuid keerukuse kasvu korral ei ole nende efektiivsuse langus nii mÀrgatav.
TĂ€iendaksin seda graafikut Kubernetes'e kasutamise juhtumi jaoks:

Miks lĂ€ks mikroteenuste rakendamisel paremaks? Sest selline arhitektuur seab tĂ”sised nĂ”uded arhitektuurile, mida Kubernetes suudab suurepĂ€raselt tĂ€ita. Teisalt on osa nende funktsionaalsusest kasulik ka monoliitile, eriti kuna tĂ€napĂ€eva tĂŒĂŒpiline monoliit ei ole sugugi monoliit (detailid tulevad hiljem ettekandes).
Nagu nÀha, ei erine lÔpp-graafik (kui monoliitsete ja mikroteenuste rakendused asuvad Kubernetes'e infrastruktuuris) algsest eriti palju. JÀrgmisel teemal rÀÀgime rakendustest, mida hallatakse Kubernetes'e abil.
Kasulik ja kahjulik mikroteenuselisus
Ja siin on peamine mÔte:

Mis on siis normaalne mikroteenuste arhitektuur? See peaks andma teile tÔelist kasu, suurendades töö efektiivsust. Kui tagasi pöörduda graafiku juurde, siis siin see on:

Kui nimetada seda kasulik, siis graafiku teises otsas on kahjulik mikroteenuselisus (segab tööd):

Tagasi minnes "peamise mĂ”tte" juurde: kas tasub minu kogemusele ĂŒldse usaldada? Selle aasta algusest olen vaadanud 85 projekti. Need ei olnud kĂ”ik mikroteenused (sellise arhitektuuriga oli umbes kolmandik kuni pool neist), kuid see on ikkagi suur hulk. Meie (ettevĂ”te "Flant") kui vĂ€lispartnerid saame nĂ€ha laia valikut rakendusi, mis on arendatud nii vĂ€ikestes ettevĂ”tetes (5 arendajat) kui ka suurtes (~500 arendajat). TĂ€iendavaks plussiks on see, et nĂ€eme, kuidas need rakendused elavad ja arenevad aastate jooksul.
Miks mikroteenused?
Mikroteenuste kasu kĂŒsimusele on juba mainitud Martin Fowlerilt:
- selged piirid moodulite osas;
- iseseisev juurutamine;
- tehnoloogiate valiku vabadus.
Olen palju rÀÀkinud arhitektide ja tarkvaraarendajatega ning kĂŒsinud, miks neile mikroteenused on vajalikud. Koostasin oma ootuste nimekirja. Siin on, mis vĂ€lja tuli:

Kui "tunne« mÔningaid punkte kirjeldada, siis:
- selged moodulite piirid: meil on kole monoliit ja nĂŒĂŒd on kĂ”ik kenasti jagatud Git-repositooriatesse, kus kĂ”ik on "riiulitel", mitte segamini soe ja pehme;
- iseseisev juurutamine: saame teenuseid iseseisvalt vÀlja anda, et arendus oleks kiirem (samal ajal uusi funktsioone vÀlja pakkuda);
- arendamise iseseisvus: saame anda selle mikroteenuse ĂŒhele meeskonnale/arendajale, ja teise teisele, tĂ€nu millele saame kiiremini arendada;
- bosuurem usaldusvÀÀrsus: kui tekib osaline langus (ĂŒks mikroteenus 20-st langeb), siis lakab tööle vaid ĂŒks nupp, samas kui sĂŒsteem tervikuna jĂ€tkab toimimist.
TĂŒĂŒpiline (kahjulik) mikroteenuste arhitektuur
Kuid et selgitada, miks reaalsus on teistsugune, kui me ootame, esitan kogum mÔistet mikroteenuste arhitektuurist, mis pÔhineb mitmete erinevate projektide kogemusel.
KĂ€esolevaks nĂ€iteks on abstraktne veebipood, mis pĂŒĂŒab konkureerida Amazoniga vĂ”i vĂ€hemalt OZON-iga. Selle mikroteenuste arhitektuur nĂ€eb vĂ€lja jĂ€rgmine:

Mitmete pÔhjuste tÔttu on need mikroteenused kirjutatud erinevatel platvormidel:

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

Millised on selle tagajÀrjed?
Fowler'l on selle kohta samuti â mikroteenuste kasutamise âarve tasumisestâ:

Ja vaatame, kas meie ootused on tÀidetud.
Selged moodulite piiridâŠ
Aga kui palju mikroteenuseid peame tegelikult parandama, et muudatus ellu viia? Kas me saame ĂŒldse aru, kuidas kĂ”ik töötab, ilma jaotatud jĂ€lgimiseta (sest iga pĂ€ringut töötleb pool mikroteenustest)?
On olemas muster ââ, aga siin on see muutunud jaotatud mustaks tĂ€kkeks. Selle kinnituseks on allpool ligikaudne joonis, kuidas pĂ€ringud kĂ€ivad:

Deployimise sĂ”ltumatusâŠ
Tehniliselt on see saavutatud: me saame iga mikroteenuse eraldi uuendada. Kuid praktikas tuleb arvestada, et alati koosneb paljusid mikroteenuseid, lisaks peame arvestama nende kÀivitamise jÀrjekorraga. Idealjuhul peaksime testima, kas me tÔepoolest uuendame vÀljaande Ôiges jÀrjekorras.
Tehnoloogia valimise vabadusâŠ
See on olemas. Kuid tuleb meeles pidada, et tihti piirab vabadus ka kaost. On ÀÀrmiselt tĂ€htis, et valitaks tehnoloogiaid ainult selleks, et âmĂ€ngidaâ nendega.
Arendamise sĂ”ltumatusâŠ
Kuidas luua testimistava kogu rakendusele (niivĂ”rd paljude komponentide seas)? Pealegi tuleb seda pidevalt vĂ€rskendada. KĂ”ik see viib selleni, et reaalne testimisĂŒsteemide arv, mida me praktiliselt suudame hallata, on minimaalne.
Ja kĂ”ik see tuleb kohalikult kokku panna?.. Tulemuseks on see, et sageli teeb arendaja oma tööd iseseisvalt, kuid âpimeâ â kuna ta peab ootama, kuni testimiskeskkond vabanevad.
Eraldi skaleerimineâŠ
Jah, kuid see on piiratud kasutatavate DB-de osas. Antud arhitektuuri nÀites pole Cassandra probleem, kuid MySQL ja PostgreSQL-l on.
Suurem usaldusvÀÀrsusâŠoLisaks sellele, et ĂŒhe mikroteenuse rike tihti rikub kogu sĂŒsteemi korrektset toimimist, on seal veel uus probleem:
iga mikroteenuse töökorras hoidmine on ÀÀrmiselt keeruline . Kuna mikroteenustes kasutatakse erinevaid tehnoloogiaid (memcache, Redis jne), tuleb igaĂŒhe puhul kĂ”ik hoolikalt lĂ€bimĂ”elda ja ellu viia, mis muidugi on vĂ”imalik, kuid nĂ”uab tohutult ressursse.Koormuse mÔÔdetavusâŠ
Selle osas on kÔik tÔeliselt hÀsti.
Mikroteenuste âkergusââŠ
Meil ei ole mitte ainult tekkinud tohutuid
vÔrgukulusid (DNS-i pÀringud jne kasvu tÔestuseks), vaid ka mitme alam-pÀringu tÔttu hakkasime andmeid replikatsiooni (salvestama vahepealseid andmeid), mis viis olulise andmemahu tekkeni. Kuidas see vastab meie ootustele:
Kuid see pole veel kÔik!

Aga see pole veel kÔik!
Sest:
- TÔenÀoliselt on meil vajalik sÔnumivÀlja.
- Kuidas teha ajakohast koopia kindlal hetkel? Ăksnes reaalne lahendus on liikluse peatamine. Kuid kuidas seda tootmisfaasis teha?
- Kui on tegemist mitme piirkonna toetamisega, siis on igas piirkonnas stabiilsuse seadmine vĂ€ga töölise ĂŒlesanne.
- Ilmneb probleeme kesksete muudatuste tegemisel. NĂ€iteks, kui meil on vaja PHP versiooni uuendada, siis on vajalik teha commit igas repositooriumis (mille arv on hulgaliselt).
- Operatiivsete keerukuste suurenemine tundub olevat eksponentsiaalne.
Mida sellega teha?
Alustage monoliitsetest rakendustest. Fowlerâi kogemus on, et peaaegu kĂ”ik edukad mikroteenuste rakendused alustasid monoliidist, mis muutus liiga suureks, ning jagunes seejĂ€rel. Samuti on peaaegu kĂ”ik sĂŒsteemid, mis ehitati mikroteenuste baasil alates esmakordselt, varem vĂ”i hiljem sattunud tĂ”siste probleemide kĂŒĂŒsi.
Veel ĂŒks vÀÀrtuslik mĂ”te on see, et mikroteenuste arhitektuuri projekt peab olema tĂ”eliselt edukas, peavad teil olema vĂ€ga head teadmised nii valdkonnast kui ka mikroteenuste loomise kohta.Ja parim viis valdkonda tundma Ă”ppida on luua monoliit.
Aga mis siis, kui me oleme juba sellises olukorras?
Iga probleemi lahendamise esimene samm on nÔustuda, et see probleem on olemas, ja mÔista, et see on probleem, et me enam ei soovi kannatada.
Kui lĂ”puks on tegu suurenenud monoliidiga (kui meil on lĂ”ppenud vĂ”imalus selle ressursse juurde osta), lĂ”ikame selle lĂ”hki, siis osutub, et meeleolu mikroteenustest ei aita, vaid takistab â lĂ”igake liialdused ja suurendage!
Ja nĂ€iteks praeguses kompleksisâŠ
Vabanege kÔige kahtlasematest mikroteenustest:

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

âŠ ĂŒhte mikroteenusesse, mis on kirjutatud ĂŒhes (kaasaegses ja normaalses, nagu teie enda seisukoht) keeles/raamistikus:

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

⊠aga sinna saab tegelikult ĂŒle kanda palju rohkem, saavutades sellise tulemuse:

Ja Kuberneteses kÀivitame me kÔik need eraldi instantsid, mis tÀhendab, et me saame ikkagi mÔÔta koormust ja tÀiesti eraldi neid skaleerida.
KokkuvÔtteks
Vaata pilti laiemalt. Sageli tekivad kĂ”ik need probleemid mikroteenustega seoses sellega, et keegi vĂ”ttis oma ĂŒlesande, kuid soovis "mikroteenustega mĂ€ngida".
SĂ”nas "mikroteenused" on osa "mikro" ĂŒlearune.Need on "mikro" ainult seetĂ”ttu, et nad on vĂ€iksemad kui suured monoliidid. Kuid Ă€rge mĂ”elge nendele kui millelegi vĂ€ikesele.
Ja viimase mÔtte jaoks naaseme algse graafiku juurde:

Kirjutatud vĂ€itekiri (paremal ĂŒlal) kurtis, et teie projekti teostava meeskonna oskused on alati esmatĂ€htsad â just nemad mĂ€ngivad teie valikus mikroteenuste ja monoliidi vahel vĂ”tmerolli. Kui meeskonnal puuduvad oskused, kuid nad hakkavad tegema mikroteenuseid, on see lugu kindlasti saatuslik.
Video ja slaidid
Esinemise video (~50 min; kahjuks ei edasta see kĂŒlastajate rohkearvulisi emotsioone, mis suuresti mÀÀrasid ettekande meeleolu, aga mis seal ikka):

Ettekande esitlus:
P.S.
Teised ettekanded meie blogis:
- «» (Dmitri Stolyarov; 28. mai 2018 RootConf'is);
- «» (Dmitri Stolyarov; 7. november 2017 HighLoad++);
- «» (Dmitri Stolyarov; 6. juuni 2017 RootConf'il);
- «» (Dmitri Stolyarov; 8. november 2016 HighLoad++-l);
- «» (Dmitri Stolyarov; 31. mai 2016 RootConf-il).
Teid vÔivad samuti huvita jÀrgmised publikatsioonid:
- «»;
- «»;
- «».
Allikas: habr.com
