ÇfarĂ« dimĂ« pĂ«r mikroshĂ«rbimet

PĂ«rshĂ«ndetje! UnĂ« quhem Vadim Madison, dhe udhĂ«heq zhvillimin e System Platform nĂ« Avito. Ka pasur shumĂ« biseda nĂ« kompani mbi kalimin nga njĂ« arkitekturĂ« monolite nĂ« mikrosisteme. ËshtĂ« koha tĂ« ndajem se si e kemi transformuar infrastrukturĂ«n tonĂ« pĂ«r tĂ« nxjerrĂ« sa mĂ« shumĂ« pĂ«rfitime nga mikrosistemet dhe pĂ«r tĂ« mos humbur nĂ« to. Si na ndihmon PaaS, si e kemi thjeshtuar deployment-in dhe si e kemi reduktuar krijimin e mikrosistemit nĂ« njĂ« klikim — lexoni mĂ« tej. Jo çdo gjĂ« qĂ« do tĂ« shkruaj mĂ« poshtĂ« Ă«shtĂ« zbatuar plotĂ«sisht nĂ« Avito, disa janĂ« aspekte tĂ« zhvillimit tĂ« platformĂ«s sonĂ«.

(Po ashtu, në fund të këtij artikulli do t'ju flas për mundësinë për t'u regjistruar në një seminar tre ditor nga eksperti për arkitekturën e mikrosistemeve Chris Richardson).

ÇfarĂ« dimĂ« pĂ«r mikroshĂ«rbimet

Si arritëm te mikrosistemet

Avito është një nga platformën më të mëdha të shpalljeve në botë, me më shumë se 15 milion shpallje të reja çdo ditë. Backend-i ynë pranon më shumë se 20,000 kërkesa në sekondë. Aktualisht kemi disa qindra mikrosistema.

ArkitekturĂ«n mikrosistemore ne e kemi ndĂ«rtuar pĂ«r disa vite. Si e kemi bĂ«rĂ« kĂ«tĂ« — kolegĂ«t tanĂ« flasin nĂ« detaje treguan nĂ« seksionin tonĂ« nĂ« RIT++ 2017. NĂ« CodeFest 2017 (shih. video), Sergey Orlov dhe Mikhail Prokopchuk sqaruan nĂ« detaje pse kemi pasur nevojĂ« pĂ«r kalimin nĂ« mikrosisteme dhe rolin e Kubernetes nĂ« kĂ«tĂ« drejtim. Tani po bĂ«jmĂ« gjithçka pĂ«r tĂ« minimizuar kostot e shkallĂ«zimit qĂ« lidhen me kĂ«tĂ« arkitekturĂ«.

NĂ« fillim, ne nuk krijuam njĂ« ekosistem qĂ« do tĂ« na ndihmonte nĂ« mĂ«nyrĂ« gjithĂ«pĂ«rfshirĂ«se nĂ« zhvillimin dhe lansimin e mikrosistemeve. Thjesht grumbulluam zgjidhje tĂ« mira open source, i lançuam ato dhe i ofruam zhvilluesit tĂ« merret me to. NĂ« fund, zhvilluesi shkon nĂ« shumĂ« vende (dashboard, shĂ«rbime tĂ« brendshme), duke forcuar kĂ«shtu dĂ«shirat pĂ«r tĂ« shkruar kodin nĂ« mĂ«nyrĂ« tradicionale, nĂ« monolit. Ngjyrat e gjelbra nĂ« diagramet mĂ« poshtĂ« tregojnĂ« atĂ« qĂ« zhvilluesi e bĂ«n ndryshe me duar, ndĂ«rsa ngjyra e verdhĂ« — automatizimin.

ÇfarĂ« dimĂ« pĂ«r mikroshĂ«rbimet

Tani në utilitarin CLI PaaS, një komandë krijon një shërbim të ri, ndërsa dy të tjera shtojnë një bazë të re të dhënash dhe e deployojnë në Stage.

ÇfarĂ« dimĂ« pĂ«r mikroshĂ«rbimet

Si ta kalojmë epokën e "shkëputjes mikrosistemore"

Me arkitekturën monolite, për të siguruar konsistencën e ndryshimeve në produkt, zhvilluesit ishin të detyruar të kuptonin se çfarë ndodhte tek fqinjët e tyre. Tani, me arkitekturën e re, kontekstet e shërbimeve nuk varen më nga njëra-tjetra.

Përveç kësaj, për të qenë efektive, arkitektura mikrosistemore kërkon vendosjen e shumë proceseve, siç janë:

‱ logimi;
‱ gjurmimi i kĂ«rkesave (Jaeger);
‱ agregimi i gabimeve (Sentry);
‱ statuset, mesazhet, ngjarjet nga Kubernetes (Event Stream Processing);
‱ race limit / circuit breaker (mund tĂ« pĂ«rdorim Hystrix);
‱ kontrolli i lidhjes midis shĂ«rbimeve (ne pĂ«rdorim Netramesh);
‱ monitorimi (Grafana);
‱ ndĂ«rtimi (TeamCity);
‱ komunikimi dhe njoftimi (Slack, email);
‱ ndjekja e detyrave (Jira);
‱ pĂ«rgatitja e dokumentacionit.

Për të siguruar që sistemi të mos humbasë integritetin e tij dhe të mbetet efektiv gjatë shkallëzimit, ne e kemi ripërkufizuar organizimin e punës së mikrosistemeve në Avito.

Si e menaxhojmë mikrosistemin

Të ushtrojmë një "politikë të përbashkët" midis shumë mikrosistemeve të Avito ndihmojnë:

  • ndarja e infrastrukturĂ«s nĂ« nivele;
  • koncepti i PlatformĂ«s si ShĂ«rbim (PaaS);
  • monitorimi i gjithçkaje qĂ« ndodh me mikrosistemet.

Nivelet e abstraksionit të infrastrukturës përfshijnë tri shtresa. Do të shkojmë nga lartë në poshtë.

A. E para — service mesh. Fillimisht provuam Istio, por rezultoi se pĂ«rdor shumĂ« burime, qĂ« nĂ« volumet tona del shumĂ« shtrenjtĂ«. Prandaj, inxhinieri i lartĂ« nĂ« ekipin e arkitekturĂ«s, Alexander Luk'yanshenko, zhvilloi njĂ« zgjidhje tĂ« vetme — Netramesh (e disponueshme nĂ« Open Source), e cila tani e pĂ«rdorim nĂ« prodhim dhe konsumon disa herĂ« mĂ« pak resurse sesa Istio (por nuk bĂ«jnĂ« gjithçka pĂ«r tĂ« cilat mund tĂ« krenohet Istio).
B. E mesme — Kubernetes. AtĂ« e pĂ«rdorim pĂ«r tĂ« implementuar dhe operuar mikrosistemet.
C. E poshtme — bare metal. Ne nuk pĂ«rdorim cloud dhe gjĂ«ra si OpenStack, por jemi plotĂ«sisht nĂ« bare metal.

Të gjitha shtresat bashkohen në PaaS. Dhe kjo platformë, nga ana e saj, përbëhet nga tre pjesë.

I. Generatorët, të menaxhuar përmes utilitarit CLI. Kjo ndihmon zhvilluesin të krijojë mikrosistemin në mënyrë të duhur dhe me minimum përpjekjeje.

II. Koleksioni përmbledhës me kontrollin e të gjithë mjeteve përmes një paneli të përbashkët.

III. Depositi. Lidhet me planifikuesit, të cilët automatikisht vendosin triggers për veprime të rëndësishme. Falë këtij sistemi, asnjë detyrë nuk shpërbëhet thjesht sepse dikush harroi të vendosë një detyrë në Jira. Ne përdorim një mjet të brendshëm të quajtur Atlas për këtë.

ÇfarĂ« dimĂ« pĂ«r mikroshĂ«rbimet

Implementimi i mikroshërbimeve në Avito gjithashtu zhvillohet sipas një skeme uniforme, e cila lehtëson kontrollin mbi ta në çdo fazë të zhvillimit dhe lansimit.

Si funksionon lampadja standarde e zhvillimit të mikroshërbimeve

Në një formë të përgjithshme, zinxhiri i krijimit të mikroshërbimit duket si më poshtë:

CLI-push → Integrimi i vazhdueshĂ«m → Bake → Deploy → Testet artificiale → Testet Canary → Squeeze Testing → Prodhim → Mirmbajtje.

Le të shkojmë përmes saj pikërisht në këtë rend.

CLI-push

‱ Krijimi i mikroshĂ«rbimit.
Ne punuam shumĂ« pĂ«r tĂ« mĂ«suar çdo zhvillues si tĂ« bĂ«jĂ« mikroshĂ«rbime. Kemi shkruar udhĂ«zime tĂ« detajuara nĂ« Confluence. Por skemat ndryshonin dhe plotĂ«soheshin. Rezultati — ndodhi njĂ« ngushticĂ« nĂ« fillim tĂ« procesit: lançimi i mikroshĂ«rbimeve merrte shumĂ« mĂ« tepĂ«r kohĂ« se sa ishte e pranueshme, dhe gjithsesi gjatĂ« krijimit tĂ« tyre shpesh lindnin probleme.

