Mikroteenused: suurus loeb, isegi kui teil on Kubernetes

19. september Moskvast leidis aset 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.

Mikroteenused: suurus loeb, isegi kui teil on Kubernetes

Tutvustame ettekande videot (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) sai Martin Fowler:

Mikroteenused: suurus loeb, isegi kui teil on Kubernetes

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:

Mikroteenused: suurus loeb, isegi kui teil on Kubernetes

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:

Mikroteenused: suurus loeb, isegi kui teil on Kubernetes

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:

Mikroteenused: suurus loeb, isegi kui teil on Kubernetes

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

Mikroteenused: suurus loeb, isegi kui teil on Kubernetes

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 vĂ€ga konkreetne vastus juba mainitud Martin Fowlerilt:

  1. selged modulaarsete piiride mÀÀratlemised;
  2. iseseisev juurutamine;
  3. 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:

Mikroteenused: suurus loeb, isegi kui teil on Kubernetes

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:

Mikroteenused: suurus loeb, isegi kui teil on Kubernetes

KokkuvÔtlikult on need mikroteenused kirjutatud erinevatesse platvormidesse:

Mikroteenused: suurus loeb, isegi kui teil on Kubernetes

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

Mikroteenused: suurus loeb, isegi kui teil on Kubernetes

Millised on selle tagajÀrjed?

Fowler'il on selle kohta artikkel — «mikroteenuste» kasutamise «hind»:

Mikroteenused: suurus loeb, isegi kui teil on Kubernetes

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 «suur must tĂŒkikene», aga siin on see ĂŒldse saanud jaotatud tĂŒkikeseks. Selle kinnituseks — siin on umbkaudne illustreerimine, kuidas pĂ€ringud liiguvad:

Mikroteenused: suurus loeb, isegi kui teil on Kubernetes

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:

Mikroteenused: suurus loeb, isegi kui teil on Kubernetes

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 ĂŒtleb 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:

Mikroteenused: suurus loeb, isegi kui teil on Kubernetes

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

Mikroteenused: suurus loeb, isegi kui teil on Kubernetes


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

Mikroteenused: suurus loeb, isegi kui teil on Kubernetes

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

Mikroteenused: suurus loeb, isegi kui teil on Kubernetes


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

Mikroteenused: suurus loeb, isegi kui teil on Kubernetes

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:

Mikroteenused: suurus loeb, isegi kui teil on Kubernetes

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):

MĂ€ngi videot

Ettekande esitlemine:

P.S.

Teised ettekanded meie blogis:

TÔenÀoliselt huvitavad teid ka jÀrgmised publikatsioonid:

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster