Historia e arkitekturës Dodo IS: monoliti i hershëm

Ose çdo kompani e palumturuar me një monolit është e palumturuar në mënyrën e saj.

Zhvillimi i sistemit Dodo IS filloi menjëherë pas fillimit të biznesit Dodo Pizza - në vitin 2011. Ideja themelore ishte digjitalizimi i plotë dhe total i proceseve të biznesit, dhe me forcat tona, gjë që atëherë në vitin 2011 shkaktoi shumë pyetje dhe skepticizëm. Por tani, pas 9 vjetësh, ne po ndjekim këtë rrugë - me zhvillimin tonë, i cili filloi me një monolit.

Ky artikull është "përgjigje" për pyetjet "Pse të rishkruajmë arkitekturën dhe të bëjmë ndryshime të tilla masive dhe të gjata?" ndaj artikullit të mëparshëm "Historia e arkitekturës Dodo IS: rruga e bërthamës".. Do të filloj me mënyrën se si filloi zhvillimi i Dodo IS, si dukej arkitektura fillestare, si u shfaqën modulet e reja dhe për çfarë problemeve u kërkua të bëhen ndryshime masive.

Historia e arkitekturës Dodo IS: monoliti i hershëm

Seria e artikujve "ÇfarĂ« Ă«shtĂ« Dodo IS?" do tĂ« flasĂ« pĂ«r:

  1. Monoliti i hershëm në Dodo IS (2011-2015). (Ju jeni këtu)

  2. Rruga e bërthamës: baza të ndara dhe busi.

  3. Rruga e pjesës së klientit: fasada mbi bazë (2016-2017). (Në përparim
)

  4. Historia e mikroshërbimeve të vërteta. (2018-2019). (Në përparim
)

  5. Përfundimi i prishjes së monolitit dhe stabilizimi i arkitekturës. (Në përparim
)

Arkitektura fillestare

Në vitin 2011, arkitektura e Dodo IS dukej kështu:

Historia e arkitekturës Dodo IS: monoliti i hershëm

Moduli i parë në arkitekturë është pranimi i porosisë. Procesi i biznesit ishte i tillë:

  • klienti telefonon nĂ« restorantin e picave;

  • menaxheri e pĂ«rgjigjet telefonit;

  • pranon porosinĂ« me telefon;

  • paralelisht e regjistron atĂ« nĂ« ndĂ«rfaqen e pranimit tĂ« porosisĂ«: informacioni pĂ«r klientin merret parasysh, tĂ« dhĂ«nat pĂ«r detajet e porosisĂ«, adresĂ«n e dorĂ«zimit. 

Ndërfaqja e sistemit informatik dukej pak a shumë kështu...

Versioni i parë nga tetori 2011:

Pak i përmirësuar në janar 2012

Sistemi informatik Dodo Pizza Delivery Pizza Restaurant

Burimet për zhvillimin e modulit të parë të pranimit të porosisë ishin të kufizuara. Duhej të bënim shumë, shpejt dhe me një ekip të vogël. Ekip i vogël - ky ishte 2 zhvillues, të cilët vendosën themelet e gjithë sistemit të ardhshëm.

Zgjidhja e tyre të parëndësishme përcaktuan fatin e mëtejshëm të grupit teknologjik:

  • Backend nĂ« ASP.NET MVC, gjuha C#. Zhvilluesit ishin ndĂ«rlidhĂ«s, ky grup ishte i njohur dhe i kĂ«ndshĂ«m pĂ«r ta.

  • Frontend nĂ« Bootstrap dhe JQuery: ndĂ«rfaqet e pĂ«rdoruesit nĂ« stil dhe skripte tĂ« krijuara vetĂ«. 

  • Baza e tĂ« dhĂ«nave MySQL: pa kosto pĂ«r licenca, e lehtĂ« pĂ«r tu pĂ«rdorur.

  • Serverat nĂ« Windows Server, sepse .NET atĂ«herĂ« mund tĂ« ishte vetĂ«m nĂ«n Windows (Mos e diskutojmĂ« Mono).

Fizikisht, kjo shprehej në "dedikimin te hosti". 

Arkitektura e aplikacionit të pranim-urdhrave

Atëherë të gjithë flisnin për mikroshërbime, ndërsa SOA ishte përdorur për rreth 5 vjet në projekte të mëdha, për shembull, WCF doli në vitin 2006. Por atëherë u zgjodh një zgjidhje e besueshme dhe e provuar.

Këtu është.

Historia e arkitekturës Dodo IS: monoliti i hershëm

Asp.Net MVC është Razor, i cili lëshon një faqe HTML me renditje në server sipas kërkesës nga forma ose ndonjë klienti. Në klient tashmë CSS dhe scriptet JS paraqesin informacionin dhe, sipas nevojës, kryejnë kërkesa AJAX përmes JQuery.

KĂ«rkesat nĂ« server kalojnĂ« nĂ« klasat *Controller, ku nĂ« metodĂ« ndodh pĂ«rpunimi dhe gjenerimi i faqes finale HTML. KontrollorĂ«t bĂ«jnĂ« kĂ«rkesa nĂ« nivelin e logjikĂ«s, tĂ« quajtur *Services. Çdo shĂ«rbim pĂ«rgjigjej pĂ«r njĂ« aspekt tĂ« caktuar tĂ« biznesit:

  • PĂ«r shembull, DepartmentStructureService jepte informacion mbi pizzeritĂ« dhe departamentet. Departamenti Ă«shtĂ« njĂ« grup pizzerish nĂ«n menaxhimin e njĂ« franshizuesi.

  • ReceivingOrdersService pranonte dhe llogariste pĂ«rbĂ«rjen e porosisĂ«.

  • Dhe SmsService dĂ«rgonte SMS, duke thirrur shĂ«rbime API pĂ«r dĂ«rgimin e SMS-ve.

Shërbimet përpunonin të dhënat nga baza, ruanin logjikën e biznesit. Në secilin shërbim kishte një ose më shumë *Repository me emra përkatës. Ato përmbanin kërkesat për procedurat e ruajtura në bazë dhe nivelin e mapuesve. Në procedurat e ruajtura ishte logjika e biznesit, sidomos shumë në ato që jepnin të dhëna raportuese. ORM nuk ishte përdorur, të gjithë mbështeteshin në SQL të shkruar me dorë. 

Ishte gjithashtu një nivel modeli domene dhe klasash ndihmëse të përgjithshme, për shembull, klasa Order, e cila përmbante porosinë. Atje, në nivelin e ndihmësve, ndodhej një ndihmës për konvertimin e tekstit të shfaqjes sipas monedhës së zgjedhur.

E gjithë kjo mund të paraqitet me këtë model:

Historia e arkitekturës Dodo IS: monoliti i hershëm

Rruga e porosisë

Le të shqyrtojmë rrugën e thjeshtuar fillestare të krijimit të një porosie të tillë.

Historia e arkitekturës Dodo IS: monoliti i hershëm

Fillimisht, faqja ishte statike. Ajo kishte çmime, dhe lart shkruhej numri i telefonit dhe titulli "DĂ«shiron pica – telefononi nĂ« numĂ«r dhe porositni". PĂ«r tĂ« bĂ«rĂ« njĂ« porosi, na duhej tĂ« zbatonim njĂ« fluks tĂ« thjeshtĂ«: 

  • Klienti hyn nĂ« faqen statike me çmimet, zgjedh produktet dhe telefonon nĂ« numrin e dhĂ«nĂ« nĂ« faqe.

  • Klienti pĂ«rmend produktet qĂ« dĂ«shiron tĂ« shtojĂ« nĂ« porosi.

  • PĂ«rmend adresĂ«n dhe emrin e tij.

  • Operatori pranon porosinĂ«.

  • Porosia shfaqet nĂ« ndĂ«rfaqen e porosive tĂ« pranuara.

E gjithëçka fillon me paraqitjen e menusë. Përdoruesi operator i lidhur në një moment e pranon vetëm një porosi. Prandaj, karroca draft mund të ruhet në sesionin e tij (sesioni i përdoruesit ruhet në memorie). Aty është objekti Cart, në të cilin ndodhen produktet dhe informacioni mbi klientin.

Klienti thotë produktin, operatori klikojnë në + në anë të produktit, dhe në server dërgohet një kërkesë. Nga produkti merret informacioni nga baza dhe informacioni mbi produktin shtohet në karrocë.

Historia e arkitekturës Dodo IS: monoliti i hershëm

Shënim. Po, këtu mund të mos merret produkti nga baza, por të dërgohet nga frontend. Por për transparencë unë e tregova pikërisht rrugën nga baza. 

Më pas, vendosim adresën dhe emrin e klientit. 

Historia e arkitekturës Dodo IS: monoliti i hershëm

Kur klikoni "Krijo porosi":

  • DĂ«rgojmĂ« kĂ«rkesĂ«n nĂ« OrderController.SaveOrder().

  • Marrim Cart nga sesioni, aty ndodhen produktet nĂ« sasinĂ« e nevojshme.

  • Shtohet informacioni mbi klientin nĂ« Cart dhe e dĂ«rgojmĂ« nĂ« metodĂ«n AddOrder tĂ« klasĂ«s ReceivingOrderService, ku ruhet nĂ« bazĂ«. 

  • NĂ« bazĂ« ka tabela me porosi, pĂ«rbĂ«rjen e porosisĂ«, klientin dhe tĂ« gjitha janĂ« tĂ« lidhura.

  • NdĂ«rfaqja e paraqitjes sĂ« porosisĂ« shkon dhe merr porositĂ« mĂ« tĂ« fundit dhe i reflektron ato.

Modules të reja

Pranimi i porosisĂ« ishte i rĂ«ndĂ«sishĂ«m dhe i nevojshĂ«m. Nuk mund tĂ« bĂ«sh biznes nĂ« shitjen e pizzave, nĂ«se nuk ke njĂ« sistem pĂ«r pranimin e porosive pĂ«r shitje. Prandaj, sistemi filloi tĂ« pĂ«rmirĂ«sohej me funksionalitete — rreth 2012 deri nĂ« 2015. GjatĂ« kĂ«saj kohe u shfaqĂ«n shumĂ« blloqe tĂ« ndryshme tĂ« sistemit, tĂ« cilat do t'i quaj modulet, nĂ« kontrast me konceptin e shĂ«rbimit apo produktit. 

Moduli është një grup funksionesh që janë të bashkuara nga një objektiv i përbashkët biznesi. Në të njëjtën kohë, ato fizikisht ndodhen në një aplikacion.

Modulet mund të quhen blloqe të sistemit. Për shembull, ky është moduli i raporteve, ndërfaqet eAdmin. ndjekësi i produkteve në kuzhinë, identifikimi. Të gjitha këto janë ndërfaqe të ndryshme për përdoruesin, disa madje kanë edhe stile vizuale të ndryshme. Të gjitha janë brenda një aplikacioni, një procesi funksionimi. 

Teknikisht, modulet ishin tĂ« dekoruara si Area (kjo ide ka mbetur edhe nĂ« asp.net core). Kishin skedar tĂ« ndara pĂ«r frontend-in, modelet, si dhe klasat e tyre tĂ« kontrollorĂ«ve. NĂ« fund, sistemi u transformua nga një 

Historia e arkitekturës Dodo IS: monoliti i hershëm


në këtë:

Historia e arkitekturës Dodo IS: monoliti i hershëm

Disa module janë realizuar si faqe të veçanta (projekti ekzekutiv), për shkak të funksionaliteteve tërësisht të veçanta dhe pjesërisht për shkak të zhvillimit më të fokusuar. Këto janë:

  • Faqja — versioni i parĂ« i faqes dodopizza.ru.

  • Eksporto: shkarkimi i raportimeve nga Dodo IS pĂ«r 1C. 

  • Personal — llogaria personale e punonjĂ«sit. U zhvillua veçmas dhe ka hyrje tĂ« vet dhe dizajn tĂ« veçantĂ«.

  • fs — projekt pĂ«r hostimin e statikĂ«s. MĂ« vonĂ« u shmangĂ«m nga kjo, duke e transferuar tĂ« gjithĂ« statikĂ«n nĂ« CDN Akamai. 

Blloqet e tjera ndodheshin në aplikacionin BackOffice. 

Historia e arkitekturës Dodo IS: monoliti i hershëm

Shpjegim mbi emrat:

  • Kasieri — Kasa e restorantit.

  • Menaxheri i NdĂ«rrimit — ndĂ«rfaqet pĂ«r rolin "Menaxher i NdĂ«rrimit": statistika operuese mbi shitjet e pizzarive, mundĂ«sia pĂ«r tĂ« vendosur produkte nĂ« listĂ«n e ndalimit, ndryshimi i porosisĂ«.

  • Menaxheri i ZyrĂ«s — ndĂ«rfaqet pĂ«r rolin "Menaxher i Pizzarive" dhe "Franshizuesi". KĂ«tu janĂ« mbledhur funksionet pĂ«r konfigurimin e pizzarive, promovimet e tyre, pranimin dhe punĂ«n me punonjĂ«sit, raportet.

  • Ekranet Publike — ndĂ«rfaqet pĂ«r televizorĂ«t dhe tabletĂ«t, tĂ« cilĂ«t varen nĂ« pizzari. NĂ« televizorĂ« shfaqet menyja, informacion reklamues, statusi i porosisĂ« gjatĂ« dorĂ«zimit. 

Ata përdorën një shtresë të përbashkët shërbimesh, një bllok të përbashkët të klasave domain Dodo.Core, si dhe një bazë të përbashkët. Ndonjëherë mund të kalonin nga njëri te tjetri. Përfshirë shërbimet e përbashkëta, vizitonin edhe faqet e veçanta, si dodopizza.ru ose personal.dodopizza.ru.

Me shfaqjen e moduleve të reja, u përpoqëm të ri-përdorim kodin e tashmë krijuar të shërbimeve, procedurave të ruajtura dhe tabelave në bazë. 

Për një kuptim më të mirë të shkallës së moduleve të bëra në sistem, ja skema nga viti 2012 me planet e zhvillimit:

Historia e arkitekturës Dodo IS: monoliti i hershëm

Deri në vitin 2015, gjithçka në skemë dhe madje më shumë ishte në prodhim.

  • Pranimi i porosisĂ« u shndĂ«rrua nĂ« njĂ« bllok tĂ« veçantĂ« tĂ« QendrĂ«s sĂ« Kontaktit, ku porosia pranoheshin nga operatori.

  • ShfaqĂ«n ekrane publike me meny dhe informacion, tĂ« cilat varen nĂ« pizzari.

  • NĂ« kuzhinĂ« ka njĂ« modul, i cili automatikisht riprodhon njĂ« mesazh me zĂ« "Pizza e re" me pranimin e njĂ« porosie tĂ« re, si dhe printon njĂ« fletĂ« dĂ«rgesĂ« pĂ«r kurierin. Kjo e thjeshton shumĂ« proceset nĂ« kuzhinĂ«, duke lejuar qĂ« punonjĂ«sit tĂ« mos shqetĂ«sohen nga njĂ« numĂ«r i madh operacionesh tĂ« thjeshta.

  • Blloku i dorĂ«zimit u bĂ« njĂ« KasĂ« e VeçantĂ« e DorĂ«zimit, ku porosia i jepet kurierit, i cili fillimisht ishte caktuar nĂ« ndĂ«rrim. Koha e tij e punĂ«s u lĂ«shua pĂ«r mbajtjen e pagĂ«s. 

Paralelisht nga 2012 deri në 2015 u shfaqën më shumë se 10 zhvillues, u hapën 35 pizzeri, u zhvillua një sistem për Rumani dhe u përgatitën pika për hapje në SHBA. Zhvilluesit nuk merreshin më me të gjitha detyrat, por u ndanë në grupe; secila specializohej në pjesën e saj të sistemit. 

Problemet

Përfshirë edhe për shkak të arkitekturës (por jo vetëm).

Kaosi në bazë

NjĂ« bazĂ« — Ă«shtĂ« e pĂ«rshtatshme. Ajo mund tĂ« arrijĂ« konsistencĂ«, pĂ«rmes mjeteve tĂ« integruara nĂ« bazat relacionale. TĂ« punosh me tĂ« Ă«shtĂ« e njohur dhe e lehtĂ«, veçanĂ«risht nĂ«se ka pak tabela dhe pak tĂ« dhĂ«na.

Por gjatë 4 viteve të zhvillimit, në bazë rezultuan rreth 600 tabela, 1500 procedura të ruajtura, shumë prej të cilave kishin gjithashtu logjikë. Fatkeqësisht, procedurat e ruajtura nuk ofrojnë ndonjë përfitim të veçantë kur punohet me MySQL. Ato nuk keqen nga baza, dhe ruajtja e logjikës në to e komplikon zhvillimin dhe kërkimin. Rishfrytëzimi i kodit gjithashtu është i vështirë.

NĂ« shumĂ« tabela nuk kishte indekse tĂ« pĂ«rshtatshme, ndonjĂ«herĂ«, pĂ«rkundrazi, kishte shumĂ« indekse, tĂ« cilat e vĂ«shtirĂ«sonin inserimin. Duhej tĂ« modifikoheshin rreth 20 tabela — transaksioni pĂ«r krijimin e njĂ« porosie mund tĂ« zgjaste rreth 3-5 sekonda. 

Të dhënat në tabela nuk ishin gjithmonë në formën më të përshtatshme. Diku duhej të bëhej denormalizim. Një pjesë e të dhënave që merreshin rregullisht ishte në një kolone në formën e një strukture XML, kjo e rritte kohën e ekzekutimit, zgjaste kërkesat dhe e komplikonte zhvillimin.

Ngarkoheshin shumë kërkesa të larmishme. Veçanërisht vuajtën tabelat e njohura, si tabela e përmendur orders ose tabela pizzeria. Ato përdoren për të treguar ndërfaqen operative në kuzhinë, analitikën. Po ashtu, u referoheshin nga uebsajti (dodopizza.ru), ku në çdo moment mund të vinin papritur shumë kërkesa. 

Të dhënat nuk ishin të agreguara dhe shumë llogaritje ndodhnin në fluturim me mjetet e bazës. Kjo krijonte llogaritje të panevojshme dhe një ngarkesë shtesë. 

Shpesh, kodi hynte në bazë kur nuk kishte pse ta bënte këtë. Diku mungonin operacionet bulk, diku duhej të shpërndaheshin një kërkesë në disa të tjera përmes kodit, për të përshpejtuar dhe rritur besueshmërinë. 

Lidhshmëria dhe ngathtësia në kod

Modulet, të cilat duhej të përgjigjeshin për sektorin e tyre të biznesit, nuk e bënin këtë me sinqeritet.. Disa prej tyre kishin dublim të funksioneve për rolet. Për shembull, një marketer lokal, i cili përgjigjej për aktivitetin marketingut në rrjet në qytetin e tij, ishte e nevojshme që të përdorte si ndërfaqen "Administrator" (për krijimin e promovimeve), ashtu edhe ndërfaqen "Menaxheri i Zyrës" (për të parë ndikimin e promovimeve në biznes). Sigurisht, brenda të dy modulit përdornin një shërbim të përbashkët, i cili punonte me promovimet bonus.

Shërbimet (klasat brenda një projekti të madh monolitik) mund të thërrisnin njëra-tjetrën për të pasuruar të dhënat e tyre.

Me klasat e modeleve vetë, të cilat ruanin të dhënat, puna në kod bëhej në mënyra të ndryshme. Diku kishte konstruktora, përmes të cilave mund të specifikonin fushat e detyrueshme. Diku kjo bëhej përmes pronave publike. Sigurisht, marrja dhe përpunimi i të dhënave nga baza ishte e larmishme. 

Logjika ishte ose në kontrollet, ose në klasat e shërbimeve. 

Këto duken si probleme të vogla, por ato ngadalësonin shumë zhvillimin dhe ulin cilësinë, që çonte në paqëndrueshmëri dhe gabime. 

Kompleksiteti i zhvillimit të madh

Vështirësitë ndodhën edhe në zhvillim. Duhej të bëheshin blloqe të ndryshme të sistemit, për më tepër paralelisht. Përfshirja e nevojave të çdo komponenti në një kod të vetme po bëhej gjithnjë e më e vështirë. Nuk ishte e lehtë të binin dakord dhe të kënaqnin të gjithë komponentët njëkohësisht. Këtyre iu shtuan kufizimet në teknologji, veçanërisht në lidhje me bazën dhe front-endin. Duhej të heqeshim dorë nga JQuery në favor të kornizave të nivelit të lartë, sidomos në pjesën e shërbimeve klientike (faqja).

Në disa pjesë të sistemit mund të përdoret baza, më e përshtatshme për këtë. Për shembull, më vonë patëm një precedent kalimi nga Redis në CosmosDB për ruajtjen e shportës së porosisë. 

Ekipet dhe zhvilluesit që merren me fushat e tyre, qartë donin më shumë autonomi për shërbimet e tyre, si në aspektin e zhvillimit, ashtu edhe në atë të publikimit. Konfliktohen gjatë bashkimit, probleme gjatë lëshimeve. Nëse për 5 zhvillues këtë problem nuk është substancial, për 10, e sidomos në rritjen e planifikuar, gjithçka do të bëhej më serioze. Dhe përpara duhej të kishte zhvillim të aplikacionit mobil (ai filloi në 2017, dhe në 2018 ishte rënia e madhe). 

Pjesë të ndryshme të sistemit kërkonin tregues të ndryshëm stabiliteti., por shkak të lidhjes së fortë të sistemit, ne nuk mund ta siguronim këtë. Një gabim në zhvillimin e një funksioni të ri në panel mund të ishte shkaktari i problematikave gjatë procesit të porosisë në faqe, pasi kodi është i përbashkët dhe i ricikluar, baza dhe të dhënat gjithashtu janë të njëjta.

Ndoshta do të ishte e mundur të mos lejohej këto gabime dhe probleme në kuadër të një arkitekture monolitike-modulare: të bëhej ndarja e përgjegjësive, të kryhej refaktorizimi si i kodit, ashtu edhe i bazës së të dhënave, të ndaheshin qartë shtresat nga njëra-tjetra, dhe të kontrollohej cilësia çdo ditë. Por vendimet arkitektonike të zgjedhura dhe fokusimi në zgjerimin e shpejtë të funksionalitetit të sistemit çuan në probleme sa i përket stabilitetit.

Si blogu Sila e mendjes dërgoi të ardhurat në restorante

Nëse rritja e rrjetit të picerive (dhe ngarkesave) do të vazhdonte me të njëjtin ritëm, pas disa kohësh rëniet do të ishin të tilla që sistemi nuk do të ngrinte më. Një histori e tillë ilustron mirë problemet me të cilat filluam të përballeshim në vitin 2015. 

NĂ« blogun „Sila e mendjes“ kishte njĂ« widget qĂ« shfaqte tĂ« dhĂ«nat mbi tĂ« ardhurat pĂ«r vitin e gjithĂ« rrjetit. Widgeti i referohej API-sĂ« publike Dodo, e cila ofron kĂ«to tĂ« dhĂ«na. Tani kjo statistikĂ« Ă«shtĂ« e disponueshme nĂ« http://dodopizzastory.com/. Widgeti shfaqej nĂ« çdo faqe dhe bĂ«nte kĂ«rkesa nĂ« intervale çdo 20 sekonda. KĂ«rkesa shkonte nĂ« api.dodopizza.ru dhe kĂ«rkonte:

  • numrin e picerive nĂ« rrjet;

  • tĂ« ardhurat totale tĂ« rrjetit nga fillimi i vitit;

  • tĂ« ardhurat pĂ«r sot.

Kërkesa për statistikën mbi të ardhurat shkonte direkt në bazë dhe fillonte të kërkonte të dhënat mbi porositë, duke i agreguar ato në kohë reale dhe duke dhënë shumën. 

Në të njëjtën tabelë porosish hynin Kassat në restorante, nxirrnin listën e porosive të pranuara për sot, dhe përfshinin edhe porosi të reja. Kassat bënin kërkesat e tyre çdo 5 sekonda ose me rinovimin e faqes.

Skema dukej kështu:

Historia e arkitekturës Dodo IS: monoliti i hershëm

Një herë në vjeshtë, Fyodor Ovchinnikov shkroi një artikull të gjatë dhe popullor në blogun e tij. Në blog erdhën shumë njerëz dhe filluan ta lexonin me kujdes. Ndërsa secili nga ata që erdhën lexonte artikullin, widgeti me të ardhurat punonte siç duhet dhe bënte kërkesa në API çdo 20 sekonda.

API ka thirrur procedurën e ruajtur për llogaritjen e shumës së të gjitha porosive që nga fillimi i vitit në të gjitha pica-terit e rrjetit. Agregimi po bëhej mbi tabelën porositë, e cila është shumë e njohur. Në të hynin të gjitha kasat e të gjitha restoranteve të hapura në atë moment. Kassat ndaluan së përgjiguri, porositë nuk u pranohen. Po ashtu, ato nuk pranoheshin nga faqja, nuk shfaqeshin në tracker, menaxheri i ndërrimit nuk mund t'i shihte ato në ndërfaqen e tij. 

Kjo nuk është historia e vetme. Deri në vjeshtën e vitit 2015, ngarkesa në sistem ishte kritike çdo të premte. Disa herë e çuam jashtë funksionit API publik, dhe një herë, na duhej madje të fiknim faqen, sepse asgjë nuk ndihmonte. Madje kishte një listë shërbimesh me rregullin e fikjes në rast ngarkesash serioze.

Nga kjo kohë fillon lufta jonë me ngarkesat dhe për stabilizimin e sistemit (nga vjeshta e vitit 2015 deri në vjeshtën e vitit 2018). Pikërisht atëherë ndodhi "Rënia e madhe". Përpara ndodhnin ndodhi herë pas here, disa ishin shumë të ndjeshme, por periudha e përgjithshme e paqëndrueshmërisë tani mund të konsiderohet e kaluar.

Rritja e shpejtë e biznesit

Pse nuk mund të "bëhej menjëherë mirë"? Mjafton të shikosh grafikun e mëposhtëm.

Historia e arkitekturës Dodo IS: monoliti i hershëm

Gjithashtu, në vitet 2014-2015 u hap një degë në Rumani dhe u përgatit hapja e një dege në SHBA.

Rrjeti po rritej shumë shpejt, po hapeshin vende të reja, po shfaqeshin formate të reja të picerive, për shembull, një pica-ter është hapur në një food court. Të gjitha këto kërkonin vëmendje të konsiderueshme pikërisht për zgjerimin e funksioneve Dodo IS. Pa të gjitha këto funksione, pa gjurmimin në kuzhinë, regjistrimin e produkteve dhe humbjeve në sistem, shfaqjen e porosive në sallën e food court, nuk do të flisnim tani për "arkitekturën e duhur" dhe "qasjen e saktë" në zhvillim.

Po ashtu pengesat për rishikimin e kohës së arkitekturës dhe në përgjithësi vëmendjen ndaj problemeve teknike ishte kriza e vitit 2014. Këto gjëra godasin rëndë mundësitë për rritjen e ekipeve, veçanërisht për bizneset e reja, siç ishte Dodo Pica.

Zgjidhjet e shpejta që ndihmuan

Problemet kërkonin zgjidhje. Në mënyrë të përgjithshme, zgjidhjet mund të ndahen në 2 grupe:

  • TĂ« shpejtat, tĂ« cilat shuajnĂ« zjarrin dhe ofrojnĂ« njĂ« rezervĂ« tĂ« vogĂ«l forcĂ« dhe na fitojnĂ« kohĂ« pĂ«r ndryshime.

  • Sistematike dhe, pĂ«r kĂ«tĂ« arsye, tĂ« gjatĂ«. Ristrukturimi i disa moduleve, ndarja e arkitekturĂ«s monolitike nĂ« shĂ«rbime tĂ« veçanta (shumica e tyre janĂ« pĂ«r t'u konsideruar mĂ« shumĂ« makro-shĂ«rbime sesa mikro, dhe pĂ«r kĂ«tĂ« ka) raporti i Andrey Morievsky). 

Lista e shkurtër e ndryshimeve është si vijon:

Shkalla deri te master baza

Sigurisht, e para gjë që bëhet për të përballuar ngarkesat është të rritet fuqia e serverit. Kjo është bërë për master bazën dhe për serverët web. Fatkeqësisht, kjo është e mundur vetëm deri në një kufi të caktuar, më tej bëhet shumë e shtrenjtë.

Që nga viti 2014 ne kaluam në Azure, për këtë temë ne gjithashtu kemi shkruar që në atë kohë në artikullin "Si Dodo Pizza dërgon pizzat me ndihmën e Microsoft Azure". Por pas një vargu rritjesh të serverëve për bazën, ne u goditëm nga çmimi. 

Replika e bazës për lexim

U krijuan dy replika për bazën:

ReadReplica për kërkesa mbi referencat. Ajo përdoret për leximin e referencave, si qytetet, rrugët, pizzëritë, produktet (domen afatshkurtër të ndryshuar), dhe në ato ndërfaqe ku pranohet një vonesë e vogël. Këto replika ishin 2, ne i siguruan ato po ashtu si masterin.

ReadReplica për kërkesa mbi raporte. Në këtë bazë, disponueshmëria ishte më e ulët, por të gjitha raportet kalonin aty. Edhe pse kishte kërkesa të rënda mbi përllogaritje të mëdha, ato nuk ndikojnë në bazën kryesore dhe në ndërfaqet operative. 

Cache në kod

Nuk kishte kesh në kod (asgjë). Kjo shkaktonte kërkesa shtesë, jo gjithmonë të nevojshme, në bazën e ngarkuar. Kesh ishin fillimisht në memorje, si dhe në një shërbim të jashtëm për kesh, ishte Redis. Të gjitha u invaliduan sipas kohës, konfigurimet u tregoheshin në kod.

Disa servera për backend

Backend i aplikacionit gjithashtu duhej të jetë e përshtatur për të përballuar ngarkesat e rritura. Duhej bërë një klaster nga një server i vetëm i iis. Ne e transferuam sesionin e aplikacioneve nga memorja në RedisCache, gjë që lejoj të ketë disa servera, që qëndrojnë pas një balancuesi thjeshtë ngarkese me round robin. Fillimisht u përdor i njëjti Redis, që përdorej edhe për keshët, pastaj u shpërndan në disa. 

NĂ« fund, arkitektura u komplikuar...

Historia e arkitekturës Dodo IS: monoliti i hershëm

...por një pjesë e tensionit arriti të hiqet.

Dhe më pas duhej të riemërtoheshin komponentët e ngarkuar, për të cilat ne u angazhuam. Për këtë do të flasim në pjesën tjetër.

Burimi: habr.com

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