Ki sa nou konnen sou mikwosèvis yo

Bonjou! Non mwen se Vadim Madison, mwen dirije devlopman Platfòm Sistèm Avito. Li te di plis pase yon fwa ki jan nou nan konpayi an ap deplase soti nan yon achitekti monolitik nan yon sèl mikwosèvis. Li lè pou n pataje fason nou te transfòme enfrastrikti nou an pou nou ka pwofite pi plis nan mikwo-sèvis yo epi anpeche tèt nou pèdi nan yo. Ki jan PaaS ede nou isit la, ki jan nou senplifye deplwaman ak redwi kreyasyon yon mikwosèvis a yon sèl klike sou - li sou. Se pa tout sa mwen ekri sou anba a konplètman aplike nan Avito, kèk nan li se fason nou devlope platfòm nou an.

(Epi nan fen atik sa a, mwen pral pale sou opòtinite pou ale nan yon seminè twa jou soti nan ekspè achitekti mikwosèvis Chris Richardson).

Ki sa nou konnen sou mikwosèvis yo

Ki jan nou te rive nan microservices

Avito se youn nan pi gwo sit ki klase nan mond lan; plis pase 15 milyon nouvo piblisite yo pibliye sou li chak jou. Backend nou an aksepte plis pase 20 mil demann pou chak segonn. Kounye a nou gen plizyè santèn mikwosèvis.

Nou te konstwi yon achitekti mikwosèvis pou plizyè ane kounye a. Ki jan egzakteman - kòlèg nou yo an detay te di nan seksyon nou an nan RIT++ 2017. Nan CodeFest 2017 (gade. videyo), Sergey Orlov ak Mikhail Prokopchuk eksplike an detay poukisa nou te bezwen tranzisyon an nan mikwosèvis ak ki wòl Kubernetes te jwe isit la. Oke, kounye a nou ap fè tout sa yo pou misyon pou minimize depans yo dekale ki nannan nan yon achitekti konsa.

Okòmansman, nou pa t kreye yon ekosistèm ki ta ka ede nou devlope ak lanse mikwosèvis yo. Yo tou senpleman kolekte solisyon sous ouvè sansib, lanse yo lakay yo epi envite pwomotè a fè fas ak yo. Kòm yon rezilta, li te ale nan yon douzèn kote (planch, sèvis entèn), apre sa li te vin pi fò nan dezi li nan koupe kòd ansyen fason, nan yon monolit. Koulè vèt nan dyagram ki anba yo endike sa pwomotè a fè yon fason oswa yon lòt ak pwòp men l ', ak koulè jòn endike automatisation.

Ki sa nou konnen sou mikwosèvis yo

Koulye a, nan sèvis piblik PaaS CLI, yo kreye yon nouvo sèvis ak yon sèl kòmand, epi yo ajoute yon nouvo baz done ak de plis epi deplwaye sou Etap.

Ki sa nou konnen sou mikwosèvis yo

Ki jan yo simonte epòk la nan "fragmantasyon mikwosèvis"

Avèk yon achitekti monolitik, pou dedomajman pou la konsistans nan chanjman nan pwodwi a, devlopè yo te fòse yo konnen sa ki te pase ak vwazen yo. Lè w ap travay sou nouvo achitekti a, kontèks sèvis yo pa depann youn ak lòt ankò.

Anplis de sa, pou yon achitekti mikwosèvis efikas, anpil pwosesis bezwen etabli, sètadi:

• antre;
• demann trase (Jaeger);
• agrégation erè (Sentry);
• estati, mesaj, evènman ki soti nan Kubernetes (Event Stream Processing);
• limit ras / disjoncteur (ou ka itilize Hystrix);
• kontwòl koneksyon sèvis (nou itilize Netramesh);
• siveyans (Grafana);
• asanble (TeamCity);
• kominikasyon ak notifikasyon (Slack, imèl);
• swivi travay; (Jira)
• preparasyon dokiman.

Pou asire ke sistèm nan pa pèdi entegrite li epi li rete efikas pandan l ap monte, nou repense òganizasyon an nan mikwosèvis nan Avito.

Ki jan nou jere mikwosèvis yo

Èd sa a pou aplike yon "politik pati" inifye nan mitan anpil mikwosèvis Avito:

  • divize enfrastrikti an kouch;
  • Konsèp platfòm kòm yon sèvis (PaaS);
  • kontwole tout sa k ap pase ak mikwosèvis yo.

Kouch abstraksyon enfrastrikti gen ladan twa kouch. Ann ale depi anwo jouk anba.

A. Top - sèvis may. Okòmansman, nou te eseye Istio, men li te tounen soti ke li itilize twòp resous, ki twò chè pou komèsan nou yo. Se poutèt sa, enjenyè ansyen nan ekip la achitekti Alexander Lukyanchenko devlope pwòp solisyon li - Netramesh (disponib nan Open Source), ke nou itilize kounye a nan pwodiksyon ak ki konsome plizyè fwa mwens resous pase Istio (men li pa fè tout sa ki Istio ka vante nan).
B. Mwayen - Kubernetes. Nou deplwaye ak opere mikwosèvis sou li.
C. Anba - metal fè. Nou pa sèvi ak nyaj oswa bagay tankou OpenStack, men nou konte antyèman sou metal fè.

Tout kouch yo konbine pa PaaS. Ak platfòm sa a, nan vire, konsiste de twa pati.

I. Jeneratè, kontwole atravè yon sèvis piblik CLI. Li se li ki ede pwomotè a kreye yon mikwosèvis nan bon fason ak ak yon minimòm de efò.

II. Pèseptè konsolide ak kontwòl sou tout zouti atravè yon tablodbò komen.

III. Depo. Konekte ak pwogramasyon ki otomatikman mete deklanche pou aksyon enpòtan. Gras a yon sistèm konsa, yo pa rate yon sèl travay jis paske yon moun bliye mete yon travay nan Jira. Nou itilize yon zouti entèn yo rele Atlas pou sa.

Ki sa nou konnen sou mikwosèvis yo

Aplikasyon mikwosèvis nan Avito tou fèt dapre yon konplo sèl, ki senplifye kontwòl sou yo nan chak etap nan devlopman ak lage.

Ki jan yon tiyo devlopman mikwosèvis estanda travay?

An jeneral, chèn kreyasyon mikwosèvis la sanble sa a:

CLI-push → Entegrasyon kontinyèl → Kwit → Deplwaye → Tès atifisyèl → Tès Canary → Tès peze → Pwodiksyon → Antretyen.

Ann ale nan li egzakteman nan lòd sa a.

CLI-pouse

• Kreye yon mikwosèvis.
Nou te lite pou yon tan long pou anseye chak pwomotè ki jan fè mikwosèvis. Sa enkli ekri enstriksyon detaye nan Confluence. Men, rapid yo chanje epi yo te konplete. Rezilta a se ke yon kou boutèy te parèt nan kòmansman vwayaj la: li te pran plis tan pou lanse mikwosèvis, epi toujou pwoblèm souvan te parèt pandan kreyasyon yo.

Nan fen a, nou bati yon senp sèvis piblik CLI ki otomatize etap debaz yo lè kreye yon mikwosèvis. An reyalite, li ranplase premye git pouse a. Men kisa li fè egzakteman.

— Kreye yon sèvis dapre yon modèl — etap pa etap, nan mòd "sòsye". Nou gen modèl pou lang prensipal pwogramasyon yo nan backend Avito: PHP, Golang ak Python.

- Yon sèl kòmand nan yon moman deplwaye yon anviwònman pou devlopman lokal sou yon machin espesifik - Minikube lanse, tablo Helm yo otomatikman pwodwi ak lanse nan kubernetes lokal yo.

— Konekte baz done ki nesesè yo. Pwomotè a pa bezwen konnen IP, login ak modpas pou jwenn aksè nan baz done li bezwen an - kit li lokalman, nan Etap, oswa nan pwodiksyon an. Anplis, baz done a deplwaye imedyatman nan yon konfigirasyon ki toleran fay ak balanse.

- Li fè asanble vivan tèt li. Ann di yon pwomotè korije yon bagay nan yon mikwosèvis atravè IDE li. Sèvis piblik la wè chanjman nan sistèm dosye a epi, ki baze sou yo, rebati aplikasyon an (pou Golang) epi rekòmanse. Pou PHP, nou tou senpleman voye anyè a andedan kib la epi gen live-reload yo jwenn "otomatikman".