Në fund, ne ndërtuam një utilitet të thjeshtë CLI që automatizon hapat kryesorë gjatë krijimit të mikroshërbimit. Në mënyrë efektive, ai zëvendëson git push-in e parë. Ky është saktësisht ajo që bën.

— Krijon shĂ«rbimin sipas njĂ« modeli — hap pas hapi, nĂ« modin "wizard". Ne kemi modele pĂ«r gjuhĂ«t kryesore tĂ« programimit nĂ« backendin e Avito: PHP, Golang dhe Python.

— Me njĂ« komandĂ« vendos ambientin pĂ«r zhvillim lokal nĂ« makinĂ«n pĂ«rkatĂ«se — Minikube ngrihet, helm-chartet generehen dhe nisin automatikisht nĂ« kubernetes-in lokal.

— Lidhet me bazĂ«n e tĂ« dhĂ«nave tĂ« kĂ«rkuar. Zhvilluesi nuk ka nevojĂ« tĂ« dijĂ« IP-nĂ«, emrin dhe fjalĂ«kalimin pĂ«r tĂ« aksesuar BDB-nĂ« e nevojshme — qoftĂ« lokal, qoftĂ« nĂ« Stage, qoftĂ« nĂ« prodhim. Gjithashtu, baza e tĂ« dhĂ«nave vendoset menjĂ«herĂ« nĂ« njĂ« konfigurim tĂ« qĂ«ndrueshĂ«m dhe me balancimin e ngarkesĂ«s.

— VetĂ« bĂ«n ndĂ«rtimin live. Le tĂ« themi, zhvilluesi ndryshon diçka nĂ« mikroshĂ«rbim pĂ«rmes IDE-sĂ« sĂ« tij. Utiliteti sheh ndryshimet nĂ« sistemin e skedarĂ«ve dhe pĂ«r kĂ«tĂ« arsye rifillon aplikacionin (pĂ«r Golang) dhe e rinis. PĂ«r PHP, ne thjesht e kalojmĂ« direktoren brenda kubit dhe aty live-reload funksionon "automatikisht".

— Gjeneron teste automatikisht. NĂ« formĂ«n e shablloneve, por krejt tĂ« pĂ«rdorshme.

‱ Deployimi i mikroshĂ«rbimit.

Derisa më parë dispersemi mikroshërbimin paksa të lodhshme. Ishte e nevojshme:

I. Dockerfile.

II. Konfig.
III. Helm-chart, i cili vetvetiu është voluminoz dhe përfshin:

— vetĂ« chartet;
— shabllonet;
— vlerat specifike qĂ« kanĂ« parasysh ambientet e ndryshme.

Ne e kemi eliminuar dhimbjen e rregullimit të manifestëve Kubernetes, dhe tani ato krijohen automatikisht. Por më e rëndësishmja, ne e kemi thjeshtuar deri në maksimum deploy-in. Tani kemi një Dockerfile, dhe të gjithë konfigurimin e zhvilluesi e shkruan në një skedë të vetme të shkurtër app.toml.

ÇfarĂ« dimĂ« pĂ«r mikroshĂ«rbimet

Po ashtu, në vetë app.toml tani bëhen punë për një minutë. Shkruajmë se sa kopje të shërbimit të ngrihen (në serverin dev, në staging, në prodhim), dhe tregojmë varësitë e tij. Vini re rreshtin size = "small" në bllokun [engine]. Ky është kufiri që do të ndahen shërbimit përmes Kubernetes.

Pastaj, mbi bazën e konfigurimit, krijohen automatikisht të gjitha chartet Helm të nevojshme dhe krijohen lidhjet me bazat e të dhënave.

‱ Validimi i bazĂ«s. KĂ«to kontrole janĂ« gjithashtu tĂ« automatizuara.
Duhet të monitorohet:
— a ka Dockerfile;
— a ka app.toml;
— a ka dokumentacion;
— a janĂ« varĂ«sitĂ« nĂ« rregull;
— a janĂ« vendosur rregullat e alerteve.
Për pikën e fundit: pronari i shërbimit vetë përcakton se cilat metrika produkti duhet të monitorohen.

‱ PĂ«rgatitja e dokumentacionit.
Akoma një vend problematik. Duket si gjëja më evidente, por përveç kësaj është gjithashtu një nyje rekordisht "e harruar shpesh", dhe për pasojë edhe një pikë e dobët e zinxhirit.
ËshtĂ« e nevojshme qĂ« dokumentacioni tĂ« jetĂ« pĂ«r çdo mikroshĂ«rbim. Ai pĂ«rfshin blloqet e mĂ«poshtme.

I. Përshkrimi i shkurtër i shërbimit.. Në mënyrë të vërtetë disa fraza për atë që bën dhe për çfarë përdoret.

II. Lidhja nĂ« diagramin e arkitekturĂ«s.. ËshtĂ« e rĂ«ndĂ«sishme qĂ« me njĂ« shikim tĂ« shpejtĂ« mbi tĂ«, tĂ« jetĂ« e lehtĂ« tĂ« kuptosh, pĂ«r shembull, nĂ«se po pĂ«rdorni Redis pĂ«r tĂ« ruajtur nĂ« memorie ose si krye depo nĂ« mĂ«nyrĂ« tĂ« qĂ«ndrueshme. NĂ« Avito, deri mĂ« tani kjo Ă«shtĂ« njĂ« lidhje nĂ« Confluence.

III. Runbook.. Një udhëzues i shkurtër për lancimin e shërbimit dhe hollësitë e trajtimit të tij.

IV. FAQ., ku do të ishte mirë të parashikohej problemet me të cilat mund të përballen kolegët tuaj gjatë punës me shërbimin.

V. Përshkrimi i endpoints për API.. Nëse përndryshe nuk e keni caktuar për destinacionet, fare sigurisht do të keni probleme me kolegët, të cilët mikroshërbimet e tyre lidhen me tuajin. Tani për tani, ne përdorim Swagger për këtë dhe zgjidhjen tonë të quajtur brief.

VI. Etiketat. Ose janë tregues që tregojnë se cila produkti, funksionaliteti, ose njësi organizative i kompanisë i përket shërbimit. Ato ndihmojnë për të kuptuar shpejt, për shembull, nëse po punoni mbi funksionalitetin që javën e kaluar e lansuan për të njëjtin biznes njësi kolegët tuaj.

VII. Pronari ose pronarët e shërbimit. Në shumicën e rasteve, ai - ose ata - përcaktohen automatikisht nga PaaS, por për siguri kërkojmë që zhvilluesi t'i tregojë ata manualisht.

Më në fund, një praktikë e mirë është të kryeni rishikimin e dokumentacionit, ashtu si me rishikimin e kodit.

Continuous Integration

  • PĂ«rgatitja e depot.
  • Krijimi i njĂ« pipeline nĂ« TeamCity.
  • Vendosja e tĂ« drejtave.
  • Gjetja e pronarĂ«ve tĂ« shĂ«rbimit. KĂ«tu Ă«shtĂ« njĂ« skemĂ« hibrid, me etiketim manual dhe automatik minimal nga PaaS. NjĂ« skemĂ« krejtĂ«sisht automatike shfaq probleme kur shĂ«rbimet transferohen nĂ« mbĂ«shtetje nĂ« njĂ« ekip tjetĂ«r zhvillimi ose, pĂ«r shembull, nĂ« rast se zhvilluesi i shĂ«rbimit largohet.
  • Regjistrimi i shĂ«rbimit nĂ« Atlas (shih lart). Me tĂ« gjithĂ« pronarĂ«t dhe varĂ«sitĂ« e tij.
  • Kontrolli i migrimeve. KontrollojmĂ« nĂ«se mes tyre ka ndonjĂ« qĂ« potencialisht mund tĂ« jetĂ« e rrezikshme. PĂ«r shembull, nĂ« njĂ« prej tyre del njĂ« alter table ose ndonjĂ« gjĂ« tjetĂ«r qĂ« mund tĂ« dĂ«mtojĂ« pĂ«rputhshmĂ«rinĂ« e skemĂ«s sĂ« tĂ« dhĂ«nave mes versioneve tĂ« ndryshme tĂ« shĂ«rbimit. AtĂ«herĂ« migrimi nuk kryhet, por vihet nĂ« abonnement - PaaS duhet tĂ« sinjalizojĂ« pronarin e shĂ«rbimit kur tĂ« bĂ«het e sigurt ta aplikojĂ«.

Bake

Faza tjetër është paketimi i shërbimeve përpara se të depozitohen.

  • NdĂ«rtimi i aplikacionit. Sipas klasiken - nĂ« njĂ« imazh Docker.
  • Generimi i Helm-chart pĂ«r shĂ«rbimin dhe burimet e lidhura me tĂ«. PĂ«rfshirĂ« pĂ«r bazat e tĂ« dhĂ«nave dhe cache. Ato krijohen automatikisht nĂ« pĂ«rputhje me konfigurimin app.toml, i cili u formua nĂ« fazĂ«n e CLI-push.
  • Krijimi i tiketave pĂ«r adminĂ«t pĂ«r hapjen e porteve (kur kĂ«rkohet).
  • Ekzekutimi i testeve njĂ«sore dhe llogaritja e mbulimit tĂ« kodit. NĂ«se mbulimi i kodit Ă«shtĂ« poshtĂ« vlerĂ«s sĂ« caktuar, atĂ«herĂ«, shumĂ« gjasa, mĂ« pas - nĂ« depozitimin - shĂ«rbimi nuk do tĂ« kalojĂ«. NĂ«se Ă«shtĂ« afĂ«r tĂ« pranueshmes, atij do t’i jepet njĂ« koeficient "pessimizues": kĂ«shtu qĂ« nĂ«se nuk ka pĂ«rmirĂ«sime tĂ« treguesit me kalimin e kohĂ«s, zhvilluesi do tĂ« marrĂ« njĂ« njoftim se nuk ka progres nĂ« çështjen e testeve (dhe diçka duhet tĂ« bĂ«jĂ« pĂ«r kĂ«tĂ«).
  • Kalkulimi i kufizimeve pĂ«r kujtesĂ«n dhe CPU. Kryesisht, mikroshĂ«rbimet i shkruajmĂ« nĂ« Golang dhe i ekzekutojmĂ« ato nĂ« Kubernetes. Prej kĂ«tu lidhet njĂ« nuancĂ«, e cila Ă«shtĂ« veçori e gjuhĂ«s Golang: nĂ« mĂ«nyrĂ« tĂ« paracaktuar, kur ekzekutohet, angazhohen tĂ« gjitha bĂ«rthamat nĂ« makinĂ«, pĂ«rveç nĂ«se nuk caktohet ndonjĂ«herĂ« variabla GOMAXPROCS dhe kur nĂ« njĂ« makinĂ« ekzekutohen disa shĂ«rbime tĂ« tilla, ato fillojnĂ« tĂ« garojnĂ« pĂ«r burimet, duke penguar njĂ«ra-tjetrĂ«n. NĂ« grafiket e mĂ«poshtme Ă«shtĂ« treguar si ndryshon koha e ekzekutimit, nĂ«se startoni aplikacionin pa konkurrencĂ« dhe nĂ« modin e garĂ«s pĂ«r burime. (Burimet e grafikĂ«ve janĂ« kĂ«tu).

ÇfarĂ« dimĂ« pĂ«r mikroshĂ«rbimet

Koha e ekzekutimit, më e vogël - më e mirë. Maximum: 643ms, minimum: 42ms. Foto klike.

ÇfarĂ« dimĂ« pĂ«r mikroshĂ«rbimet

Koha për operacion, më e vogël - më e mirë. Maximum: 14091 ns, minimum: 151 ns. Foto klike.

Në fazën e përgatitjes së ndërtimit, mund të caktoni këtë variabël shprehimisht ose mund të përdorni bibliotekën automaxprocs nga ekipi i Uber.

Dërgo

‱ Kontrollimi i konventave. Para se tĂ« filloni tĂ« dorĂ«zoni ndĂ«rtimet e shĂ«rbimit nĂ« ambientet e paracaktuara, Ă«shtĂ« e nevojshme tĂ« kontrolloni sa vijon:
— API endpoints.
— PĂ«rputhshmĂ«ria e pĂ«rgjigjeve tĂ« API endpoints me skemĂ«n.
— Formati i logeve.
— Caktimi i titujve gjatĂ« kĂ«rkesave nĂ« shĂ«rbim (aktualisht kĂ«tĂ« e bĂ«n netramesh)
— Vendosja e treguesit tĂ« pronarit gjatĂ« dĂ«rgimit tĂ« mesazheve nĂ« busin e ngjarjeve (event bus). Kjo Ă«shtĂ« e nevojshme pĂ«r ndjekjen e lidhshmĂ«risĂ« sĂ« shĂ«rbimeve nĂ«pĂ«rmjet busit. NĂ« bus mund tĂ« dĂ«rgoni tĂ« dhĂ«na idempotente, tĂ« cilat nuk rrisin lidhshmĂ«rinĂ« e shĂ«rbimeve (çka Ă«shtĂ« mirĂ«), ashtu si tĂ« dhĂ«na biznesi, tĂ« cilat e forcojnĂ« lidhshmĂ«rinĂ« e shĂ«rbimeve (çka Ă«shtĂ« shumĂ« keq!). Dhe nĂ« momentin kur kjo lidhshmĂ«ri bĂ«het problem, kuptimi i kush shkruan dhe lexon busin ndihmon pĂ«r tĂ« ndarĂ« saktĂ«sisht shĂ«rbimet.

Për momentin, konventat në Avito nuk janë shumë të shumta, por po zgjerohet grupi i tyre. Sa më shumë marrëveshje të tilla në një format të kuptueshëm dhe të përshtatshëm për ekipin, aq më e lehtë është të ruhet koherenca mes mikroshërbimeve.

Testet sintetike

‱ Testimi nĂ« njĂ« kontur tĂ« mbyllur. PĂ«r kĂ«tĂ« tani pĂ«rdorim open-source Hoverfly.io. Fillimisht, ai regjistron ngarkesĂ«n reale nĂ« shĂ«rbim, pastaj - pikĂ«risht nĂ« konturin e mbyllur - e emulon atĂ«.

‱ Testimi i ngarkesĂ«s. TĂ« gjithĂ« shĂ«rbimet pĂ«rpiqemi t'i çojmĂ« nĂ« performancĂ«n optimale. Dhe tĂ« gjitha versionet e secilit shĂ«rbim duhet tĂ« kalojnĂ« testimin e ngarkesĂ«s - kĂ«shtu ne mund tĂ« kuptojmĂ« performancĂ«n aktuale tĂ« shĂ«rbimit dhe ndryshimin me versionet e mĂ«parshme tĂ« kĂ«tij shĂ«rbimi. NĂ«se pas pĂ«rditĂ«simit tĂ« shĂ«rbimit performanca e tij ra nĂ« njĂ« dhe e gjysmĂ« herĂ«, kjo Ă«shtĂ« njĂ« shenjĂ« e qartĂ« pĂ«r pronarĂ«t e tij: duhet tĂ« thellohen nĂ« kod dhe tĂ« rregullojnĂ« situatĂ«n.
Ne bazohemi të dhënave që kemi mbledhur, për shembull, për të implementuar saktësisht auto scaling dhe, në fund, për të kuptuar se sa mirë shërbimi mund të shkallëzohet.

Në testimin e ngarkesës, ne kontrollojmë nëse konsumimi i burimeve i përmbush kufizimet e vendosura. Dhe përqendrohemi kryesisht në ekstremet.

a) Shikojmë ngarkesën totale.
— ShumĂ« e ulĂ«t — ndoshta ndodhi ndonjĂ« problem, nĂ«se ngarkesa ka rĂ«nĂ« ndjeshĂ«m.
— ShumĂ« e lartĂ« — kĂ«rkohet optimizim.

b) Shikojmë në kufirin në RPS.
KĂ«tu shikojmĂ« edhe diferencĂ«n midis versionit aktual dhe atij tĂ« mĂ«parshĂ«m dhe numrin total. PĂ«r shembull, nĂ«se shĂ«rbimi ofron 100 rps — mund tĂ« jetĂ« ose i shkruar keq, ose kjo Ă«shtĂ« specifikĂ« e tij, por megjithatĂ«, kjo Ă«shtĂ« njĂ« mundĂ«si pĂ«r tĂ« shqyrtuar me vĂ«mendje shĂ«rbimin.
Nëse RPS është përkundrazi shumë i lartë, ndoshta ka ndodhur ndonjë problem dhe ndonjë nga endpoint-të ka ndaluar të kryejë ngarkesë të dobishme, por thjesht aktivizohet ndonjë return true;

Canary-teste

Pas kalimit tĂ« testeve sintetike, ne testojmĂ« funksionimin e mikrosherbimit me njĂ« numĂ«r tĂ« vogĂ«l pĂ«rdoruesish. FillojmĂ« ngadalĂ«, me njĂ« pjesĂ« minimale tĂ« publikut tĂ« supozuar tĂ« shĂ«rbimit — mĂ« pak se 0.1%. NĂ« kĂ«tĂ« fazĂ«, Ă«shtĂ« shumĂ« e rĂ«ndĂ«sishme qĂ« nĂ« monitorim tĂ« jenĂ« vendosur metrikat e duhura teknike dhe produktore, nĂ« mĂ«nyrĂ« qĂ« ato tĂ« tregojnĂ« sa mĂ« shpejt problemin nĂ« shĂ«rbim. Koha minimale e testit canary Ă«shtĂ« 5 minuta, ndĂ«rsa ajo kryesore — 2 orĂ«. PĂ«r shĂ«rbimet komplekse vendosim kohĂ«n manualisht.
Analizojmë:
— metrikat specifike pĂ«r gjuhĂ«n, veçanĂ«risht punĂ«toret php-fpm;
— gabimet nĂ« Sentry;
— statuset e pĂ«rgjigjeve;
— koha e pĂ«rgjigjeve (response time), e saktĂ« dhe mesatare;
— latency;
— pĂ«rjashtimet, tĂ« trajtuara dhe tĂ« pa trajtuara;
— metrikat produktore.

