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

Ose kompani të pafat me monolitin janë të pafat në mënyra të ndryshme.

Zhvillimi i sistemit Dodo IS filloi menjĂ«herĂ« pas themelimit tĂ« biznesit Dodo Pizza nĂ« vitin 2011. Ideja ishte digitalizimi i plotĂ« dhe total i proceseve tĂ« biznesit, me forcat tona, gjĂ« qĂ« atĂ«herĂ« nĂ« vitin 2011 shkaktoi shumĂ« pyetje dhe skepticizĂ«m. Por tani, pas 9 vjetĂ«sh, ne vazhdojmĂ« nĂ« kĂ«tĂ« rrugĂ« — me zhvillimin tonĂ«, qĂ« filloi me njĂ« monolit.

Ky artikull është "përgjigje" ndaj pyetjeve "Pse të rishkruhet arkitektura dhe të bëhen ndryshime kaq të mëdha dhe të gjatë?" ndaj artikullit të mëparshëm "Historia e arkitekturës Dodo IS: rruga e back-office".Do të filloj me se si filloi zhvillimi i Dodo IS, si dukej arkitektura origjinale, si u shfaqën modulet e reja dhe për çfarë problemesh duhej të bëheshin ndryshime të mëdha.

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 backoffice: baza të ndara dhe shina.

  3. Rruga e pjesës klient: fasada mbi bazën (2016-2017). (Në proces
)

  4. Historia e mikrosherbimeve reale. (2018-2019). (NĂ« proces
)

  5. Përfundimi i ndarjes së monolitit dhe stabilizimi i arkitekturës. (Në proces
)

Arkitektura origjinale

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

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

Moduli i parĂ« nĂ« arkitekturĂ« — pranimi i porosisĂ«. Procesi i biznesit ishte si mĂ« poshtĂ«:

  • klienti telefonon nĂ« pizzeria;

  • menaxheri pĂ«rgjigjet;

  • ai merr porosinĂ« pĂ«rmes telefonit;

  • paralelisht e regjistron atĂ« nĂ« ndĂ«rfaqen e pranimit tĂ« porosisĂ«: informacioni pĂ«r klientin, detajet e porosisĂ«, adresa e dĂ«rgesĂ«s, merren parasysh. 

Ndërfaqja e sistemit informativ dukej kështu...

Versioni i parë nga tetori 2011:

Pak e përmirësuar në janar 2012.

Sistemi informativ Dodo Pizza Delivery Pizza Restaurant

Burimet pĂ«r zhvillimin e modulit tĂ« parĂ« tĂ« pranimit tĂ« porosisĂ« ishin tĂ« kufizuara. Duhej tĂ« bĂ«hej shumĂ«, shpejt dhe me njĂ« grup tĂ« vogĂ«l. Grupi i vogĂ«l — ishin 2 zhvillues qĂ« ndĂ«rtuan themelet e tĂ« gjithĂ« sistemit tĂ« ardhshĂ«m.

Zgjidhja e parë e tyre përcaktoi fatin e stacks teknologjike:

  • Backend nĂ« ASP.NET MVC, gjuha C#. Zhvilluesit ishin dotnetçinj, kjo stack ishte e njohur dhe e kĂ«ndshme pĂ«r ta.

  • Frontend nĂ« Bootstrap dhe JQuery: ndĂ«rfaqet e pĂ«rdoruesit nĂ« stile dhe skripta tĂ« shkruar vetĂ«. 

  • Baza e tĂ« dhĂ«nave MySQL: pa shpenzime pĂ«r licenca, e lehtĂ« pĂ«r t’u pĂ«rdorur.

  • ServerĂ« nĂ« Windows Server, sepse .NET atĂ«herĂ« mund tĂ« ishte vetĂ«m nĂ«n Windows (nuk do tĂ« flasim pĂ«r Mono).

Fizikisht, gjithë kjo ishte shprehur në "dedikimin e hostit". 

Arkitektura e aplikacionit të pranimit të porosisë

Atëherë, të gjithë flisnin për mikroshërbime dhe 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.

Ja ajo.

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

Asp.Net MVC — Ă«shtĂ« Razor, qĂ« jep HTML-nĂ« nĂ« kĂ«rkesĂ« nga forma ose nga klienti me renderim nĂ« server. NĂ« klient, CSS dhe JS-skriptet tregojnĂ« informacionin dhe, sipas nevojĂ«s, kryejnĂ« kĂ«rkesa AJAX pĂ«rmes JQuery.

KĂ«rkesat nĂ« server shkojnĂ« nĂ« klasat *Controller, ku metodat trajtojnĂ« dhe gjenerojnĂ« HTML-nĂ« pĂ«rfundimtare. Kontrollet bĂ«jnĂ« kĂ«rkesa pĂ«r nivelin e logjikĂ«s, tĂ« quajtur *Services. Çdo shĂ«rbim ishte pĂ«rgjegjĂ«s pĂ«r njĂ« aspekt tĂ« caktuar tĂ« biznesit:

  • PĂ«r shembull, DepartmentStructureService jepte informacion pĂ«r pizzeritĂ«, pĂ«r departamentet. Departamenti — Ă«shtĂ« njĂ« grup pizzerish nĂ«n menaxhimin e njĂ« franchaizieri.

  • ReceivingOrdersService pranon dhe llogarit pĂ«rmbajtjen e porosisĂ«.

  • SmsService dĂ«rgon SMS, duke thirrur shĂ«rbimet e API pĂ«r dĂ«rgimin e SMS.

Shërbimet trajtojnë të dhënat nga baza, ruajnë logjikën e biznesit. Në çdo shërbim ka një ose më shumë *Repository me emrin përkatës. Në to gjenden kërkesat për procedurat e ruajtura në bazë dhe niveli i mapperëve. Në prosedurat e ruajtura ishte logjika e biznesit, veçanërisht shumë në ato që jepnin të dhëna raportuese. ORM nuk u përdor, të gjithë mbështeteshin në SQL të shkruar me dorë. 

Ishte gjithashtu një nivel modeli domene dhe klasash ndihmëse të zakonshme, për shembull, klasa Order, që mbante porosinë. Atje, në nivel, kishte një ndihmës për metamorfizimin e tekstit të paraqitjes sipas valutos së zgjedhur.

Të gjithë këto mund të paraqiten në një model të tillë:

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

Rruga e porosisë

Le të shqyrtojmë rrugën e thjeshtëzuar 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 sipĂ«r — numri i telefonit dhe shpallja "DĂ«shiron pica — telefononi dhe porositni". PĂ«r porosinĂ«, na duhej tĂ« realizonim njĂ« rrjedhĂ« tĂ« thjeshtĂ«: 

  • Klienti hyn nĂ« faqen statike me çmimet, zgjedh produktet dhe telefonon numrin qĂ« Ă«shtĂ« i shĂ«nuar nĂ« faqen.

  • 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.

Gjithçka fillon me shfaqjen e menusë. Një përdorues-operator i identifikuar pranon vetëm një porosi në një moment të caktuar. Pra, karroca draft mund të ruhen në sesionin e tij (seanca e përdoruesit ruhet në memorie). Atje është objekti Cart, në të cilin ndodhen produktet dhe informacioni për klientin.

Klienti përmend produktin, operatori klikon në + pranë produktit dhe dërgohet një kërkesë në server. Informacioni për produktin merret nga baza dhe shtohet në informacionin e produktit në karrocë.

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

Shënim. Po, këtu nuk është e nevojshme të nxirrni produktin nga baza, por mund të transferoni nga frontend. Megjithatë, për qartësi unë e tregova këtë rrugë nga baza. 

Pastaj, futni adresën dhe emrin e klientit. 

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

Kur klikoni "Krijo porosi":

  • KĂ«rkesa dĂ«rgohet nĂ« OrderController.SaveOrder().

  • Merrni KartĂ«n nga sesioni, ku ndodhen produktet nĂ« sasinĂ« e duhur.

  • PlotĂ«soni KartĂ«n me informacionin e klientit dhe kaloni nĂ« metodĂ«n AddOrder tĂ« klasĂ«s ReceivingOrderService, ku ajo ruhet nĂ« bazĂ«. 

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

  • Interfaci i shfaqjes sĂ« porosisĂ« merr dhe nxjerr porositĂ« mĂ« tĂ« fundit dhe i shfaq ato.

Module të reja

Pranimi i porosisë ishte i rëndësishëm dhe i nevojshëm. Nuk mund të bësh biznes me shitjen e picave nëse nuk ke një sistem për pranimin e porosive. Prandaj, sistemi filloi të zhvillohet me funksionalitete - nga rreth 2012 deri në 2015. Gjatë kësaj periudhe u krijuan shumë seksione të ndryshme të sistemit, të cilat do t'i quaj. modula, në kundërshtim me konceptin e shërbimit ose produktit. 

Moduli është një grup funksionesh që janë të bashkuara me një qëllim të përbashkët biznesor. Përveç kësaj, ato ndodhen fizikisht në një aplikacion.

Modulat mund të quhen blloqe të sistemit. Për shembull, ky është moduli i raporteve, ndërfaqet e adminit, ndjekësi i produkteve në kuzhinë, autorizimi. Të gjitha këto janë ndërfaqe të ndryshme për përdoruesin, disa prej të cilave kanë madje stile vizuale të ndryshme. Megjithatë, të gjitha janë brenda një aplikacioni, një procesi funksional. 

Nga pikĂ«pamja teknike, modulat ishin tĂ« organizuara si Area (njĂ« ide e tillĂ« ka mbetur nĂ« asp.net core). Aty ishin skedarĂ« tĂ« veçantĂ« pĂ«r frontend, 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ë një të tillë:

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

Disa modulet janë realizuar si faqe të veçanta (projekte ekzekutiv), për shkak të funksionalitetit të veçantë dhe pjesërisht për shkak të zhvillimit më të fokusuar. Këto janë:

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

  • Eksport: eksportimi i raporteve nga Dodo IS pĂ«r 1C. 

  • Personal — zyra personale e punonjĂ«sit. U zhvillua veçmas dhe ka pikĂ«n e tij tĂ« hyrjes dhe njĂ« dizajn tĂ« veçantĂ«.

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

Blloqet e tjera ishin brenda aplikacionit BackOffice. 

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

Shpjegimi për emrat:

  • Cashier — Kasa e restorantit.

  • ShiftManager — ndĂ«rfaqet pĂ«r rolin "Menaxheri i ndĂ«rrimit": statistika operative pĂ«r shitjet e picave, mundĂ«sia pĂ«r tĂ« vendosur produkte nĂ« listĂ«n e bardhĂ«, tĂ« ndryshoni porosinĂ«.

  • OfficeManager — ndĂ«rfaqet pĂ«r rolin "Menaxher i picerisĂ«" dhe "FrashizĂ«". KĂ«tu janĂ« mbledhur funksionet pĂ«r konfigurimin e picerisĂ«, promovimet e saj, pranimin dhe punĂ«n me punonjĂ«sit, raportet.

  • PublicScreens — ndĂ«rfaqet pĂ«r televizorĂ«t dhe tabletĂ«t, qĂ« varen nĂ« piceritĂ«. NĂ« televizorĂ« shfaqet menuja, informacioni reklamues, statusi i porosisĂ« nĂ« momentin e 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 në tjetrin. Gjithashtu, disa faqe të veçanta, si dodopizza.ru ose personal.dodopizza.ru, shkonin në shërbime të përbashkëta.

Kur shfaqeshin modulet e reja, përpiqeshim maksimalisht të ripërdorim kodin ekzistues të shërbimeve, procedurave të ruajtura dhe tabelave në bazë. 

Për të kuptuar më mirë shkallën e moduleve të krijuara 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 që ishte në skemë dhe madje edhe më shumë ishte në prodhim.

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

  • U shfaqĂ«n ekranet publike me menu dhe informacion, qĂ« varen nĂ« piceri.

  • NĂ« kuzhinĂ« ka njĂ« modul, i cili automatikisht luan njĂ« mesazh verbal "Pizza e re" kur bie njĂ« porosi e re dhe gjithashtu shtyp njĂ« faturĂ« pĂ«r kurierin. Kjo e thjeshton shumĂ« proceset nĂ« kuzhinĂ« dhe i lejon punonjĂ«sit tĂ« mos shpĂ«rqendrohen nga shumĂ« operacione tĂ« thjeshta.

  • Blloku i dorĂ«zimit u shndĂ«rrua nĂ« njĂ« Kasa tĂ« DorĂ«zimit, ku porosia jepet kurierit, i cili Ă«shtĂ« regjistruar paraprakisht nĂ« ndĂ«rrimin. Koha e tij e punĂ«s Ă«shtĂ« marrĂ« parasysh pĂ«r llogaritjen e pagĂ«s. 

Paralelisht nga 2012 deri në 2015 u zhvilluan më shumë se 10 zhvillues, u hapën 35 piceri, u implementua sistemi në Rumani dhe u përgatit për hapjen e pikave në SHBA. Zhvilluesit tashmë nuk merreshin me të gjitha detyrat, por ishin të ndarë në grupe, secila e specializuar në atë pjesë të sistemit. 

Problemet

Kjo në përputhje me arkitekturën (por jo vetëm).

Kaosi në bazë

NjĂ« bazĂ« — Ă«shtĂ« e pĂ«rshtatshme. NĂ« tĂ« mund tĂ« arrish konsistencĂ«, madje pĂ«rmes mjeteve tĂ« integruara nĂ« bazat relazionale. TĂ« punosh me tĂ« Ă«shtĂ« e zakonshme dhe e lehtĂ«, veçanĂ«risht nĂ«se ka pak tabela dhe pak tĂ« dhĂ«na.

Por katër vjet zhvillimi, baza kishte rreth 600 tabela, 1500 procedura të ruajtura, në shumë nga të cilat kishte edhe logjikë. Fatkeqësisht, procedurat e ruajtura nuk ofrojnë ndonjë avantazh të veçantë kur punoni me MySQL. Ato nuk ruajnë në cache nga baza, dhe ruajtja e logjikës në to e komplikon zhvillimin dhe debugging-un. Rinfoshkimi i kodit gjithashtu është i vështirë.

NĂ« shumĂ« tabela nuk kishte indekse tĂ« pĂ«rshtatshme, ndĂ«rsa nĂ« disa tĂ« tjera kishte shumĂ« indekse, gjĂ« qĂ« e bĂ«nte mĂ« tĂ« vĂ«shtirĂ« shtimin. Duhej tĂ« modifikohen rreth 20 tabela — transaksioni pĂ«r krijimin e porosisĂ« mund tĂ« zgjaste rreth 3-5 sekonda. 

Të dhënat në tabela nuk ishin gjithmonë në formën më të duhur. Në disa raste duhej të bëhej de-normalizimi. Një pjesë e të dhënave që merrnim rregullisht ishte në një kolonë në formën e një strukture XML, gjë që e rrisnin kohën e ekzekutimit, zgjateshin kërkesat dhe e komplikonin zhvillimin.

Për të njëjtat tabela ishin bërë shumë kërkesa të ndryshme. Veçanërisht vuajtën tabelat e njohura, si tabela e përmendur orders apo tabela pizzeria. Ato përdorej për të shpërndarë ndërfaqet operative në kuzhinë, analitikën. Gjithashtu u drejtohej faqes së internetit (dodopizza.ru), ku në çdo moment mund të kishte shumë kërkesa të papritura. 

Të dhënat nuk ishin të agreguara dhe shumë llogaritje ndodhnin në fluks me ndihmën e bazës. Kjo krijonte llogaritje të tepërta dhe ngarkesë të shtuar. 

Shpesh, kodi hynte në bazë kur nuk kishte nevojë. Në disa raste mungonin operacionet bulk, ndonjëherë ishte e nevojshme të ndërtohej një kërkesë më shumë përmes kodit, për të përshpejtuar dhe rritur besueshmërinë. 

Lidhja dhe ngatërrimi në kod

Modulet, të cilat duhet të ishin përgjegjëse për sektorët e tyre të biznesit, nuk e bënin këtë me ndershmëri.Disa prej tyre kishin përsëritje funksionesh për rolet. Për shembull, marketeri lokal, i cili ishte përgjegjës për aktivitetin marketing të rrjetit në qytetin e tij, duhej të përdorte si ndërfaqen "Admin" (për të krijuar fushata), ashtu edhe ndërfaqen "Menaxheri i Zyrës" (për të parë ndikimin e fushatave në biznes). Sigurisht, brenda të dy moduleve përdorej një shërbim, që punonte me fushatat e bonusit.

Shërbimet (klasa 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-model, që ruanin të dhëna, punimi në kod bëhej në mënyra të ndryshme.Në disa raste kishte konstruktora, përmes të cilëve mund të shiheshin fushat e detyrueshme. Në disa të tjera, kjo bëhej përmes pronarëve publikë. Sigurisht, marrja dhe transformimi i të dhënave nga baza ishte i larmishëm. 

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

Këto mund të duken si probleme të vogla, por ato ngadalësuan shumë zhvillimin dhe ulën cilësinë, duke çuar në paqëndrueshmëri dhe gabime. 

Sfidat e zhvillimit të madh

Problemet u shfaqën edhe në zhvillimin e vetë.Duhej të bëheshin blloqe të ndryshme të sistemit, madje paralelisht. Të vendosësh nevojat e çdo komponente në një kod të vetëm po bëhej gjithnjë e më e vështirë. Nuk ishte e lehtë të arrihej një marrëveshje dhe të kënaqeshin të gjitha komponentet njëherësh. Kësaj i shtoheshin kufizime në teknologji, veçanërisht kur bëhej fjalë për bazën dhe frontend-in. Duhej të hiqeshim nga JQuery drejt framework-ve më të avancuar, veçanërisht në pjesën e shërbimeve klientëve (faqja e internetit).

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

Ekipet dhe zhvilluesit, të cilët merreshin me fushën e tyre, dëshironin qartësisht më shumë autonomi për shërbimet e tyre, si në zhvillim ashtu edhe në lëshim. Konfliktet gjatë bashkimit, probleme gjatë lëshimeve. Nëse për 5 zhvillues kjo ishte një problem i parëndësishëm, për 10, e posaçërisht për rritjen e parashikuar, gjithçka do të bëhej më serioze. Dhe përpara duhej të zhvillohej një aplikacion mobil (ai filloi në 2017, dhe në 2018 pati një rënie të madhe). 

Pjesë të ndryshme të sistemit kërkonin tregues të ndryshëm të stabilitetit, por për shkak të lidhjes së fortë të sistemit, nuk mundëm ta siguronim këtë. Një gabim në zhvillimin e një funksioni të ri në admin, mund të kishte ndikuar në pranimin e porosisë në faqen e internetit, pasi kodi ishte i përbashkët dhe i ripërdorueshëm, baza dhe të dhënat gjithashtu ishin të njëjta.

Ndoshta, mund të kishte qenë e mundur që edhe në kuadër të një arkitekture monolitike-moderne, të mos lejonim këto gabime dhe probleme: të bënim ndarje përgjegjësish, të bënim refaktorizimin e kodit dhe të bazës së të dhënave, të ndajmë qartë shtresat nga njëra-tjetra, dhe të kontrollojmë cilësinë çdo ditë. Por zgjidhjet arhitektonike të zgjedhura dhe fokusimi në zgjerimin e shpejtë të funksionalitetit të sistemit çuan në probleme në çështjet e stabilitetit.

Si forumi Fuqia e Mendjes vendosi kasat në restorante

Nëse rritja e rrjetit të picerive (dhe ngarkesave) do të vazhdonte me këtë ritëm, pas një kohe rëniet do të ishin të tilla që sistemi nuk do të ngrihej më. Një histori që ilustron problemet me të cilat filluam të përballemi në vitin 2015 është kjo. 

NĂ« blogun “Fuqia e Mendjesnisi njĂ« widget qĂ« tregonte tĂ« dhĂ«nat pĂ«r tĂ« ardhurat e gjithĂ« rrjetit pĂ«r njĂ« vit. Widget-i thĂ«rriste API-nĂ« publike Dodo, e cila ofronte kĂ«to tĂ« dhĂ«na. Tani, kĂ«to statistika janĂ« tĂ« disponueshme nĂ« http://dodopizzastory.com/. Widget-i shfaqej nĂ« çdo faqe dhe bĂ«nte kĂ«rkesa çdo 20 sekonda. KĂ«rkesa shkonte nĂ« api.dodopizza.ru dhe kĂ«rkonte:

  • numrin e picerive nĂ« rrjet;

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

  • tĂ« ardhurat e sotme.

Kërkesa për statistikat e të ardhurave shkonte menjëherë në bazë dhe fillonte të kërkonte të dhëna për porositë, duke agreguar të dhënat në kohë reale dhe duke lëshuar shumën. 

Në këtë tavullinë të porosive hynin Kasat në restorante, duke nxjerrë listën e porosive të pranuara për sot, dhe aty shtoheshin porositë e reja. Kasat bënin kërkesa çdo 5 sekonda ose kur refresh-uan faqen.

Skema dukej kështu:

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

Një herë në vjeshtë, Fedor Ovchinnikov shkroi një artikull të gjatë dhe popullor në blogun e tij. Blogu tërheq shumë njerëz dhe ata filluan ta lexonin me kujdes. Ndërsa çdo person i pranishëm po lexonte artikullin, widget-i i të ardhurave punonte dhe kërkonte API-në çdo 20 sekonda.

API-ja thërriste një procedurë të ruajtur për llogaritjen e shumës së të gjitha porosive që nga fillimi i vitit për të gjitha piceritë e rrjetit. Agregimi bëhej për tabelën e porosive, e cila është shumë e popullarizuar. Aty hynin të gjitha kasat e restoranteve të hapura në atë moment. Kasat ndaluan së përgjiguri, porositë nuk pranoheshin. Ato gjithashtu nuk pranoheshin nga faqja, nuk shfaqeshin në tracker, menaxheri i ndërrimit nuk mund të shihte ato në ndërfaqen e tij. 

Kjo nuk është historia e vetme. Deri në vjeshtën e vitit 2015, çdo të premte ngarkesa në sistem ishte kritike. Disa herë ne fiknim API-në publike, dhe një herë, na duhej madje të fiknim faqen, sepse asgjë tjetër nuk ndihmoi. Kishte madje një listë shërbimesh me rendin e fikjes për ngarkesa të rënda.

Nga ky moment fillon lufta jonĂ« me ngarkesat dhe pĂ«r stabilizimin e sistemit (nga vjeshta e 2015 deri nĂ« vjeshtĂ«n e 2018). PikĂ«risht atĂ«herĂ« ndodhi “RĂ«nia e Madhe”. Edhe mĂ« pas, herĂ« pas here ndodhnin prishje, disa prej tĂ« cilave ishin mjaft tĂ« ndjeshme, por periudha e pĂ«rgjithshme e destabilitetit tani mund tĂ« quhet e kaluar.

Rritja e madhe e biznesit

Pse nuk mund tĂ« “bĂ«hej menjĂ«herĂ« mirĂ«â€? Mjafton tĂ« shohĂ«sh grafiket nĂ« vijim.

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

Gjithashtu, në vitet 2014-2015 u hap një pikë në Rumani dhe po përgatitej hapja në SHBA.

Rrjeti po rritej shumĂ« shpejt, po hapeshin vende tĂ« reja, po shfaqeshin formate tĂ« reja picerish, pĂ«r shembull, u hap njĂ« piceri nĂ« food court. E gjithĂ« kjo kĂ«rkonte njĂ« vĂ«mendje tĂ« konsiderueshme nĂ« zgjerimin e funksioneve Dodo IS. Pa tĂ« gjitha kĂ«to funksione, pa gjurmimin nĂ« kuzhinĂ«, llogaritjen e produkteve dhe humbjeve nĂ« sistem, shfaqjen e porosive nĂ« sallĂ«n e food court, vĂ«shtirĂ« se do tĂ« diskutonim tani pĂ«r arkitekturĂ«n “e duhur” dhe qasjen “e saktĂ«â€ nĂ« zhvillim.

Pengesat për rivlerësimin në kohë të arkitekturës dhe vëmendjes në problemet teknike, ishin kriza e vitit 2014. Këto gjëra godasin rëndë mundësitë për rritjen e grupeve, veçanërisht për biznesin e ri siç ishte Dodo Pizza.

Zgjidhjet e shpejta që ndihmuan

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

  • TĂ« shpejta, tĂ« cilat shuhin zjarri dhe japin njĂ« rezervĂ« tĂ« vogĂ«l stabiliteti dhe na fitojnĂ« kohĂ« pĂ«r ndryshime.

  • Sistematike dhe, prandaj, tĂ« gjata. Riinxhirimi i disa moduleve, ndarja e arkitekturĂ«s monolite nĂ« shĂ«rbime tĂ« veçanta (shumica nga to nuk janĂ« nĂ« fakt mikro, por mĂ« shumĂ« makro-shĂ«rbime dhe pĂ«r kĂ«tĂ« ka njĂ« raport nga Andrey Morevsky). 

Lista e thjeshtë e ndryshimeve të shpejta është si vijon:

Rritja e kapacitetit të master bazës

Sigurisht, gjëja e parë që bëhet për të përballuar ngarkesat është rritja e kapacitetit të serverit. Kjo u bë për master bazën dhe për serverat web. Fatkeqësisht, kjo është e mundur vetëm deri në një kufi të caktuar, më pas bëhet shumë e shtrenjtë.

QĂ« nga viti 2014 ne kaluam nĂ« Azure, pĂ«r kĂ«tĂ« tema ne gjithashtu kemi shkruar atĂ«herĂ« nĂ« artikullin “Si Dodo Pizza sjell pica me ndihmĂ«n e cloud-it Microsoft Azure”. Por pas njĂ« sĂ«rĂ« rritjesh tĂ« serverit pĂ«r bazĂ«n, u penguam nĂ« koston. 

Replicat e bazës për lexim

Bëri dy replika për bazën:

ReadReplica për kërkesat për registrat. Përdoret për leximin e regjistrave, si qytete, rrugë, piceri, produkte (domene të ngadalta), dhe në ato ndërfaqe ku pranohet një vonesë e vogël. Këto replika ishin 2, ne siguronim disponueshmërinë e tyre ashtu si edhe masterin.

ReadReplica për kërkesat për raporte. Kjo bazë kishte një disponueshmëri më të ulët, por përfshinte të gjitha raportet. Le të kenë kërkesa të rënda për përllogaritje të mëdha të të dhënave, por ato nuk ndikonin në bazën kryesore dhe në ndërfaqet operative. 

Keshat në kod

Keshat në kod nuk ishin askund (përgjithësisht). Kjo çonte në kërkesa shtesë, jo gjithmonë të nevojshme, në bazën e ngarkuar. Keshat ishin fillimisht në memorie dhe gjithashtu në një shërbim të jashtëm të keshit, ishte Redis. Të gjitha invalidoheshin me kohë, cilësimet përcaktoheshin në kod.

Disa serverë për backend

Backend i aplikacionit gjithashtu duhet të shkallëzohej për të përballuar ngarkesat e rritura. Duhej të krijonim një klaster nga një server i caktuar i iis. Ne transferuam sesionin e aplikacioneve nga memorie në RedisCache, e cila lejoi të krijoheshin disa serverë që qendronin pas një balancuesi të thjeshtë ngarkese me round robin. Fillimisht u përdor të njëjtin Redis si për keshat, pastaj i ndamë në disa. 

Si pasojë, arkitektura u komplikuar...

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

...por një pjesë e ngarkesës u lehtësua.

Dhe më pas duhej të ripërkraheshin komponentët e ngarkuar, për të cilat ne filluam. Për këtë do flasim në pjesën tjetër.

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