— Jenere ototès. Nan fòm lan nan espas vid, men byen apwopriye pou itilize.

• Deplwaman Microservice.

Deplwaye yon mikwosèvis te konn fè yon ti kras nan yon ti tache pou nou. Sa ki annapre yo te obligatwa:

I. Dockerfile.

II. Konfigirasyon.
III. Tablo Helm, ki tèt li ankonbran e li gen ladan l:

— tablo yo tèt yo;
- modèl;
— valè espesifik pran an kont diferan anviwònman.

Nou te retire doulè nan retravay manifès Kubernetes pou yo kounye a yo pwodwi otomatikman. Men, sa ki pi enpòtan, yo senplifye deplwaman an nan limit la. Depi koulye a nou gen yon Dockerfile, ak pwomotè a ekri tout konfigirasyon an nan yon sèl dosye app.toml kout.

Ki sa nou konnen sou mikwosèvis yo

Wi, ak nan app.toml tèt li pa gen anyen fè pou yon minit. Nou presize ki kote ak konbyen kopi sèvis la pou ogmante (sou sèvè dev la, sou sèn, nan pwodiksyon), epi endike depandans li yo. Remake gwosè liy lan = "ti" nan blòk la [motè]. Sa a se limit la ke yo pral resevwa lajan nan sèvis la atravè Kubernetes.

Lè sa a, ki baze sou konfigirasyon an, tout tablo Helm ki nesesè yo otomatikman pwodwi ak koneksyon ak baz done yo kreye.

• Validasyon debaz. Chèk sa yo tou otomatik.
Bezwen swiv:
- èske gen yon Dockerfile;
— èske gen app.toml;
— Èske gen dokiman ki disponib?
— se depandans lan nan lòd?
— si règ alèt yo te etabli.
Nan dènye pwen an: mèt kay la nan sèvis la tèt li detèmine ki mezi pwodwi yo kontwole.

• Preparasyon dokiman.
Toujou yon zòn pwoblèm. Li sanble pi evidan an, men an menm tan an li se tou yon dosye "souvan bliye", ak Se poutèt sa yon lyen vilnerab nan chèn lan.
Li nesesè ke gen dokiman pou chak mikwosèvis. Li gen ladann blòk sa yo.

I. Brèf deskripsyon sèvis la. Literalman kèk fraz sou sa li fè ak poukisa li nesesè.

II. Achitekti lyen dyagram. Li enpòtan ke ak yon ti koutje sou li fasil pou konprann, pou egzanp, si w ap itilize Redis pou kachèt oswa kòm magazen done prensipal la nan mòd ki pèsistan. Nan Avito pou kounye a se yon lyen ki mennen nan Confluence.

III. Runbook. Yon gid kout sou kòmanse sèvis la ak sibtilite yo nan manyen li.

IV. FAQ, kote li ta bon pou antisipe pwoblèm yo ke kòlèg ou yo ka rankontre lè w ap travay ak sèvis la.

V. Deskripsyon pwen final pou API a. Si toudenkou ou pa t presize destinasyon yo, kòlèg ki gen mikwosèvis ki gen rapò ak pa w la pral prèske sètènman peye pou li. Koulye a, nou itilize Swagger ak solisyon nou an rele kout pou sa.

VI. Etikèt. Oswa makè ki montre ki pwodwi, fonksyonalite, oswa divizyon estriktirèl nan konpayi an sèvis la fè pati. Yo ede w byen vit konprann, pou egzanp, si w ap koupe fonksyonalite ke kòlèg ou yo te woule pou menm inite biznis la yon semèn de sa.

VII. Pwopriyetè oswa pwopriyetè sèvis la. Nan pifò ka yo, li - oswa yo - ka detèmine otomatikman lè l sèvi avèk PaaS, men yo dwe sou bò a an sekirite, nou mande pou pwomotè a presize yo manyèlman.

Finalman, li se yon bon pratik pou revize dokiman, menm jan ak revizyon kòd.

Entegrasyon kontinyèl

  • Preparasyon depo.
  • Kreye yon tiyo nan TeamCity.
  • Mete dwa.
  • Chèche pwopriyetè sèvis yo. Gen yon konplo ibrid isit la - make manyèl ak automatisation minim soti nan PaaS. Yon konplo totalman otomatik echwe lè sèvis yo transfere pou sipò nan yon lòt ekip devlopman oswa, pou egzanp, si pwomotè sèvis la kite.
  • Anrejistre yon sèvis nan Atlas (gade pi wo a). Ak tout pwopriyetè li yo ak depandans.
  • Tcheke migrasyon yo. Nou tcheke si youn nan yo se potansyèlman danjere. Pou egzanp, nan youn nan yo yon tab chanje oswa yon lòt bagay parèt ki ka kraze konpatibilite nan chema done a ant diferan vèsyon nan sèvis la. Lè sa a, migrasyon an pa fèt, men mete nan yon abònman - PaaS la dwe siyal pwopriyetè sèvis la lè li an sekirite pou itilize li.

Kwit

Pwochen etap la se sèvis anbalaj anvan deplwaman.

  • Bati aplikasyon an. Dapre klasik yo - nan yon imaj Docker.
  • Jenerasyon tablo Helm pou sèvis li menm ak resous ki gen rapò. Ki gen ladan pou baz done ak kachèt. Yo kreye otomatikman an akò ak konfigirasyon app.toml ki te pwodwi nan etap CLI-push la.
  • Kreye tikè pou admin yo louvri pò yo (lè sa nesesè).
  • Kouri tès inite yo ak kalkil pwoteksyon kòd. Si pwoteksyon kòd la pi ba pase papòt la espesifye, Lè sa a, gen plis chans sèvis la pa pral ale pi lwen - nan deplwaman. Si li sou wout pou l akseptab, Lè sa a, sèvis la pral bay yon koyefisyan "pessimizing": Lè sa a, si pa gen okenn amelyorasyon nan endikatè a sou tan, pwomotè a pral resevwa yon notifikasyon ke pa gen okenn pwogrè an tèm de tès ( ak yon bagay bezwen fè sou li).
  • Kontablite pou memwa ak CPU limit. Nou sitou ekri microservices nan Golang epi kouri yo nan Kubernetes. Pakonsekan yon sibtilite ki asosye ak singularite nan lang Golang la: pa default, lè yo kòmanse, tout nwayo sou machin nan yo itilize, si ou pa klèman mete varyab GOMAXPROCS la, epi lè plizyè sèvis sa yo yo te lanse sou menm machin nan, yo kòmanse. fè konpetisyon pou resous, entèfere youn ak lòt. Grafik ki anba yo montre kouman tan ekzekisyon an chanje si ou kouri aplikasyon an san deba ak nan mòd kous pou resous yo. (Sous graf yo se isit la).

Ki sa nou konnen sou mikwosèvis yo

Tan ekzekisyon, mwens se pi bon. Maksimòm: 643ms, minimòm: 42ms. Se foto a klike sou.

Ki sa nou konnen sou mikwosèvis yo

Tan pou operasyon, mwens se pi bon. Maksimòm: 14091 ns, minimòm: 151 ns. Se foto a klike sou.

Nan etap preparasyon asanble a, ou ka mete varyab sa a klèman oswa ou ka itilize bibliyotèk la automaxprocs nan men mesye uber yo.

Deplwaye

• Tcheke konvansyon yo. Anvan ou kòmanse delivre asanble sèvis yo nan anviwònman ou gen entansyon, ou bezwen tcheke sa ki annapre yo:
- API endpoints.
— Konfòmite repons API endpoints ak chema a.
— Fòma Log.
— Mete tèt yo pou demann nan sèvis la (kounye a se netramesh ki fè sa)
— Mete siy pwopriyetè a lè w ap voye mesaj nan bis evènman an. Sa nesesè pou swiv koneksyon sèvis atravè bis la. Ou ka voye tou de done idempotan nan bis la, ki pa ogmante koneksyon sèvis yo (ki se yon bon bagay), ak done biznis ki ranfòse koneksyon an nan sèvis (ki se trè move!). Ak nan pwen lè koneksyon sa a vin yon pwoblèm, konprann ki moun ki ekri ak li bis la ede byen separe sèvis yo.

Pa gen anpil konvansyon nan Avito ankò, men pisin yo ap agrandi. Plis akò sa yo disponib nan yon fòm ke ekip la konprann ak konprann, se pi fasil pou kenbe konsistans ant mikwosèvis yo.

Tès sentetik

• Tès bouk fèmen. Pou sa kounye a nou ap itilize sous louvri Hoverfly.io. Premyèman, li anrejistre chaj reyèl la sou sèvis la, Lè sa a, - jis nan yon bouk fèmen - li imite li.

• Tès Estrès. Nou eseye pote tout sèvis yo nan pèfòmans optimal. Ak tout vèsyon nan chak sèvis yo dwe sijè a tès chaj - fason sa a nou ka konprann pèfòmans aktyèl la nan sèvis la ak diferans lan ak vèsyon anvan yo nan menm sèvis la. Si, apre yon aktyalizasyon sèvis, pèfòmans li yo tonbe nan yon fwa ak yon mwatye, sa a se yon siyal klè pou mèt li yo: ou bezwen fouye nan kòd la ak korije sitiyasyon an.
Nou itilize done yo kolekte, pou egzanp, kòrèkteman aplike oto dekale epi, nan fen a, jeneralman konprann kouman évolutive sèvis la.

Pandan tès chaj, nou tcheke si konsomasyon resous satisfè limit yo. Epi nou konsantre prensipalman sou ekstrèm.

a) Nou gade chaj total la.
- Twò piti - gen plis chans yon bagay pa travay nan tout si chaj la toudenkou gout plizyè fwa.
- Twò gwo - optimize obligatwa.

b) Nou gade koupe a dapre RPS.
Isit la nou gade nan diferans ki genyen ant vèsyon aktyèl la ak youn anvan an ak kantite total. Pou egzanp, si yon sèvis pwodui 100 rps, Lè sa a, li se swa mal ekri, oswa sa a se espesifik li yo, men nan nenpòt ka, sa a se yon rezon ki fè yo gade nan sèvis la trè pre.
Si, okontrè, gen twòp RPS, Lè sa a, petèt gen yon kalite ensèk ak kèk nan pwen final yo te sispann egzekite chaj la, ak kèk lòt se tou senpleman deklanche. return true;

Tès Canary

Apre nou fin pase tès sentetik yo, nou teste mikwosèvis la sou yon ti kantite itilizatè. Nou kòmanse ak anpil atansyon, ak yon ti pati nan odyans entansyonèl sèvis la - mwens pase 0,1%. Nan etap sa a, li trè enpòtan ke mezi teknik ak pwodwi kòrèk yo enkli nan siveyans la pou yo montre pwoblèm nan nan sèvis la pi vit ke posib. Tan minimòm pou yon tès Canary se 5 minit, prensipal la se 2 èdtan. Pou sèvis konplèks, nou mete tan an manyèlman.
Ann analize:
— mezi espesifik lang, an patikilye, travayè php-fpm;
— erè nan Sentry;
— sitiyasyon repons;
— tan repons, egzak ak mwayèn;
- latansi;
— eksepsyon, trete ak unhandled;
- mezi pwodwi.

Tès peze

Tès Squeeze yo rele tou tès "peze". Non teknik la te prezante nan Netflix. Sans li se ke premye nou ranpli yon egzanp ak trafik reyèl nan pwen nan echèk epi konsa mete limit li yo. Lè sa a, nou ajoute yon lòt egzanp epi chaje pè sa a - ankò nan maksimòm la; nou wè plafon yo ak delta ak premye "peze". Se konsa, nou konekte yon egzanp nan yon moman epi kalkile modèl chanjman an.
Done tès yo atravè "peze" tou ap koule nan yon baz done mezi komen, kote nou swa anrichi rezilta chaj atifisyèl yo ak yo, oswa menm ranplase "sentetik" ak yo.

Pwodiksyon

• Echèl. Lè nou woule yon sèvis nan pwodiksyon, nou kontwole kijan li balanse. Nan eksperyans nou an, siveyans sèlman endikatè CPU pa efikas. Eskalad oto ak RPS benchmarking nan fòm pi li yo ap travay, men sèlman pou sèten sèvis, tankou difizyon sou entènèt. Se konsa, nou gade premye nan mezi aplikasyon-espesifik pwodwi.

Kòm yon rezilta, lè dekale nou analize:
- CPU ak RAM endikatè,
- kantite demann nan keu a,
- tan repons,
— pwevwa ki baze sou done istorik akimile.

Lè w ap monte yon sèvis, li enpòtan tou pou kontwole depandans li yo pou nou pa echèl premye sèvis la nan chèn lan, ak moun li jwenn yo echwe anba chaj. Pou etabli yon chaj akseptab pou tout pisin sèvis la, nou gade done istorik sèvis depandan ki pi pre a (ki baze sou yon konbinezon CPU ak endikatè RAM, makonnen ak mezi espesifik aplikasyon an) epi konpare yo ak done istorik yo. nan sèvis inisyalize a, ak sou sa nan tout "chèn depandans" ", soti anwo jouk anba.

Sèvis

Apre yo fin mete mikwosèvis la an fonksyon, nou ka tache deklanche sou li.

Isit la yo se sitiyasyon tipik nan ki deklanche rive.
— Yo detekte migrasyon ki kapab danjere.
— Mizajou sekirite yo te pibliye.
— Sèvis nan tèt li pa te mete ajou pou yon tan long.
— Chaj la sou sèvis la notables diminye oswa kèk nan mezi pwodwi li yo andeyò seri nòmal la.
— Sèvis la pa satisfè kondisyon nouvo platfòm yo ankò.

Gen kèk nan deklannche yo responsab pou estabilite nan operasyon, kèk - kòm yon fonksyon nan antretyen sistèm - pou egzanp, kèk sèvis pa te deplwaye pou yon tan long ak imaj baz li yo sispann pase chèk sekirite.

Dach

Nan ti bout tan, tablodbò a se panèl kontwòl tout PaaS nou an.

  • Yon sèl pwen enfòmasyon sou sèvis la, ak done sou kouvèti tès li yo, kantite imaj li yo, kantite kopi pwodiksyon, vèsyon, elatriye.
  • Yon zouti pou filtre done pa sèvis ak etikèt (makè ki fè pati inite biznis, fonksyonalite pwodwi, elatriye)
  • Yon zouti pou entegrasyon ak zouti enfrastrikti pou trase, anrejistreman, ak siveyans.
  • Yon sèl pwen nan dokiman sèvis.
  • Yon sèl pwen de vi nan tout evènman atravè sèvis yo.

Ki sa nou konnen sou mikwosèvis yo
Ki sa nou konnen sou mikwosèvis yo
Ki sa nou konnen sou mikwosèvis yo
Ki sa nou konnen sou mikwosèvis yo

Nan total

Anvan entwodwi PaaS, yon nouvo pwomotè te kapab pase plizyè semèn konprann tout zouti ki nesesè pou lanse yon mikwosèvis nan pwodiksyon: Kubernetes, Helm, karakteristik entèn TeamCity nou an, etabli koneksyon ak baz done ak kachèt nan yon fason ki toleran defo, elatriye. pran yon koup la èdtan pou li demaraj rapid la ak kreye sèvis la tèt li.

Mwen te bay yon rapò sou sijè sa a pou HighLoad++ 2018, ou ka gade li videyo и prezantasyon.

Bonus track pou moun ki li jiska lafen

Nou nan Avito ap òganize yon fòmasyon entèn twa jou pou devlopè soti nan Chris Richardson, yon ekspè nan achitekti mikwosèvis. Nou ta renmen bay youn nan lektè pòs sa a opòtinite pou patisipe ladan l. Isit la Yo afiche pwogram fòmasyon an.

Fòmasyon an pral pran plas soti nan Out 5 a 7 nan Moskou. Sa yo se jou travay ki pral konplètman okipe. Manje midi ak fòmasyon yo pral nan biwo nou an, epi patisipan yo chwazi a ap peye pou vwayaj ak aranjman tèt li.

Ou ka aplike pou patisipasyon nan fòm google sa a. Nan men ou - repons lan nan kesyon an poukisa ou bezwen ale nan fòmasyon an ak enfòmasyon sou fason yo kontakte ou. Reponn an Angle, paske Chris ap chwazi patisipan an ki pral patisipe nan fòmasyon an tèt li.
Nou pral anonse non patisipan fòmasyon an nan yon ajou nan pòs sa a ak sou rezo sosyal Avito pou devlopè (AvitoTech nan Facebook, Vkontakte, Twitter) pa pita pase 19 jiyè.

Sous: www.habr.com

Add nouvo kòmantè