Squeeze Testing

Squeeze Testing gjithashtu quhet testim pĂ«rmes "shkĂ«mbimit". Emri i metodĂ«s Ă«shtĂ« futur nga Netflix. Thelbi i saj Ă«shtĂ« qĂ« fillimisht ne mbushim njĂ« instancĂ« me trafik real deri nĂ« pikĂ«n e dĂ«shtimit dhe kĂ«shtu vendosim kufirin e saj. MĂ« pas, shtojmĂ« njĂ« innstancĂ« tjetĂ«r dhe e ngarkojmĂ« atĂ« çift — pĂ«rsĂ«ri deri nĂ« maksimum; ne shikojmĂ« plafonin e tyre dhe ndryshimin me "shkĂ«mbimin" e parĂ«. Dhe kĂ«shtu vazhdojmĂ« tĂ« lidhim njĂ« instancĂ« pĂ«r njĂ« hap dhe llogarisim rregullsinĂ« nĂ« ndryshime.
Të dhënat nga testet përmes "shkëmbimit" gjithashtu grumbullohen në bazën e përgjithshme të metrikave, ku ne ose i pasurojmë me rezultatet e ngarkesës artificiale, ose i zëvendësojmë ato me "sintetik".

Prodaksheni

‱ ShkallĂ«zimi. Duke nxjerrĂ« shĂ«rbimin nĂ« prodhimin, ne ndjekim se si shkallĂ«zohet. TĂ« monitorosh vetĂ«m treguesit e CPU, nga pĂ«rvoja jonĂ«, nuk Ă«shtĂ« efektiv. Auto scaling me benchmarking-un RPS nĂ« mĂ«nyrĂ« tĂ« pastĂ«r funksionon, por vetĂ«m pĂ«r shĂ«rbime tĂ« caktuara, pĂ«r shembull, transmetim online. Pra, ne shikojmĂ« nĂ« radhĂ« tĂ« parĂ« nĂ« metrikat produktore qĂ« janĂ« specifike pĂ«r aplikacionin.

Në fund, gjatë shkallëzimit, analizojmë:
— treguesit e CPU dhe RAM,
— numri i kĂ«rkesave nĂ« radhĂ«,
— koha e pĂ«rgjigjes,
— parashikimi nĂ« bazĂ« tĂ« tĂ« dhĂ«nave historike tĂ« grumbulluara.

Gjatë shkallëzimit të shërbimit është gjithashtu e rëndësishme të ndjekim varësitë e tij, në mënyrë që të mos ndodhë që ne të shkallëzojmë shërbimin e parë në zinxhir, ndërsa ata që ai i drejtohet bjerë nën ngarkesë. Për të vendosur një ngarkesë të pranueshme për të gjithë grupin e shërbimeve, shikojmë të dhënat historike të shërbimit "më të afërt" të varur (në përputhje me kombinimin e treguesve CPU dhe RAM së bashku me metrikat specifike për aplikacionin) dhe i krahasojmë ato me të dhënat historike të shërbimit fillestar, dhe kështu me radhë në të gjithë "zinxhirin e varësive", nga lart poshtë.

Ruinimi

Pasi mikrosherbimi është vendosur në funksion, ne mund të vendosim trigger-a mbi të.

Ja situatat tipike, në të cilat aktivizohen trigger-at.
— Migrations tĂ« mundshme tĂ« rrezikshme janĂ« zbuluar.
— JanĂ« bĂ«rĂ« pĂ«rditĂ«sime tĂ« sigurisĂ«.
— ShĂ«rbimi vetĂ« nuk Ă«shtĂ« pĂ«rditĂ«suar pĂ«r njĂ« kohĂ« tĂ« gjatĂ«.
— Ka pasur njĂ« rĂ«nie tĂ« ndjeshme nĂ« ngarkesĂ«n e shĂ«rbimit ose ndonjĂ« nga metrikat e tij produktore kalon jashtĂ« normĂ«s.
— ShĂ«rbimi ka ndaluar sĂ« pĂ«rmbushuri kĂ«rkesat e reja tĂ« platformĂ«s.

