Si e përballuam rritjen e menjëhershme x10 të ngarkesës gjatë punës në distancë dhe çfarë përfundimesh nxorëm

Përshëndetje, Habr! Gjatë disa muajve të fundit, kemi përjetuar një situatë shumë interesante, dhe do të doja të ndaja historinë tonë të zgjerimit të infrastrukturës. Gjatë kësaj kohe, SberMarket është rritur katërfish në porosi dhe ka lansuar shërbimin në 17 qytete të reja. Rritja eksplozive e kërkesës për dorëzim të produkteve kërkoi nga ne zgjerimin e infrastrukturës. Rreth konkluzioneve më interesante dhe të dobishme lexoni poshtë.

Si e përballuam rritjen e menjëhershme x10 të ngarkesës gjatë punës në distancë dhe çfarë përfundimesh nxorëm

Më quajnë Dima Bobylëv, unë jam drejtor teknik i SberMarket. Duke qenë se ky është posti i parë në blogun tonë, do të them disa fjalë për veten dhe për kompaninë. Në vjeshtën e kaluar, kam marrë pjesë në konkursin e liderëve të rinj të Runet. Për këtë contest unë kam shkruar një histori të vogël rreth mënyrës se si ne në SberMarket e shohim kulturën e brendshme dhe qasjen ndaj zhvillimit të shërbimit. Edhe pse nuk arrita të fitoj në konkurs, përkundrazi, kam formuluar për vete parimet themelore të zhvillimit të ekosistemit IT.

Kur menaxhon një ekip, është e rëndësishme të kuptosh dhe të gjesh një balancë mes nevojave të biznesit dhe kërkesave të çdo zhvilluesi të veçantë. Aktualisht, SberMarket po rritet 13 herë nga viti në vit, dhe kjo ndikon në produkt, duke kërkuar rritjen e vazhdueshme të volumit dhe ritmit të zhvillimit. Megjithatë, ne i japim zhvilluesve mjaft kohë për analizën paraprake dhe për një kod të cilësisë së lartë. Qasja e formuar ndihmon jo vetëm në krijimin e një produkti funksional, por gjithashtu në zgjerimin dhe zhvillimin e tij të mëtejshëm. Si rezultat i kësaj rritjeje, SberMarket tashmë është bërë lider ndër shërbimet e dorëzimit të produkteve: ne dorëzojmë rreth 18 mijë porosi çdo ditë, ndonëse në fillim të shkurtit ishin rreth 3500.

Si e përballuam rritjen e menjëhershme x10 të ngarkesës gjatë punës në distancë dhe çfarë përfundimesh nxorëm
NjĂ« herĂ«, njĂ« klient kĂ«rkoi qĂ« kurieri i SberMarket tĂ« dorĂ«zonte produktet atij nĂ« mĂ«nyrĂ« pa kontakt — direkt nĂ« ballkon.

Por tĂ« kaluar te detajet. GjatĂ« disa muajve tĂ« fundit, ne kemi punuar aktivisht nĂ« zgjerimin e infrastrukturĂ«s sĂ« kompanisĂ« sonĂ«. Ky nevojĂ« u justifikua nga faktorĂ« tĂ« jashtĂ«m dhe tĂ« brendshĂ«m. NĂ« tĂ« njĂ«jtĂ«n kohĂ« me rritjen e bazĂ«s sĂ« klientĂ«ve, numri i dyqaneve tĂ« lidhura u rrit nga 90 nĂ« fillim tĂ« vitit nĂ« mĂ« shumĂ« se 200 deri nĂ« mes tĂ« majit. Sigurisht, ne u pĂ«rgatitĂ«m, rezervuam infrastrukturĂ«n kryesore dhe planifikuam mundĂ«sinĂ« e zgjerimit vertikal dhe horizontal tĂ« tĂ« gjitha makinave virtuale tĂ« vendosura nĂ« ĐŸĐ±Đ»Đ°kun e Yandex. MegjithatĂ«, praktika tregoi: "Gjithçka qĂ« mund tĂ« shkojĂ« keq, do tĂ« shkojĂ« keq". Dhe sot dua tĂ« ndaj situatat mĂ« interesante qĂ« ndodhen pĂ«r kĂ«to javĂ«. Shpresoj qĂ« pĂ«rvoja jonĂ« tĂ« jetĂ« e dobishme pĂ«r ju.

Slave është në gatishmëri të plotë

Edhe përpara fillimit të pandemisë, u përballëm me një rritje të numrit të kërkesave në serverat tanë backend. Tendenca për të porositur produkte me dorëzim në shtëpi filloi të merrte hov, dhe me futjen e masave të para të vetizolimit për shkak të COVID-19, ngarkesa po rritej dramatikisht para syve tanë gjatë gjithë ditës. U shfaq nevoja për të shkarkuar me urgjencë serverat master të bazës kryesore të të dhënave dhe për të transferuar disa kërkesa për lexim në serverat-replikë (slave).

Ne u përgatitëm paraprakisht për këtë hap, dhe për këtë manovër tashmë ishin aktivizuar 2 servera slave. Ata kryesisht punonin me detyra batch për gjenerimin e feed-eve informative për shkëmbimin e të dhënave me partnerët. Këto procese krijonin një ngarkesë të tepërt dhe ishin krejtësisht të arsyeshme të hiqeshin "jashtë skanave" disa muaj më parë. 

Duke qenë se replikimi ndodhte në Slave, ne ndoqëm konceptin që aplikacionet mund të punojnë me to vetëm në mënyrë read only. Plani i Rimëkëmbjes nga Fatkeqësitë parashikonte që në rast katastrofe, ne mund të montonim thjesht Slave në vend të Master dhe të kalonim të gjitha kërkesat për shkrim dhe lexim në Slave. Megjithatë, ne gjithashtu dëshironim të përdornim replikat për nevojat e departamentit të analizave, kështu që serverat nuk u transferuan plotësisht në statusin read only, dhe në çdo host kishte grupin e tij të përdoruesve, dhe disa kishin të drejta shkrimi për të ruajtur rezultatet ndërmjetëse të llogaritjeve.

Der nivel të caktuar ngarkese na mjaftonte një master për të shkruar dhe lexuar gjatë përpunimit të kërkesave http. Në mesin e marsit, pikërisht kur Sbermarket vendosi të kalojë në punë të largët, filluam një rritje të ndjeshme të RPS. Po aq shumë klientë tanë kaluan në vetëizolim ose punë nga shtëpia, gjë që ndikoi në treguesit e ngarkesës.

Performanca e «master» nuk ishte më e mjaftueshme, prandaj filluam të transferonim disa nga kërkesat më të rënda për lexim në replikë. Për të drejtuar transparencën e kërkesave për shkruar në master dhe për lexim në slave, përdorëm gemin ruby «Octopus». Krijuam një përdorues të veçantë me postfixin _readonly pa të drejta për shkruar. Por për shkak të një gabimi në konfigurimin e njërit nga hostet, disa kërkesa për shkruar u dërguan në serverin slave me emrin e përdoruesit që kishte të drejtat përkatëse.

Problemi nuk doli në pah menjëherë, sepse ngarkesa e rritur shkaktoi një vonesë tek slavet. Inkonistencat e të dhënave u zbuluan në mëngjes, kur pas importeve të natës, slavet nuk e «arritën» masterin. Ne e arsyetuam këtë me ngarkesën e lartë në vetë shërbimin dhe importin e lidhur me hapjen e dyqaneve të reja. Por ofrimi i të dhënave me një vonesë disa orëshe ishte e papranueshme, dhe ne kaluam proceset në slave-në e dytë analitike, sepse ai kishte mëoshumë burime dhe nuk ishte ngarkuar me kërkesa leximi (çfarë e shpjeguam për veten tonë si mungesë të vonesës në replikim).

Kur arritëm të zgjidhnim arsyet e «shkëputjes» së slave-it kryesor, slave analitik tashmë kishte dalë jashtë funksioni për të njëjtën arsye. Pavarësisht nga pranimi i dy serverëve shtesë, në të cilët planifikuam të transferonim ngarkesën në rast të dështimit të masterit, për shkak të një gabimi të padëshiruar rezultoi se në momentet kritike nuk kishte asnjë.

Por pasi bëmë jo vetëm dump të DB (restorimi në atë moment zgjaste rreth 5 orë), por gjithashtu snapshot të serverit master, arritëm të nisim replikën brenda 2 orëve. Megjithatë, pas kësaj na priste kalimi i logut të replikimit për një periudhë të gjatë (pasi processi zhvillohet në modin njëthëmbësh, por kjo është një histori tjetër krejtësisht).

Përfundimi: Pas një incident të tillë, u bë e qartë se duhej hequr dorë nga praktika e kufizimit të regjistrimit për përdoruesit dhe të shpallej në mënyrë readonly e gjithë serveri. Me një qasje të tillë, mund të mos dyshohet se replikat do të ishin të disponueshme në një moment kritik.

Optimizimi edhe i një kërkese të rëndë mund të "kthejë në jetë" DB-në.

Megjithëse ne vazhdimisht përditësojmë katalogun në sit, kërkesat që ne i dërgonim në serverët Slave toleronin një vonesë të vogël nga Master. Koha për të zbuluar dhe eliminuar problemin e "slave-ve që papritmas dolën nga gara" ishte më e gjatë se "bariera psiko-kologjike" (në atë kohë mund të kishte ndodhur një përditësim çmimesh dhe klientët do të shihnin të dhëna të skaduara), dhe ne u detyruam të kalonim të gjitha kërkesat në serverin kryesor të DB-së. Si rezultat, siti punoi ngadalë... por së paku funksionoi. Dhe derisa Slave po rikuperohej, nuk na mbetej asgjë tjetër përveç optimizimit. 

Ndërsa serverët Slave po rikuperoheshin, minutat kalonin ngadalë, Master mbetej i ngarkuar, dhe ne hodhëm të gjitha forcat në optimizimin e detyrave aktive sipas "Rregullit të Paretos": zgjodhëm kërkesat TOP që jepnin pjesën më të madhe të ngarkesës dhe filluam tuning. Kjo bëhej në mënyrë të drejtpërdrejtë.

Një efekt interesant ishte se MySQL, e mbushur deri në pikën kryesore, përgjigjej edhe ndaj përmirësimit të vogël të proceseve. Optimizimi i disa kërkesave që jepnin vetëm 5% të ngarkesës totale tregoi tashmë një ulje të dukshme të CPU-së. Si rezultat, arritëm të siguronim një rezervë të pranueshme burimesh për të punuar Master me bazën e të dhënave dhe të merrnim kohën e nevojshme për rikuperimin e replikave. 

Përfundimi: Edhe një optimizim i vogël lejon "të mbijetosh" gjatë ngarkesës për disa orë. Na mjaftoi kjo kohë për rikuperimin e serverëve me replikat. Për rrethanat teknike të optimizimit të kërkesave, do ta diskutojmë në një nga postimet e ardhshme. Prandaj, abonohuni në blogun tonë nëse kjo mund të jetë e dobishme për ju.

Organizoni monitorimin e funksionimit të shërbimeve partnere.

Ne merremi me pĂ«rpunimin e porosive nga klientĂ«t, dhe pĂ«r kĂ«tĂ« arsye shĂ«rbimet tona vazhdimisht ndĂ«rveprojnĂ« me API e jashtme — kĂ«to janĂ« porta pĂ«r dĂ«rgimin e SMS-ve, platformat e pagesave, sistemet e routing-ut, geokoduesi, shĂ«rbimi i FNSH-sĂ« dhe shumĂ« sisteme tĂ« tjera. Dhe kur ngarkesa filloi tĂ« rritej shpejt, filluam tĂ« hasim kufizimet e API-ve tĂ« shĂ«rbimeve partnere, pĂ«r tĂ« cilat nuk kishim menduar mĂ« parĂ«.

Një tejkalim i papritur i kuotave të shërbimeve partnere mund të çojë në ndjekjen e rënies së shërbimeve tuaja. Shumë API bllokojnë klientët që tejkalojnë kufijtë, dhe në disa raste, një numër i madh kërkesash mund të ngarkojë prodhimin e partnerit. 

Për shembull, në momentin e rritjes së numrit të dërgesave, shërbimet ndihmëse nuk arrinin të përballonin detyrat e tyre për shpërndarje dhe përcaktim rrugësh. Si rezultat, ndodhte që porositë ishin bërë, por shërbimi që krijonte rrugën nuk funksiononte. Duhet të them se logjistët tanë bënë atë që dukej pothuajse e pamundur në këto kushte, dhe ndërveprimi i qartë i ekipit ndihmoi në kompensimin e dështimeve të përkohshme të shërbimeve. Por një volum kaq i madh porosish nuk mund të përballohej vazhdimisht me dorë, dhe pas një kohë do të përballeshim me një ndërprerje të papranueshme mes porosive dhe ekzekutimeve të tyre. 

U miratua një sërë masash organizative dhe puna e përbashkët e kolektivit ndihmoi të fitonin disa kohë, derisa ne u dakorduam për kushtet e reja dhe prisnim modernizimin e shërbimeve nga disa partnerë. Ekzistojnë edhe API të tjera që gëzojnë qëndrushmëri të lartë dhe tarifa të larta në rastin e trafikut të madh. Për shembull, në fillim përdorshim një API të njohur për hartat për përcaktimin e adresës së pikës së dërgesës. Por pas përfundimit të muajit, morëm një faturë të madhe prej gati 2 milion rubla. Pas kësaj, vendosëm ta zëvendësonim atë menjëherë. Nuk do të merrem me reklamim, por do të them se shpenzimet tona u ulën ndjeshëm.
Si e përballuam rritjen e menjëhershme x10 të ngarkesës gjatë punës në distancë dhe çfarë përfundimesh nxorëm

Përfundimi: Duhet patjetër të monitoroni kushtet e punës së të gjitha shërbimeve partnere dhe t'i keni parasysh. Edhe nëse sot duket se ato kanë 'rezerva të mëdha', kjo nuk do të thotë se nesër ato nuk do të bëhen një pengesë për rritjen. Dhe, sigurisht, është më mirë të arrini marrëveshje për kushtet financiare të rritjes së kërkesave për shërbimin paraprakisht. 

Ndonjëherë rezulton se 'duhet më shumë ar' (c) nuk ndihmon

Jemi mĂ«suar me "ngĂ«rçet" nĂ« bazĂ«n e tĂ« dhĂ«nave kryesore ose nĂ« serverat e aplikacioneve, por gjatĂ« shkallĂ«zimit, problemet mund tĂ« shfaqen atje ku nuk i prisni. PĂ«r kĂ«rkimin me tekst tĂ« plotĂ« nĂ« sit, ne pĂ«rdorim motorin Apache Solr. Me rritjen e ngarkesĂ«s, ne vĂ«shtruam rĂ«nien e kohĂ«s sĂ« pĂ«rgjigjes, dhe ngarkesa e procesorit tĂ« serverit arriti tashmĂ« nĂ« 100%. ÇfarĂ« mund tĂ« jetĂ« mĂ« e thjeshtĂ« — t'i japim kontejnerit me Solr mĂ« shumĂ« burime.

NĂ« vend tĂ« rritjes sĂ« pritur tĂ« performancĂ«s, serveri thjesht "vdiq". Ai menjĂ«herĂ« ngarkohej nĂ« 100% dhe pĂ«rgjigjej edhe mĂ« ngadalĂ«. Fillimisht kishim 2 bĂ«rthama dhe 2 GB RAM. VendosĂ«m tĂ« bĂ«jmĂ« atĂ« qĂ« zakonisht ndihmon — i dhamĂ« serverit 8 bĂ«rthama dhe 32 GB. TĂ« gjitha u bĂ«nĂ« shumĂ« mĂ« keq (si dhe pse, do tĂ« tregojmĂ« nĂ« njĂ« postim tjetĂ«r). 

NĂ« disa ditĂ«, ne kuptuam hollĂ«sitĂ« e kĂ«saj çështjeje dhe arritĂ«m performancĂ«n optimale me 8 bĂ«rthama dhe 32 GB. Kjo konfigurim na lejon edhe sot tĂ« vazhdojmĂ« tĂ« rrisim ngarkesĂ«n, qĂ« Ă«shtĂ« shumĂ« e rĂ«ndĂ«sishme, sepse rritja po ndodh jo vetĂ«m pĂ«r klientĂ«t, por edhe pĂ«r numrin e dyqaneve tĂ« lidhura — brenda 2 muajve, numri i tyre u rrit dyfish. 

Përfundimi: Metodat standarde si "shtoni më shumë harduer" nuk funksionojnë gjithmonë. Prandaj, gjatë shkallëzimit të çdo shërbimi, është e rëndësishme të kuptohet mirë si përdor burimet dhe të testohet paraprakisht funksionimi i tij në kushte të reja. 

Stateless — çelĂ«si pĂ«r shkallĂ«zimin horizontal tĂ« thjeshtĂ«

NĂ« pĂ«rgjithĂ«si, ekipi ynĂ« ndjek qasjen e njohur: shĂ«rbimet nuk duhet tĂ« kenĂ« njĂ« gjendje tĂ« brendshme (stateless) dhe duhet tĂ« jenĂ« tĂ« pavarura nga mjedisi ekzekutues. Kjo na lejoi tĂ« pĂ«rballonim rritjen e ngarkesĂ«s pĂ«rmes shkallĂ«zimit horizontal tĂ« thjeshtĂ«. Por kishim njĂ« shĂ«rbim pĂ«rjashtim — pĂ«rpunuesin e detyrave tĂ« gjata nĂ« sfond. Ai merrej me dĂ«rgimin e email-eve dhe SMS-ve, pĂ«rpunimin e ngjarjeve, gjenerimin e feed-eve, importimin e çmimeve dhe stokut, pĂ«rpunimin e imazheve. Siç ndodhi, ai varej nga ruajtja lokale e skedarĂ«ve dhe ishte nĂ« njĂ« ekzemplar tĂ« vetĂ«m. 

Kur rritet numri i detyrave në radhën e përpunuesit (gjë që ndodhi natyrshëm me rritjen e numrit të porosive), performanca e host-it, ku ishin vendosur përpunuesi dhe ruajtja e skedarëve, u bë faktori kufizues. Si rezultat, ndaloi përditësimi i asortimentit dhe çmimeve, dërgimi i njoftimeve për përdoruesit dhe shumë funksione të tjera kritike që mbetën ngujuar në radhë. Ekipi i Ops migroi menjëherë ruajtjen e skedarëve në një ruajtje rrjeti të ngjashme me S3, dhe kjo na lejoi të ngrinim disa makina të fuqishme për të shkallëzuar përpunuesin e detyrave të prapambetura.

Përfundimi: Rregulli Stateless duhet të respektohet për të gjitha komponentët pa përjashtim, edhe nëse duket "se nuk do të hasim ndonjë problem këtu". Më mirë të kalosh pak kohë për organizimin e duhur të punës së të gjitha sistemeve, sesa më vonë të shkruash përsëri kodin dhe të riparosh shërbimin që po përjeton ngarkesë.

7 parime për rritje intensive

Megjithëse ekziston disponueshmëria e kapaciteteve shtesë, gjatë procesit të rritjes ne hasëm disa pengesa. Gjatë kësaj periudhe, numri i porosive u rrit më shumë se 4 herë. Tani ne tashmë po dërgojmë më shumë se 17,000 porosi në ditë në 62 qytete dhe planifikojmë të zgjerojmë akoma më shumë gjeografinë - në gjysmën e parë të vitit 2020 pritet të nisë shërbimi në të gjithë Rusinë. Për të përballuar ngarkesën në rritje, duke marrë parasysh pengesat e kaluara, ne kemi nxjerrë për vete 7 parime kryesore të punës në kushte rritje të vazhdueshme:

  1. Menaxhimi i incidenteve. Ne krijuam një tabelë në Jira, ku çdo incident pasqyrohet në formën e një tiketi. Kjo do të ndihmojë në përparimin dhe realizimin e detyrave të lidhura me incidentin. Sepse në thelb nuk është e frikshme të gabosh - është e frikshme të gabosh dy herë për të njëjtin arsyesh. Për rastet, kur incidentet përsëriten para se të mund të rregullohet shkaku, duhet të jetë gati një udhëzues veprimi, sepse gjatë ngarkesës së madhe është e rëndësishme të reagosh me shpejtësi.
  2. Monitorimi kërkohet për të gjithë elementët e infrastrukturës pa përjashtim. Pikërisht falë tij ne ishim në gjendje të parashikonim rritjen e ngarkesës dhe të zgjedhim saktë "ngushticat" për t'u përpriorizuar në zgjidhjen e tyre. Shumë gjasa, në raste ngarkese të lartë, do të prishet ose fillojë të ngadalësohet gjithçka që nuk keni menduar. Prandaj është më mirë të krijoni alerte të reja menjëherë pas ndodhisë së incidenteve të para, për të monitoruar dhe parandaluar ato.
  3. Alerte të duhura janë të domosdoshme kur ngarkohet ndjeshëm sistemi. Së pari, ato duhet të njoftojnë saktësisht se çfarë është prishur. Së dyti, nuk duhet të ketë shumë alerte, sepse mbizotërimi i alerteve jo kritike çon në injorimin e të gjitha njoftimeve në përgjithësi.
  4. Aplikacionet duhet të jenë pa shtet. Ne u siguruam që për këtë rregull nuk duhet të ketë përjashtime. Duhet të ekzistojë një pavarësi e plotë nga mjedisi i ekzekutimit. Për këtë, ju mund të ruani të dhëna të ndara në DB ose, për shembull, direkt në S3. E akoma më mirë të ndiqni rregullat https://12factor.net. Gjatë rritjes së papritur në kohë, optimizimi i kodit nuk është mundësi, dhe do të duhet të përballeni me ngarkesën me anë të rritjes direkte të burimeve kompjuterike dhe shkallëzimit horizontal.
  5. Kota dhe performanca e shërbimeve të jashtme. Në rastin e rritjes së shpejtë, problemi mund të ndodhi jo vetëm në infrastrukturën tuaj, por edhe në shërbimin e jashtëm. E më e keqe është kur kjo ndodh jo për shkak të një defekti, por për shkak të arritjes së kuotave ose limiteve. Prandaj, shërbimet e jashtme duhet të shkallëzohen po aq mirë sa dhe ju. 
  6. Ndarja e proceseve dhe radhëve. Kjo ndihmon shumë kur ndonjë nga portat has një bllokim. Nuk do të përballeshim me vonesa në transmetimin e të dhënave nëse radhët e mbushura për dërgimin e SMS-ve nuk do të pengonin shkëmbimin e njoftimeve midis sistemeve informative. Po ashtu, do të ishte më e lehtë të rriteshin numri i punëtorëve nëse ata do të punonin veçmas.
  7. Realitetet financiare. Kur ndodhet një rritje eksplozive e fluksit të të dhënave, nuk ka kohë për të menduar për tarifa dhe abonime. Por ato duhet të mbahen mend, sidomos nëse jeni një kompani e vogël. Një faturë e madhe mund të lëshohet nga çdo pronar API, si dhe nga ofruesi juaj i hostimit. Pra, është e rëndësishme të lexoni kontratat me kujdes.

Përfundim

Nuk kishte humbje, por e kaluam kĂ«tĂ« fazĂ«, dhe sot pĂ«rpiqemi tĂ« respektojmĂ« tĂ« gjitha parimet e zbuluara, me çdo makinĂ« qĂ« ka mundĂ«sinĂ« pĂ«r rritje tĂ« lehtĂ« tĂ« kapacitetit deri nĂ« 4 herĂ«, pĂ«r t’u pĂ«rballur me ndonjĂ« papĂ«rgatitje. 

Në postimet e ardhshme do të ndajmë përvojën tonë në hetimin e rënies së performancës në Apache Solr, gjithashtu do të flasim për optimizimin e pyetjeve dhe si bashkëpunimi me FNS ndihmon kompaninë të kursjë para. Abonohuni në blogun tonë që të mos humbisni asgjë dhe na tregoni në komentet nëse keni përjetuar ndonjëherë disa nga këto çështje gjatë rritjes së trafikut.

Si e përballuam rritjen e menjëhershme x10 të ngarkesës gjatë punës në distancë dhe çfarë përfundimesh nxorëm

Vetëm përdoruesit e regjistruar mund të marrin pjesë në anketë. Hyni, ju lutem.

A keni përjetuar ngadalësim/rënien e shërbimeve në rast të rritjes drastike të ngarkesës për shkak të:

  • 55,6%PamundĂ«sisĂ« pĂ«r tĂ« shtuar burime llogaritĂ«se nĂ« mĂ«nyrĂ« tĂ« shpejtĂ«10

  • 16,7%Kufijve tĂ« infrastrukturĂ«s sĂ« ofruesit tĂ« hosting3

  • 33,3%Kufijve tĂ« API-ve tĂ« treta6

  • 27,8%Shkeljeve tĂ« parimeve stateless tĂ« aplikacioneve tuaja5

  • 88,9%Optimizimit tĂ« kodit tĂ« shĂ«rbimeve tuaja16

18 përdorues votuan. 6 përdorues u abstenuan.

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