{"id":73949,"date":"2020-03-13T02:42:07","date_gmt":"2020-03-12T23:42:07","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/kak-my-v-sportmastere-vybirali-sistemu-keshirovaniya-chast-1"},"modified":"2020-03-13T02:42:07","modified_gmt":"2020-03-12T23:42:07","slug":"kak-my-v-sportmastere-vybirali-sistemu-keshirovaniya-chast-1","status":"publish","type":"post","link":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/kak-my-v-sportmastere-vybirali-sistemu-keshirovaniya-chast-1","title":{"rendered":"Cum am ales sistemul de cache la Sportmaster. Partea 1","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Bun\u0103! Numele meu este Alexey Pyankov, sunt dezvoltator la compania Sportmaster. \u00cen acest <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/485088\/\">post<\/a><\/noindex> am povestit cum a \u00eenceput munca asupra site-ului Sportmaster \u00een anul 2012, ce ini\u021biative am reu\u0219it s\u0103 \u201e\u00eempingem\u201d \u0219i, dimpotriv\u0103, ce capcane am \u00eent\u00e2mpinat.<\/p>\n<p>Ast\u0103zi vreau s\u0103 \u00eemp\u0103rt\u0103\u0219esc g\u00e2ndurile care urmeaz\u0103 unui alt subiect \u2013 alegerea sistemului de cache pentru backend-ul java din administrarea site-ului. Acest subiect are o semnifica\u021bie special\u0103 pentru mine \u2013 de\u0219i povestea s-a desf\u0103\u0219urat doar pe parcursul a 2 luni, \u00een ace\u0219ti 60 de zile am lucrat 12-16 ore pe zi, f\u0103r\u0103 zi liber\u0103. Niciodat\u0103 nu m-am g\u00e2ndit \u0219i nu mi-am imaginat c\u0103 se poate muncii at\u00e2t de mult.<\/p>\n<p>Prin urmare, textul va fi \u00eemp\u0103r\u021bit \u00een 2 p\u0103r\u021bi, pentru a nu suprasolicita. Din contr\u0103, prima parte va fi foarte u\u0219oar\u0103 \u2014 o preg\u0103tire, o introducere, c\u00e2teva considera\u021bii despre ce este caching-ul. Dac\u0103 e\u0219ti deja un dezvoltator experimentat sau ai lucrat cu cache-uri \u2013 din punct de vedere tehnic, \u00een acest articol probabil nu va fi nimic nou. Dar pentru un junior, un mic astfel de rezumat poate sugera \u00een ce direc\u021bie s\u0103 se uite \u00een cazul \u00een care se afl\u0103 la o astfel de r\u0103scruce.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/490912\/\"><img decoding=\"async\" alt=\"Cum am ales sistemul de cache la Sportmaster. Partea 1\" src=\"\/wp-content\/uploads\/2020\/03\/634b7420b86d65bd5175536a1cb39078.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nC\u00e2nd noua variant\u0103 a site-ului Sportmaster a fost lansat\u0103 \u00een produc\u021bie, datele erau primite \u00eentr-un mod, s\u0103 spunem, nu foarte convenabil. La baz\u0103 erau tabele preg\u0103tite pentru vechea versiune a site-ului (Bitrix), care trebuiau integrate \u00een ETL, transformate \u00een noul format \u0219i \u00eembog\u0103\u021bite cu diverse elemente din \u00eenc\u0103 alte zeci de sisteme. Pentru ca o nou\u0103 imagine sau descriere a produsului s\u0103 apar\u0103 pe site, trebuia s\u0103 a\u0219tep\u021bi p\u00e2n\u0103 a doua zi \u2014 actualizarea se efectua doar noaptea, o dat\u0103 pe zi.<\/p>\n<p>La \u00eenceput, erau at\u00e2t de multe griji \u00een primele s\u0103pt\u0103m\u00e2ni de lansare \u00een produc\u021bie, \u00eenc\u00e2t asemenea inconveniente pentru managerii de con\u021binut p\u0103reau nesemnificative. Dar, pe m\u0103sur\u0103 ce lucrurile s-au stabilizat, dezvoltarea proiectului a continuat \u2014 dup\u0103 c\u00e2teva luni, la \u00eenceputul anului 2015, am \u00eenceput s\u0103 lucr\u0103m intens la interfa\u021ba de administrare. \u00cen 2015 \u0219i 2016, totul a mers bine, am avut lans\u0103ri regulate, interfa\u021ba de administrare a acoperit o parte tot mai mare a proces\u0103rii datelor, iar noi ne preg\u0103team pentru ceea ce urma s\u0103 fie \u00eencredin\u021bat echipei noastre \u2014 conturul de produse (preg\u0103tirea complet\u0103 \u0219i gestionarea datelor pentru toate produsele). Dar \u00een vara anului 2017, chiar \u00eenainte de lansarea conturului de produse, proiectul s-a aflat \u00eentr-o situa\u021bie foarte complicat\u0103 \u2014 din cauza problemelor de caching. Despre acest episod vreau s\u0103 povestesc \u00een a doua parte a acestei publica\u021bii \u00een dou\u0103 episoade.<\/p>\n<p>Dar \u00een aceast\u0103 postare voi \u00eencepe din dep\u0103rtare, sintetiz\u00e2nd c\u00e2teva g\u00e2nduri \u2014 impresii despre caching, care ar fi fost un pas bun s\u0103 fie revizuite \u00eenainte de un proiect mare.<\/p>\n<h2>C\u00e2nd apare sarcina de caching<\/h2>\n<p>\nSarcina de caching nu apare pur \u0219i simplu. Noi, dezvoltatorii, cre\u0103m un produs software \u0219i vrem s\u0103 fie cerut. Dac\u0103 produsul este cerut \u0219i de succes \u2014 utilizatorii vin. \u0218i tot mai mul\u021bi vin. \u0218i astfel, ajungem la un num\u0103r foarte mare de utilizatori \u0219i produsul devine supraaglomerat.<\/p>\n<p>\u00cen primele etape, nu ne g\u00e2ndim la optimizarea \u0219i performan\u021ba codului. Principalul este func\u021bionalitatea, s\u0103 lans\u0103m rapid un prototip \u0219i s\u0103 verific\u0103m ipotezele. \u0218i dac\u0103 \u00eenc\u0103rcarea cre\u0219te \u2013 ne \u00eembun\u0103t\u0103\u021bim echipamentele. Cre\u0219tem de dou\u0103, trei, cinci ori, l\u0103s\u0103m s\u0103 fie chiar de zece ori. Aici, finan\u021bele nu vor mai permite. Dar cu c\u00e2t va cre\u0219te num\u0103rul utilizatorilor? Nu va fi vorba de 2-5-10, ci, \u00een cazul succesului, va fi de la 100-1000 \u0219i p\u00e2n\u0103 la 100.000 de ori. A\u0219adar, mai devreme sau mai t\u00e2rziu, va trebui s\u0103 ne ocup\u0103m de optimizare.<\/p>\n<p>S\u0103 presupunem c\u0103 o parte din cod (s\u0103 numim aceast\u0103 parte func\u021bie) func\u021bioneaz\u0103 extrem de lent \u0219i dorim s\u0103 reducem timpul de executare. Func\u021bia poate fi un acces la baza de date, poate fi executarea unei logici complexe \u2014 important este c\u0103 dureaz\u0103 mult. Cu c\u00e2t putem reduce timpul de execu\u021bie? Teoretic, putem reduce la zero, nu mai departe. Cum putem reduce timpul de execu\u021bie la zero? R\u0103spuns: excluz\u00e2nd complet execu\u021bia. \u00cen loc de aceasta, \u00eentoarcem imediat rezultatul. Cum putem afla rezultatul? R\u0103spuns: fie calcul\u00e2nd, fie consult\u00e2nd undeva. Calculul dureaz\u0103 mult. Iar consultarea \u00eenseamn\u0103, de exemplu, a salva acel rezultat pe care func\u021bia l-a generat data trecut\u0103, c\u00e2nd a fost apelat\u0103 cu acelea\u0219i parametru.<\/p>\n<p>Deci, implementarea func\u021biei nu este important\u0103 pentru noi. E suficient s\u0103 \u0219tim de ce parametrii depinde rezultatul. A\u0219adar, dac\u0103 valorile parametrilor sunt reprezentate sub form\u0103 de obiect, care poate fi folosit ca o cheie \u00eentr-un anumit spa\u021biu de stocare \u2014 atunci rezultatul calculului poate fi p\u0103strat \u0219i la urm\u0103toarea accesare considerat. Dac\u0103 aceste opera\u021bii de scriere \u0219i citire a rezultatului se desf\u0103\u0219oar\u0103 mai repede dec\u00e2t executarea func\u021biei \u2013 avem un profit de vitez\u0103. M\u0103rimea profitului poate atinge de 100, 1000 sau 100.000 de ori (10^5 \u2013 aceasta este mai degrab\u0103 o excep\u021bie, dar \u00een cazul unei baze de date care func\u021bioneaz\u0103 prost, este complet posibil).<\/p>\n<h2>Cerin\u021bele principale pentru sistemul de caching<\/h2>\n<p>\nPrimul lucru care poate deveni o cerin\u021b\u0103 pentru sistemul de caching \u2014 viteza rapid\u0103 de citire \u0219i, \u00eentr-o m\u0103sur\u0103 u\u0219or mai mic\u0103, viteza de scriere. A\u0219a este, dar doar p\u00e2n\u0103 nu punem sistemul \u00een produc\u021bie.<\/p>\n<p>S\u0103 discut\u0103m un astfel de caz.<\/p>\n<p>S\u0103 presupunem c\u0103 am furnizat hardware-ul necesar pentru sarcina curent\u0103 \u0219i acum \u00eencepem treptat implementarea caching-ului. Num\u0103rul utilizatorilor cre\u0219te pu\u021bin, sarcina cre\u0219te \u2013 ad\u0103ug\u0103m pu\u021bin cache, integr\u0103m aici \u0219i acolo. Aceasta continu\u0103 o vreme \u0219i, iat\u0103, func\u021biile grele aproape c\u0103 nu mai sunt apelate \u2014 toat\u0103 sarcina principal\u0103 se afl\u0103 pe cache. Num\u0103rul utilizatorilor a crescut \u00een acest timp de N ori.<\/p>\n<p>\u0218i dac\u0103 resursele ini\u021biale de hardware ar fi putut fi de 2-5 ori, atunci cu ajutorul caching-ului am putea \u00eembun\u0103t\u0103\u021bi performan\u021ba de 10 ori sau, \u00een cel mai bun caz, de 100 de ori, uneori, poate chiar de 1000 de ori. Adic\u0103, pe acela\u0219i hardware \u2013 proces\u0103m de 100 de ori mai multe cereri. Minunat, am meritat un bonus!<\/p>\n<p>Dar acum, \u00eentr-o zi frumoas\u0103, din \u00eent\u00e2mplare, sistemul a cedat \u0219i cache-ul a picat. Nimic special \u2013 deoarece cache-ul a fost ales \u00een func\u021bie de cerin\u021ba \u201evitez\u0103 mare de citire \u0219i scriere, restul nu este important\u201d.<\/p>\n<p>\u00cen ceea ce prive\u0219te \u00eenc\u0103rcarea ini\u021bial\u0103, am avut o rezerv\u0103 de hardware de 2-5 ori, iar \u00eenc\u0103rcarea \u00een acest timp a crescut de 10-100 de ori. Cu ajutorul cache-ului am exclus apelurile pentru func\u021biile grele \u0219i, astfel, totul mergea strun\u0103. Iar acum, f\u0103r\u0103 cache \u2013 cu c\u00e2t va sc\u0103dea sistemul nostru? Ce se va \u00eent\u00e2mpla? Sistemul va c\u0103dea.<\/p>\n<p>Chiar dac\u0103 cache-ul nostru nu a cedat, ci doar s-a \u0219ters temporar \u2013 va trebui s\u0103-l re\u00eenc\u0103lzim, iar acest lucru va dura ceva timp. \u0218i pentru aceast\u0103 perioad\u0103 \u2013 \u00eentreaga \u00eenc\u0103rcare va c\u0103dea pe func\u021bionalitate.<\/p>\n<p>Concluzie: proiectele cu o \u00eenc\u0103rcare ridicat\u0103 \u00een produc\u021bie necesit\u0103 de la sistem un cache care nu doar c\u0103 trebuie s\u0103 fie rapid \u00een citire \u0219i scriere, dar \u0219i s\u0103 p\u0103streze datele \u0219i s\u0103 fie rezistent la defec\u021biuni.<\/p>\n<h2>Dilema alegerii<\/h2>\n<p>\n\u00cen proiectul cu admin, alegerea s-a desf\u0103\u0219urat astfel: mai \u00eent\u00e2i am implementat Hazelcast, deoarece deja eram familiariza\u021bi cu acest produs din experien\u021ba site-ului principal. Dar, aici aceast\u0103 alegere s-a dovedit a fi nereu\u0219it\u0103 \u2013 pentru profilul nostru de \u00eenc\u0103rcare, Hazelcast func\u021bioneaz\u0103 nu doar lent, ci extrem de lent. \u0218i \u00een leg\u0103tur\u0103 cu termenul de livrare \u00een produc\u021bie, noi la acel moment deja semnaser\u0103m.<\/p>\n<p>Spoiler: cum s-au desf\u0103\u0219urat circumstan\u021bele astfel \u00eenc\u00e2t am ratat o problem\u0103 at\u00e2t de mare \u0219i am ajuns \u00eentr-o situa\u021bie critic\u0103 \u0219i tensionat\u0103 \u2013 voi povesti \u00een partea a doua \u2014 \u0219i cum ne-am g\u0103sit, \u0219i cum am ie\u0219it. Dar acum \u2013 voi spune doar c\u0103 a fost un stres intens, iar \u201es\u0103 g\u00e2ndim \u2013 pur \u0219i simplu nu g\u00e2ndim, agitam sticla\u201d. \u201eAgit\u0103m sticla\u201d \u2013 acesta este \u0219i un spoiler, despre asta pu\u021bin mai departe.<\/p>\n<p>Ce am f\u0103cut:<\/p>\n<ol>\n<li>Am \u00eentocmit o list\u0103 cu toate sistemele sugerate de Google \u0219i StackOverflow. Pu\u021bin peste 30.<\/li>\n<li>Am scris teste cu o \u00eenc\u0103rcare caracteristic\u0103 pentru produc\u021bie. Pentru aceasta, am \u00eenregistrat datele care circul\u0103 prin sistem \u00eentr-un mediu de produc\u021bie \u2013 un fel de sniffer pentru date, nu \u00een re\u021bea, ci \u00een interiorul sistemului. \u00cen teste am folosit exact aceste date.<\/li>\n<li>\u00centreaga echip\u0103, fiecare alege un sistem din list\u0103, \u00eel configureaz\u0103, ruleaz\u0103 teste. Dac\u0103 testul nu trece, nu suport\u0103 \u00eenc\u0103rcarea \u2013 elimin\u0103m, trecem la urm\u0103torul din ordine.<\/li>\n<li>La al 17-lea sistem a devenit clar c\u0103 totul este f\u0103r\u0103 speran\u021b\u0103. S-a terminat cu \u201eagitarea sticlei\u201d, este timpul s\u0103 ne g\u00e2ndim serios.<\/li>\n<\/ol>\n<p>\nDar este este un scenariu \u00een care trebuie s\u0103 alegi un sistem care \u201ese \u00eencadreaz\u0103 \u00een vitez\u0103\u201d \u00een teste preg\u0103tite dinainte. \u0218i dac\u0103 aceste teste nu exist\u0103 \u00eenc\u0103 \u0219i vrei s\u0103 alegi mai repede?<\/p>\n<p>S\u0103 ne imagin\u0103m un astfel de scenariu (e greu de imaginat c\u0103 un dezvoltator de nivel mediu+ tr\u0103ie\u0219te \u00een vid \u0219i c\u0103, \u00een momentul alegerii, nu \u0219i-a exprimat deja preferin\u021bele cu privire la ce produs ar trebui s\u0103 \u00eencerce mai \u00eent\u00e2i \u2014 a\u0219adar, considera\u021biile ulterioare sunt mai degrab\u0103 teoretice \/ filozofice \/ despre juniori).<\/p>\n<p>Dup\u0103 ce ne-am definit cerin\u021bele, vom \u00eencepe s\u0103 alegem o solu\u021bie din cutie. De ce s\u0103 reinvent\u0103m roata: vom lua un sistem de caching gata f\u0103cut.<\/p>\n<p>Dac\u0103 abia \u00eencepi \u0219i vei c\u0103uta pe Google, ordinea va fi, mai mult sau mai pu\u021bin, aceasta, dar \u00een general, reperele vor fi astfel. \u00cen primul r\u00e2nd, vei da peste Redis, care este foarte familiar. Apoi vei afla c\u0103 exist\u0103 EhCache, cea mai veche \u0219i testat\u0103 solu\u021bie. Urmeaz\u0103 Tarantool \u2014 o dezvoltare autohton\u0103 care are un aspect unic al solu\u021biei. \u0218i desigur Ignite, deoarece acum este \u00een v\u00e2rful popularit\u0103\u021bii \u0219i beneficiaz\u0103 de suport din partea SberTech. La final, mai este Hazelcast, care apare frecvent \u00een mediul enterprise al marilor companii.<\/p>\n<p>Aceasta nu e o list\u0103 exhaustiv\u0103, exist\u0103 zeci de sisteme. Dar noi ne vom concentra doar pe unul. Vom lua cele 5 sisteme alese pentru un \u201econcurs de frumuse\u021be\u201d \u0219i vom face o selec\u021bie. Cine va fi c\u00e2\u0219tig\u0103torul?<\/p>\n<h3>Redis<\/h3>\n<p>\nCitind ceea ce scrie pe site-ul oficial.<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/redis.io\/\">Redis<\/a><\/noindex> \u2014 un proiect opensource. Ofer\u0103 stocare de date \u00een memorie, posibilitatea de stocare pe disc, fragmentare automat\u0103 \u00een parti\u021bii, disponibilitate ridicat\u0103 \u0219i recuperare dup\u0103 \u00eentreruperi de re\u021bea.<\/p>\n<p>Pare c\u0103 totul e excelent, putem s\u0103-l lu\u0103m \u0219i s\u0103-l integr\u0103m \u2014 face tot ce trebuie. Dar haide\u021bi s\u0103 ne uit\u0103m, din curiozitate, \u0219i la ceilal\u021bi candida\u021bi.<\/p>\n<h3>EhCache<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.ehcache.org\/\">EhCache<\/a><\/noindex> \u2014 \u201ecel mai utilizat cache pentru Java\u201d (traducerea sloganului de pe site-ul oficial). Tot opensource. \u0218i aici \u00een\u021belegem c\u0103 Redis nu e specific pentru Java, ci universal, iar pentru interac\u021biunea cu el este nevoie de un wrapper. EhCache va fi mai convenabil. Ce altceva promite acest sistem? Fiabilitate, testare, func\u021bionalitate complet\u0103. \u0218i este, de asemenea, cel mai r\u0103sp\u00e2ndit. Cache-uie\u0219te terabytes de date.<\/p>\n<p>Redis a fost uitat, sunt gata s\u0103 aleg EhCache.<\/p>\n<p>Dar sentimentul de patriotism m\u0103 \u00eempinge s\u0103 v\u0103d ce are bun Tarantool.<\/p>\n<h3>Tarantool<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.tarantool.io\/ru\/\">Tarantool<\/a><\/noindex> \u2014 \u00eent\u00e2mpin\u0103 denumirea \u201ePlatforma de integrare a datelor \u00een timp real\u201d. Suna foarte complicat, a\u0219a c\u0103 citim pagina \u00een detaliu \u0219i g\u0103sim o afirma\u021bie r\u0103sun\u0103toare: \u201eCacheaz\u0103 100% din datele \u00een memorie\u201d. Aceasta ar trebui s\u0103 ridice \u00eentreb\u0103ri \u2014 deoarece datele pot fi semnificativ mai multe dec\u00e2t memoria. Decriptarea este c\u0103 aici se \u00een\u021belege c\u0103, pentru a scrie datele pe disc din memorie, Tarantool nu efectueaz\u0103 serializarea. \u00cen schimb, folose\u0219te caracteristici de baz\u0103 ale sistemului, c\u00e2nd memoria este pur \u0219i simplu mapat\u0103 la sistemul de fi\u0219iere cu foarte bune performan\u021be I\/O. \u00cen general, au f\u0103cut ceva remarcabil \u0219i cool.<\/p>\n<p>S\u0103 ne uit\u0103m la implement\u0103ri: Mail.ru, Avito, Beeline, Megafon, Alfa-Bank, Gazprom\u2026<\/p>\n<p>Dac\u0103 mai aveam vreo \u00eendoial\u0103 cu privire la Tarantool, cazul de implementare \u00een Mastercard m-a convins. \u00cemi iau Tarantool.<\/p>\n<p>Dar totu\u0219i\u2026<\/p>\n<h3>Ignite<\/h3>\n<p>\n\u2026 mai este <noindex><a rel=\"nofollow\" href=\"https:\/\/ignite.apache.org\/\">Ignite<\/a><\/noindex>, declarat ca \u201eplatform\u0103 de calcul in-memory\u2026 viteze in-memory pe petabytes de date\u201d. Aici sunt multe avantaje: cache in-memory distribuit, cea mai rapid\u0103 solu\u021bie key-value \u0219i cache, scalabilitate orizontal\u0103, disponibilitate ridicat\u0103, integritate strict\u0103. \u00cen general, se dovede\u0219te c\u0103 cel mai rapid este Ignite.<\/p>\n<p>Implement\u0103ri: Sberbank, American Airlines, Yahoo! Japan. \u0218i apoi mai afl\u0103m c\u0103 Ignite nu este doar implementat \u00een Sberbank, ci echipa SberTech \u00ee\u0219i trimite oamenii \u00een echipa Ignite pentru a \u00eembun\u0103t\u0103\u021bi produsul. Asta m\u0103 convinge complet \u0219i sunt preg\u0103tit s\u0103 aleg Ignite.<\/p>\n<p>Complet neclar de ce, m\u0103 uit la punctul cinci.<\/p>\n<h3>Hazelcast<\/h3>\n<p>\nIntru pe site <noindex><a rel=\"nofollow\" href=\"https:\/\/hazelcast.com\/\">Hazelcast<\/a><\/noindex>, citesc. \u0218i se pare c\u0103 cea mai rapid\u0103 solu\u021bie pentru caching distribuit este Hazelcast. Este cu mult mai rapid dec\u00e2t toate celelalte solu\u021bii \u0219i de fapt este lider \u00een domeniul in-memory data grid. \u00cen compara\u021bie cu acest lucru, a alege altceva ar fi o lips\u0103 de respect fa\u021b\u0103 de sine. Mai folose\u0219te stocarea redundant\u0103 a datelor pentru a asigura func\u021bionarea continu\u0103 a clusterei f\u0103r\u0103 pierderi de date.<\/p>\n<p>Totul, sunt preg\u0103tit s\u0103 aleg Hazelcast.<\/p>\n<h2>Comparare<\/h2>\n<p>\nDar dac\u0103 ne uit\u0103m, toate cele cinci candidate sunt descrise astfel \u00eenc\u00e2t fiecare dintre ele este cea mai bun\u0103. Cum s\u0103 alegem? Putem vedea care este cel mai popular, s\u0103 c\u0103ut\u0103m compar\u0103ri \u0219i durerea de cap va disp\u0103rea.<\/p>\n<p>G\u0103sim o astfel de <noindex><a rel=\"nofollow\" href=\"https:\/\/db-engines.com\/en\/ranking_trend\">recenzie<\/a><\/noindex>, alegem cele 5 sisteme.<\/p>\n<p><img decoding=\"async\" alt=\"Cum am ales sistemul de cache la Sportmaster. Partea 1\" src=\"\/wp-content\/uploads\/2020\/03\/98a99bbce026318ac08aacfd829935bc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nAcestea sunt sortate aici: sus Redis, pe locul doi \u2014 Hazelcast, Tarantool \u0219i Ignite c\u00e2\u0219tig\u0103 popularitate, iar EhCache r\u0103m\u00e2ne la fel ca \u00eenainte. <\/p>\n<p>Dar s\u0103 ne uit\u0103m la <noindex><a rel=\"nofollow\" href=\"https:\/\/db-engines.com\/en\/ranking_definition\">metod de calcul<\/a><\/noindex>: linkuri c\u0103tre site-uri web, interes comun pentru sistem, oferte de munc\u0103 \u2014 minunat! Asta \u00eenseamn\u0103 c\u0103, atunci c\u00e2nd sistemul meu va c\u0103dea, voi spune: \u201eNu, este de \u00eencredere! Sunt multe oferte de munc\u0103\u2026\u201d. O astfel de compara\u021bie simpl\u0103 nu va func\u021biona.<\/p>\n<p>Toate aceste sisteme nu sunt doar sisteme pentru caching. Ele au foarte multe func\u021bionalit\u0103\u021bi, inclusiv \u2013 c\u00e2nd datele nu sunt transferate clientului pentru procesare, ci invers: codul care trebuie executat pe date se mut\u0103 pe server, acolo se execut\u0103 \u0219i rezultatul este returnat. \u0218i ca sistem separat pentru caching nu sunt considerate prea des.<\/p>\n<p>Bine, nu ne pred\u0103m, s\u0103 g\u0103sim o compara\u021bie direct\u0103 \u00eentre sisteme. S\u0103 lu\u0103m dou\u0103 op\u021biuni de top \u2014 Redis \u0219i Hazelcast. Ne intereseaz\u0103 viteza, a\u0219a c\u0103 le compar\u0103m pe acest parametru.<\/p>\n<h3>Hz versus Redis<\/h3>\n<p>\nG\u0103sim a\u0219a ceva <noindex><a rel=\"nofollow\" href=\"https:\/\/hazelcast.com\/resources\/benchmark-redis-3-2-8-vs-hazelcast-3-8\/\">compara\u021bia<\/a><\/noindex>:<br \/>\n<img decoding=\"async\" alt=\"Cum am ales sistemul de cache la Sportmaster. Partea 1\" src=\"\/wp-content\/uploads\/2020\/03\/c59ff32b3b61f68f0c3917c1de2aaa8f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nAlbastru este Redis, ro\u0219u Hazelcast. Hazelcast c\u00e2\u0219tig\u0103 \u00een toate privin\u021bele, iar acest lucru este justificat: este multi-threaded, foarte optimizat, fiecare fir de execu\u021bie lucreaz\u0103 cu propria parti\u021bie, a\u0219a c\u0103 nu apar blocaje. Redis, pe de alt\u0103 parte, este single-threaded \u0219i nu beneficiaz\u0103 de CPU-uri moderne multi-core. Hazelcast utilizeaz\u0103 I\/O asincron, \u00een timp ce Redis-Jedis folose\u0219te socket-uri blocante. \u00cen cele din urm\u0103, Hazelcast folose\u0219te un protocol binar, iar Redis este orientat pe text, adic\u0103 este ineficient.<\/p>\n<p>Pentru siguran\u021b\u0103, s\u0103 ne referim la o alt\u0103 surs\u0103 de compara\u021bie. Ce ne va ar\u0103ta aceasta?<\/p>\n<h3>Redis versus Hz<\/h3>\n<p>\n\u00cenc\u0103 una <noindex><a rel=\"nofollow\" href=\"https:\/\/redislabs.com\/blog\/benchmarking-redis-enterprise-5-2-0-vs-hazelcast-3-9\/\">compara\u021bia<\/a><\/noindex>:<br \/>\n<img decoding=\"async\" alt=\"Cum am ales sistemul de cache la Sportmaster. Partea 1\" src=\"\/wp-content\/uploads\/2020\/03\/61e466d367dd6f9d52c1d7c6443d1713.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nAici, invers, ro\u0219u este Redis. Asta \u00eenseamn\u0103 c\u0103 Redis c\u00e2\u0219tig\u0103 \u00een performan\u021b\u0103 fa\u021b\u0103 de Hazelcast. \u00cen prima compara\u021bie, c\u00e2\u0219tiga Hazelcast, iar \u00een a doua \u2014 Redis. <noindex><a rel=\"nofollow\" href=\"https:\/\/redislabs.com\/blog\/benchmarking-redis-enterprise-5-2-0-vs-hazelcast-3-9\/\">Aici<\/a><\/noindex> au explicat foarte clar de ce \u00een compara\u021bia anterioar\u0103 a c\u00e2\u0219tigat Hazelcast.<\/p>\n<p>Se pare c\u0103 rezultatul primului a fost practic falsificat: Redis a fost luat din cutie, iar Hazelcast a fost ajustat pentru cazul de test. A\u0219a c\u0103, pe de o parte, nim\u0103nui nu trebuie s\u0103-i credem, iar pe de alt\u0103 parte, atunci c\u00e2nd totu\u0219i alegem un sistem, trebuie s\u0103-l configur\u0103m corect. Aceste configura\u021bii includ zeci, aproape sute de parametri.<\/p>\n<h2>Agit\u0103m sticla<\/h2>\n<p>\n\u0218i \u00eentregul proces pe care l-am parcurs acum \u00eel pot explica cu o metafor\u0103 Agit\u0103m sticla. Asta \u00eenseamn\u0103 c\u0103, \u00een acest moment, nu trebuie s\u0103 program\u0103m, ci s\u0103 \u0219tim s\u0103 citim stackoverflow. \u0218i am \u00een echipa mea o persoan\u0103, un profesionist, care exact a\u0219a lucreaz\u0103 \u00een momentele critice.<\/p>\n<p>Ce face el? Observ\u0103 o unealt\u0103 nefunc\u021bional\u0103, vede stack trace-ul, ia c\u00e2teva cuvinte din el (care anume \u2014 acesta este expertiza lui \u00een program), caut\u0103 pe Google, g\u0103se\u0219te Stack Overflow printre r\u0103spunsuri. F\u0103r\u0103 s\u0103 citeasc\u0103, f\u0103r\u0103 s\u0103 se g\u00e2ndeasc\u0103, printre r\u0103spunsurile la \u00eentrebare \u2014 alege ceva cel mai apropiat de propozi\u021bia \u00abf\u0103 asta \u0219i asta\u00bb (a alege un astfel de r\u0103spuns este talentul lui, pentru c\u0103 nu \u00eentotdeauna este exact acel r\u0103spuns care a adunat cele mai multe like-uri), aplic\u0103, se uit\u0103: dac\u0103 s-a schimbat ceva, atunci excelent. Dac\u0103 nu s-a schimbat \u2014 revenim. \u0218i repet\u0103m lansarea-verificarea-c\u0103utarea. \u0218i astfel, printr-un proces intuitiv, reu\u0219e\u0219te, dup\u0103 un timp, s\u0103 fac\u0103 codul s\u0103 func\u021bioneze. Nu \u0219tie de ce, nu \u0219tie ce a f\u0103cut, nu poate explica. Dar! Aceast\u0103 unealt\u0103 func\u021bioneaz\u0103. \u0218i \u201eincendiul este stins\u201d. Acum \u00eencepem s\u0103 ne d\u0103m seama ce am f\u0103cut. C\u00e2nd programul func\u021bioneaz\u0103 \u2014 este cu mult mai u\u0219or. \u0218i economise\u0219te semnificativ timp.<\/p>\n<p>Aceast\u0103 metod\u0103 se explic\u0103 foarte bine prin urm\u0103torul exemplu.<\/p>\n<p>C\u00e2ndva, era foarte popular s\u0103 construie\u0219ti un velier \u00een sticl\u0103. Velierul este mare \u0219i fragil, iar gura sticlei foarte \u00eengust\u0103, nu poate fi \u00eempins \u00een interior. Cum s\u0103-l construie\u0219ti?<\/p>\n<p><img decoding=\"async\" alt=\"Cum am ales sistemul de cache la Sportmaster. Partea 1\" src=\"\/wp-content\/uploads\/2020\/03\/6c69e04080f1f0da81abf7a6a80510f2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nExist\u0103 o metod\u0103, foarte rapid\u0103 \u0219i foarte eficient\u0103.<\/p>\n<p>Nava este compus\u0103 dintr-o mul\u021bime de detalii: be\u021be, sfori, p\u00e2nze, adeziv. Toate acestea le punem \u00een sticl\u0103.<br \/>\nLu\u0103m sticla cu dou\u0103 m\u00e2ini \u0219i \u00eencepem s\u0103 o agitam. O agit\u0103m-agit\u0103m. \u0218i de obicei \u2014 iese o prostie complet\u0103, desigur. Dar uneori. Uneori iese o nav\u0103! Mai exact, ceva asem\u0103n\u0103tor unei nave.<\/p>\n<p>Le ar\u0103t\u0103m acea ceva cuiva: \u201eSerio, vezi!?\u201d. \u0218i \u00eentr-adev\u0103r, de la distan\u021b\u0103 \u2014 parc\u0103 ar fi o nav\u0103. Dar mai departe nu trebuie l\u0103sat\u0103.<\/p>\n<p>Exist\u0103 \u00eenc\u0103 o metod\u0103. O folosesc baietii mai avansa\u021bi, cum ar fi hackerii.<\/p>\n<p>Am dat o sarcin\u0103 unui astfel de tip, el a f\u0103cut totul \u0219i a plecat. \u0218i te ui\u021bi \u2014 p\u0103rea c\u0103 este f\u0103cut. Dar dup\u0103 un timp, c\u00e2nd trebuie s\u0103 lucrezi din nou la cod \u2014 acolo \u00eencep ni\u0219te probleme din cauza lui... Bine c\u0103 a reu\u0219it s\u0103 se \u00eendep\u0103rteze destul de mult. Ace\u0219tia sunt genii care, folosindu-se de exemplul sticlei, fac a\u0219a: vede\u021bi, acolo unde este fundul \u2013 sticla se apleac\u0103. \u0218i nu este foarte clar dac\u0103 este transparent sau nu. Atunci hackerii \u201etaie\u201d acest fund, introduc nava acolo, apoi lipesc din nou fundul, \u0219i de parc\u0103 a\u0219a a fost \u00eentotdeauna.<\/p>\n<p>Din perspectiva stabilirii sarcinii, totul pare corect. Dar, lu\u00e2nd exemplul navelor: de ce s\u0103 construie\u0219ti o astfel de nav\u0103, cui \u00eei este necesar\u0103? Nu are nici o func\u021bionalitate. De obicei, aceste nave sunt cadouri pentru persoane foarte importante, care le pun pe un raft deasupra lor, ca un simbol, un semn. \u0218i, dac\u0103 o astfel de persoan\u0103, un lider de afaceri sau un oficial de rang \u00eenalt, are o astfel de 'am\u0103gire' ca steag, la care i s-a t\u0103iat gura, ar fi mai bine s\u0103 nu afle niciodat\u0103 despre asta. A\u0219adar, cum se fac, de fapt, aceste nave care pot fi d\u0103ruite unei persoane importante?<\/p>\n<p>Singurul loc, esen\u021bial, cu care nu se poate face nimic, este corpul navei. \u0218i corpul navei tocmai trece prin gura sticlei. \u00cen timp ce nava este asamblat\u0103 \u00een afara sticlei. Dar nu este doar o simpl\u0103 asamblare, este o adev\u0103rat\u0103 art\u0103 me\u0219te\u0219ug\u0103reasc\u0103. Se adaug\u0103 bra\u021be speciale \u00een componente, care permit ulterior ridicarea acestora. De exemplu, se pliaz\u0103 p\u00e2nzele, se aduc cu grij\u0103 \u00een\u0103untru, \u0219i apoi, cu ajutorul unei pensete, se ridic\u0103 foarte cu aten\u021bie, precis. Ca rezultat, este o oper\u0103 de art\u0103, pe care o po\u021bi d\u0103rui cu o con\u0219tiin\u021b\u0103 curate \u0219i m\u00e2ndrie.<\/p>\n<p>\u0218i dac\u0103 dorim ca proiectul s\u0103 fie de succes \u2013 \u00een echip\u0103 trebuie s\u0103 fie cel pu\u021bin o persoan\u0103-artist. Cineva care se \u00eengrije\u0219te de calitatea produsului \u0219i \u021bine cont de toate aspectele, f\u0103r\u0103 a sacrifica niciunul, chiar \u0219i \u00een momentele de stres, atunci c\u00e2nd circumstan\u021bele necesit\u0103 s\u0103 se fac\u0103 ceva urgent \u00een detrimentul esen\u021bialului. Toate proiectele de succes, care sunt durabile, care au trecut proba timpului, sunt construite pe acest principiu. \u00cen ele exist\u0103 ceva foarte precis \u0219i unic, ceva care folose\u0219te toate posibilit\u0103\u021bile disponibile. \u00cen exemplul cu nava \u00een sticl\u0103 \u2013 se joac\u0103 cu ideea c\u0103 corpul navei trece prin gura sticlei.<\/p>\n<p>Revenind la alegerea serverului nostru de caching, cum ar putea fi aplicat\u0103 aceast\u0103 metod\u0103? Propun o variant\u0103 de selec\u021bie din toate sistemele disponibile \u2013 s\u0103 nu zguduie sticla, s\u0103 nu aleag\u0103, ci s\u0103 se uite la ceea ce exist\u0103 \u00een principiu, la ce trebuie s\u0103 \u021bin\u0103 cont \u00een alegerea sistemului.<\/p>\n<h2>Unde s\u0103 c\u0103ut\u0103m bottle-neck<\/h2>\n<p>\nS\u0103 \u00eencerc\u0103m s\u0103 nu agit\u0103m sticla, s\u0103 nu trecem prin tot ce avem pe r\u00e2nd, dar s\u0103 vedem ce probleme ar putea ap\u0103rea dac\u0103, dintr-o dat\u0103, trebuie s\u0103 proiect\u0103m un astfel de sistem pe cont propriu. Nu vom construi o biciclet\u0103, dar vom folosi acest diagram pentru a ne orienta asupra aspectelor la care trebuie s\u0103 acord\u0103m aten\u021bie \u00een descrierile produselor. S\u0103 schi\u021b\u0103m o astfel de schem\u0103.<\/p>\n<p><img decoding=\"async\" alt=\"Cum am ales sistemul de cache la Sportmaster. Partea 1\" src=\"\/wp-content\/uploads\/2020\/03\/f2c36d07383d778e60b2f800749012ca.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nDac\u0103 sistemul este distribuit, atunci vor exista mai multe servere (6). S\u0103 presupunem c\u0103 avem patru (convenabil de plasat \u00een imagine, dar, desigur, pot fi oric\u00e2t de multe). Dac\u0103 serverele sunt pe diferite noduri, \u00eenseamn\u0103 c\u0103 pe toate acestea ruleaz\u0103 un anumit cod care se ocup\u0103 de formarea unui cluster \u0219i, \u00een caz de deconectare, s\u0103 se reconecteze \u0219i s\u0103 se recunoasc\u0103 unul pe cel\u0103lalt.<\/p>\n<p>De asemenea, avem nevoie de un cod de logic\u0103 (2) care se ocup\u0103 efectiv de caching. Cu acest cod, clien\u021bii interac\u021bioneaz\u0103 printr-un anumit API. Codul client (1) poate fi fie \u00een cadrul acelea\u0219i JVM, fie poate s\u0103 se acceseze prin re\u021bea. Logica implementat\u0103 intern decide ce obiecte s\u0103 r\u0103m\u00e2n\u0103 \u00een cache \u0219i pe care s\u0103 le elimin\u0103m. Pentru stocarea cache-ului, utiliz\u0103m memorie (3), dar, dac\u0103 este necesar, putem salva o parte din date \u0219i pe disc (4).<\/p>\n<p>S\u0103 vedem \u00een ce p\u0103r\u021bi va ap\u0103rea carga. De fapt, fiecare s\u0103geat\u0103 \u0219i fiecare nod vor fi solicitate. \u00cen primul r\u00e2nd, \u00eentre codul client \u0219i API, dac\u0103 aceasta este o interac\u021biune de re\u021bea, pot ap\u0103rea \u00eent\u00e2rzieri semnificative. \u00cen al doilea r\u00e2nd, \u00een interiorul API-ului \u2013 dac\u0103 exagerezi cu logica complex\u0103, putem ajunge la o utilizare maxim\u0103 a CPU-ului. Ar fi bine ca logica s\u0103 nu acceseze memoria f\u0103r\u0103 motiv. Iar interac\u021biunea cu sistemul de fi\u0219iere r\u0103m\u00e2ne \u2013 de obicei, este vorba despre serializare \/ restaurare \u0219i scriere \/ citire.<\/p>\n<p>Apoi, interac\u021biunea cu clusterul. Cel mai probabil, acesta va fi \u00een acela\u0219i sistem, dar ar putea fi \u0219i separat. Aici trebuie s\u0103 lu\u0103m \u00een considerare transferul de date c\u0103tre acesta, viteza de serializare a datelor \u0219i interac\u021biunea dintre cluster.<\/p>\n<p>Acum, pe de o parte \u2013 putem imagina \u201ece roti\u021be vor fi \u00een mi\u0219care\u201d \u00een sistemul de cache \u00een timpul proces\u0103rii cererilor din codul nostru, iar pe de alt\u0103 parte \u2013 putem estima ce \u0219i c\u00e2te cereri va genera codul nostru c\u0103tre acest sistem. Acest lucru este suficient pentru a face o alegere mai mult sau mai pu\u021bin ra\u021bional\u0103 \u2013 de a adapta sistemul la varianta noastr\u0103 de utilizare.<\/p>\n<p><b>Hazelcast<\/b><\/p>\n<p>S\u0103 vedem cum putem aplica o astfel de descompunere la lista noastr\u0103. De exemplu, Hazelcast.<\/p>\n<p>Pentru a plasa\/ob\u021bine date din Hazelcast, codul client se adreseaz\u0103 (1) API-ului. Hz permite rularea serverului ca embedded, iar \u00een acest caz, apelul c\u0103tre API este o invocare a metodei \u00een cadrul JVM, poate fi considerat gratuit.<\/p>\n<p>Pentru ca logica s\u0103 func\u021bioneze \u00een (2), Hz se bazeaz\u0103 pe hash-ul unui array de bytes serializat, adic\u0103 serializarea cheii va avea loc oricum. Acesta este un overhead inevitabil pentru Hz.<br \/>\nStrategiile de Eviction sunt implementate bine, dar pentru cazuri speciale \u2013 se pot conecta cele proprii. Nu trebuie s\u0103 ne facem griji pentru aceast\u0103 parte.<\/p>\n<p>Storage-ul (4) poate fi conectat. Excelent. Interac\u021biunea (5) pentru embedded poate fi considerat\u0103 instantanee. Schimbul de date \u00eentre nodurile din cluster (6) \u2013 da, este disponibil. Aceasta contribuie la rezilien\u021ba la erori, cu un cost \u00een vitez\u0103. Costul poate fi redus prin func\u021bia Hz Near-cache \u2013 datele ob\u021binute din alte noduri ale clusterului vor fi cache-uite.<\/p>\n<p>Ce se poate face \u00een astfel de condi\u021bii pentru a cre\u0219te viteza?<\/p>\n<p>De exemplu, pentru a evita serializarea cheii \u00een (2) \u2013 pe l\u00e2ng\u0103 Hazelcast se poate ad\u0103uga un alt cache, pentru cele mai fierbin\u021bi date. La Sportmaster pentru acest scop a fost ales Caffeine.<\/p>\n<p>Pentru ajustare la nivelul (6), Hz propune dou\u0103 tipuri de stocare: IMap \u0219i ReplicatedMap.<br \/>\n<img decoding=\"async\" alt=\"Cum am ales sistemul de cache la Sportmaster. Partea 1\" src=\"\/wp-content\/uploads\/2020\/03\/ce752c9a0f46609add8de8644a7ad17f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nMerit\u0103 men\u021bionat cum a ajuns Hazelcast \u00een tehnologia Sportmaster.<\/p>\n<p>\u00cen 2012, c\u00e2nd lucram la primul pilot al viitorului site, Hazelcast a fost primul link pe care l-a oferit motorul de c\u0103utare. \u00cent\u00e2lnirea a \u00eenceput \u00abde la prima \u00eencercare\u00bb \u2013 ne-a cucerit faptul c\u0103 la doar dou\u0103 ore dup\u0103 ce am integrat Hz \u00een sistem \u2013 func\u021biona. \u0218i func\u021biona bine. P\u00e2n\u0103 la sf\u00e2r\u0219itul zilei am scris c\u00e2teva teste, ne-am bucurat. Iar aceast\u0103 stare de spirit ne-a fost suficient\u0103 pentru a dep\u0103\u0219i surprizele pe care Hz le-a adus de-a lungul timpului. Acum, echipa Sportmaster nu are motive s\u0103 renun\u021be la Hazelcast.<\/p>\n<p>Dar argumentele precum \u00abprimul link \u00een motorul de c\u0103utare\u00bb \u0219i \u00abam adunat rapid HelloWorld\u00bb \u2013 sunt, desigur, excep\u021bii \u0219i particularit\u0103\u021bi ale momentului \u00een care a avut loc alegerea. Adev\u0103ratele teste pentru sistemul ales \u00eencep odat\u0103 cu ie\u0219irea \u00een produc\u021bie, \u0219i tocmai \u00een aceast\u0103 etap\u0103 merit\u0103 s\u0103 ne concentr\u0103m la alegerea oric\u0103rui sistem, inclusiv a cache-ului. De fapt, \u00een cazul nostru, putem spune c\u0103 am ales Hazelcast \u00eent\u00e2mpl\u0103tor, dar apoi s-a dovedit c\u0103 am ales corect.<\/p>\n<p>Pentru produc\u021bie, mai importante sunt: monitorizarea, tratarea erorilor la noduri separate, replicarea datelor, costurile de scalare. Adic\u0103, merit\u0103 s\u0103 ne concentr\u0103m pe sarcinile care vor ap\u0103rea \u00een timpul \u00eentre\u021binerii sistemului \u2013 atunci c\u00e2nd sarcina va dep\u0103\u0219i de zeci de ori cea planificat\u0103, c\u00e2nd din gre\u0219eal\u0103 vom \u00eenc\u0103rca ceva gre\u0219it \u0219i gre\u0219it, c\u00e2nd va fi necesar s\u0103 lans\u0103m o nou\u0103 versiune a codului, s\u0103 \u00eenlocuim datele \u0219i s\u0103 facem acest lucru f\u0103r\u0103 ca clien\u021bii s\u0103 observe.<\/p>\n<p>Pentru toate aceste cerin\u021be, Hazelcast este, f\u0103r\u0103 \u00eendoial\u0103, potrivit.<\/p>\n<h2>Va urma<\/h2>\n<p>\nDar Hazelcast nu este o panacee. \u00cen 2017, am ales Hazelcast pentru cache-ul din back-office, baz\u00e2ndu-ne doar pe impresiile pozitive din experien\u021bele anterioare. Acest lucru a jucat un rol crucial \u00eentr-o fars\u0103 foarte amar\u0103, care ne-a adus \u00eentr-o situa\u021bie complicat\u0103 \u0219i am reu\u0219it \u201eeroic\u201d s\u0103 ie\u0219im din ea \u00een 60 de zile. Dar despre asta, \u00een partea urm\u0103toare.<\/p>\n<p>\u00centre timp\u2026 Happy New Code!<br \/>\n<br \/>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/490912\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041f\u044c\u044f\u043d\u043a\u043e\u0432, \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440. \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b, \u043a\u0430\u043a \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0430\u0441\u044c \u0440\u0430\u0431\u043e\u0442\u0430 \u043d\u0430\u0434 \u0441\u0430\u0439\u0442\u043e\u043c \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440 \u0432 2012 \u0433\u043e\u0434\u0443, \u043a\u0430\u043a\u0438\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u0442\u0438\u0432\u044b \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u00ab\u043f\u0440\u043e\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u00bb \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u043a\u0430\u043a\u0438\u0435 \u0433\u0440\u0430\u0431\u043b\u0438 \u043c\u044b \u0441\u043e\u0431\u0440\u0430\u043b\u0438. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043c\u044b\u0441\u043b\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u0437\u0430 \u0434\u0440\u0443\u0433\u0438\u043c \u0441\u044e\u0436\u0435\u0442\u043e\u043c \u2013 \u0432\u044b\u0431\u043e\u0440 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f java-\u0431\u044d\u043a\u0435\u043d\u0434\u0430 \u0432 \u0430\u0434\u043c\u0438\u043d\u043a\u0435 \u0441\u0430\u0439\u0442\u0430. \u042d\u0442\u043e\u0442 \u0441\u044e\u0436\u0435\u0442 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":73950,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-73949","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041f\u044c\u044f\u043d\u043a\u043e\u0432, \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/kak-my-v-sportmastere-vybirali-sistemu-keshirovaniya-chast-1\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a \u043c\u044b \u0432 \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0427\u0430\u0441\u0442\u044c 1 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041f\u044c\u044f\u043d\u043a\u043e\u0432, \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/kak-my-v-sportmastere-vybirali-sistemu-keshirovaniya-chast-1\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-03-12T23:42:07+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-12T23:42:07+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Cum am ales sistemul de caching la Sportmaster. Partea 1 | ProHoster","description":"Salut! Numele meu este Alexey P'yankov, sunt dezvoltator la compania Sportmaster.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/kak-my-v-sportmastere-vybirali-sistemu-keshirovaniya-chast-1","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a \u043c\u044b \u0432 \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0427\u0430\u0441\u0442\u044c 1 | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041f\u044c\u044f\u043d\u043a\u043e\u0432, \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440.","og:url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/kak-my-v-sportmastere-vybirali-sistemu-keshirovaniya-chast-1","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-03-12T23:42:07+00:00","article:modified_time":"2020-03-12T23:42:07+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"73949","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 18:23:51","updated":"2022-09-28 05:05:57","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/73949","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=73949"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/73949\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/73950"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=73949"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=73949"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=73949"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}