Disa nga trigger-at janĂ« pĂ«r stabilitetin e funksionimit, disa si njĂ« funksion i shĂ«rbimit tĂ« sistemit — pĂ«r shembull, ndonjĂ« shĂ«rbim qĂ« nuk Ă«shtĂ« depozitohar pĂ«r njĂ« kohĂ« tĂ« gjatĂ« dhe bazamenti i tij ka ndaluar sĂ« kaluar kontrollet e sigurisĂ«.

Dashboard

Nëse e përmbledhim, paneli i kontrollit është qendra e monitorimit të gjithë PaaS tonë.

  • NjĂ« pikĂ« e vetme informacioni mbi shĂ«rbimin, me tĂ« dhĂ«na pĂ«r mbulimin e testeve, numrin e imazheve tĂ« tij, numrin e kopjeve nĂ« prodhim, versione etj.
  • NjĂ« mjet filtrimi tĂ« dhĂ«nash sipas shĂ«rbimeve dhe labels (etiketave tĂ« pĂ«rkatĂ«sisĂ« pĂ«r njĂ«sitĂ« e biznesit, funksionalitetin produktor etj.)
  • NjĂ« mjet integrimi me instrumentet infrastrukturore pĂ«r ruajtjen e gjurmĂ«ve, logimin, monitorimin.
  • NjĂ« pikĂ« e vetme dokumentacioni mbi shĂ«rbimet.
  • NjĂ« pikĂ« e vetme e shqyrtimit pĂ«r tĂ« gjitha ngjarjet nĂ« shĂ«rbime.

ÇfarĂ« dimĂ« pĂ«r mikroshĂ«rbimet
ÇfarĂ« dimĂ« pĂ«r mikroshĂ«rbimet
ÇfarĂ« dimĂ« pĂ«r mikroshĂ«rbimet
ÇfarĂ« dimĂ« pĂ«r mikroshĂ«rbimet

Në përfundim

Para adoptimit tĂ« PaaS, njĂ« zhvillues i ri mund tĂ« harxhojĂ« disa javĂ« pĂ«r t'u njohur me tĂ« gjitha mjetet e nevojshme pĂ«r tĂ« lancuar njĂ« mikroshĂ«rbim nĂ« prodhim: Kubernetes, Helm, — nĂ« veçoritĂ« tona tĂ« brendshme TeamCity, konfigurimin e lidhjes me bazat e tĂ« dhĂ«nave dhe ĐșДшlarning nĂ« njĂ« mĂ«nyrĂ« tĂ« qĂ«ndrueshme etj. Tani kjo merr disa orĂ« — pĂ«r tĂ« lexuar quickstart dhe pĂ«r tĂ« ndĂ«rtuar vetĂ« shĂ«rbimin.

Kam bërë një prezantim mbi këtë temë për HighLoad++ 2018, mund ta shikoni video dhe një prezantim.

Një bonus për ata që lexuan deri në fund

Ne në Avito po organizojmë një trajnim të brendshëm për tre ditë për zhvillues nga Chris Richardson, një ekspert në arkitekturën e mikroshërbimeve. Dëshirojmë të ofrojmë mundësinë e pjesëmarrjes në të për ndonjë nga lexuesit e këtij postimi. Këtu është publikuar programi i trajnimit.

Trajnimi do të zhvillohet nga 5 deri më 7 gusht në Moskë. Këto janë ditë pune, të cilat do të jenë plotësisht të angazhuara. Drekë dhe mësimi do të jenë në zyrën tonë, ndërsa rruga dhe akomodimi do të paguhen nga pjesëmarrësi i zgjedhur.

Aplikimi për pjesëmarrje mund të bëhet në këtë formular Google. Nga ju kërkohet një përgjigje në pyetjen se pse pikërisht ju duhet të vizitoni trajnimin dhe informacion se si mund të kontaktoheni. Përgjigjuni në anglisht, sepse Chris do të zgjedhë vetë pjesëmarrësin që do të marrë pjesë në trajnim.
Ne do të shpallim emrin e pjesëmarrësit të trajnimit si një përditësim të këtij postimi dhe në mediat sociale të Avito për zhvilluesit (AvitoTech në Facebook, Vkontakte, Twitter) jo më vonë se 19 korrik.

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster