{"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\/et\/blog\/administrirovanie\/kak-my-v-sportmastere-vybirali-sistemu-keshirovaniya-chast-1","title":{"rendered":"Kuidas me Sportmasteris valisime vahem\u00e4lus\u00fcsteemi. Osa 1","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Tere! Minu nimi on Aleksei Pjankov, ma olen arendaja ettev\u00f5ttes Sportmaster. Selles <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/485088\/\">postituses<\/a><\/noindex> r\u00e4\u00e4gin, kuidas Sportmasteri veebisaidi tegemine 2012. aastal algas, milliseid algatusi \u00f5nnestus \"l\u00e4bi viia\" ja vastupidi, milliseid t\u00f5kkeid me kogusime.<\/p>\n<p>T\u00e4na tahan jagada m\u00f5tteid, mis j\u00e4rgivad teist teemat \u2013 Java tagaplaneerimise vahem\u00e4lu s\u00fcsteemi valimine saidi administreerimiseks. See teema on minu jaoks eriti oluline \u2013 kuigi lugu kestis vaid 2 kuud, t\u00f6\u00f6tasime nendel 60 p\u00e4eval 12-16 tundi ja ei saanud \u00fchtki vaba p\u00e4eva. Paar korda ei olnud ma kunagi varem m\u00f5elnud ega kujutlenud, et saab nii palju t\u00f6\u00f6d teha.<\/p>\n<p>Seet\u00f5ttu jagan teksti kaheks osaks, et mitte liiga koormata. Vastupidi, esimene osa saab olema v\u00e4ga kerge \u2013 ettevalmistus, sissejuhatus, m\u00f5ned m\u00f5tted, mis on vahem\u00e4lu. Kui olete juba kogenud arendaja v\u00f5i t\u00f6\u00f6tanud vahem\u00e4ludega \u2013 tehniliselt ei pakkuda see artikkel t\u00f5en\u00e4oliselt midagi uut. Siiski, v\u00e4ikese \u00fclevaate alla algajale v\u00f5ib see anda suuniseid, kuhu p\u00f6\u00f6rduda, kui ta satub sellele teele.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/490912\/\"><img decoding=\"async\" alt=\"Kuidas me Sportmasteris valisime vahem\u00e4lus\u00fcsteemi. Osa 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 \/>\nKui Sportmasteri uue veebiversiooni tootmise k\u00e4ivitamine toimus, toimusid andmete edastamine, \u00fctleme nii, mitte just mugavalt. Aluseks olid tabelid, mis olid ette valmistatud eelmise veebiversiooni (Bitrix) jaoks, mida tuli laadida ETL-i, viia uuele kujule ja rikastada erinevate uhkustega veel erinevatest s\u00fcsteemidest. Et uus pilt v\u00f5i tootekirjeldus veebis ilmuks, tuli oodata j\u00e4rgmise p\u00e4evani \u2014 uuendamine toimus ainult \u00f6\u00f6sel, \u00fcks kord \u00f6\u00f6p\u00e4evas.<\/p>\n<p>Alguses oli esimesel n\u00e4dalal p\u00e4rast tootmisse minekut nii palju muresid, et sisu haldajate ebamugavused tundusid t\u00fchised. Kuid niipea, kui k\u00f5ik rahunes, j\u00e4tkus projekti areng \u2014 2015. aasta alguses, p\u00e4rast mitmeid kuud, hakkasime aktiivselt arendama administraatori paneeli. Aastal 2015 ja 2016 l\u00e4ks k\u00f5ik h\u00e4sti, me teostasime regulaarselt versioone, administraatori paneel h\u00f5lmas \u00fcha suuremat osa andmete ettevalmistamisest ja valmistusime selleks, et peagi usaldatakse meie meeskonnale k\u00f5ige t\u00e4htsam ja keerulisem \u2014 toote kontuur (t\u00e4ielik andmete ettevalmistamine ja haldamine k\u00f5igi toodete osas). Kuid suvel 2017, just enne toote kontuuri k\u00e4ivitamist, sattus projekt v\u00e4ga keerulisse olukorda \u2014 just seoses probleemidega vahem\u00e4luga. Sellest episoodist ma tahangi r\u00e4\u00e4kida selle kaheosalisest publikatsioonist teises osas.<\/p>\n<p>Kuid selles postituses alustan kaugelt, kogudes teatud m\u00f5tteid \u2014 ettekujutusi vahem\u00e4lust, mille \u00fcle oleks olnud hea enne suurt projekti eelnevalt m\u00f5elda.<\/p>\n<h2>Kui tekib vahem\u00e4luga seotud \u00fclesanne<\/h2>\n<p>\nCache'i \u00fclesanne ei teki lihtsalt nii. Me oleme arendajad, kirjutame tarkvaratoote ja tahame, et see oleks n\u00f5utud. Kui toode on n\u00f5utud ja edukas \u2014 kasutajad tulevad. Ja nad tulevad taas ja taas. Ning l\u00f5puks on kasutajaid v\u00e4ga palju, ja siis muutub toode suure koormuse all olevaks.<\/p>\n<p>Esimestel etappidel ei m\u00f5tle me koodi optimeerimisele ja tootlikkusele. Peamine on funktsionaalsus, kiiresti piloot v\u00e4lja viia ja h\u00fcpoteese testida. Ja kui koormus kasvab \u2013 me uuendame riistvara. Suurendame selle mahutavust kaks, kolm, viis v\u00f5i isegi k\u00fcmme korda. Siin v\u00f5ib rahandus rohkem ei lubada. Ja kui palju kasutajate arv kasvab? See ei ole 2-5-10, vaid edusammude korral \u2014 see v\u00f5ib ulatuda 100-1000 ja kuni 100 000 korda. Seega, varem v\u00f5i hiljem tuleb optimeerimisega tegelema hakata.<\/p>\n<p>Kujutame ette, et mingi koodi osa (nimetame seda funktsiooniks) t\u00f6\u00f6tab ebamugavalt kaua ja me tahame t\u00e4itmisaja v\u00e4hendada. Funktsioon v\u00f5ib olla n\u00e4iteks juurdep\u00e4\u00e4s andmebaasile v\u00f5i m\u00f5ne keeruka loogika t\u00e4itmine \u2014 peamine on see, et see kestab kaua. Kuidas saaksime t\u00e4itmisaja nulli viia? Teoreetiliselt on v\u00f5imalus v\u00e4hendada selle aega kuni nullini, ei kaugemale. Kuidas aga viia t\u00e4itmise aeg nulli? Vastus: \u00fcldse mitte t\u00e4ita. Selle asemel \u2014 tagastada kohe tulemus. Kuidas aga tulemus teada saada? Vastus: kas arvutada see v\u00e4lja v\u00f5i vaadata kuskilt. V\u00e4lja arvutamine \u2014 see on pikk protsess. Aga vaatamine \u2014 see t\u00e4hendab n\u00e4iteks meeles pidada tulemust, mille funktsioon eelmisel korral andis, kui seda sama koosseisu parametritega kutsuti.<\/p>\n<p>See, rakenduse funktsioon ei ole meile oluline. Piisab ainult teada, millistest parameetritest tulemus s\u00f5ltub. Kui aga esitada parameetrite v\u00e4\u00e4rtused objekti kujul, mida saab kasutada v\u00f5tmena mingis salvestuses \u2013 siis saame arvutamise tulemuse salvestada ja j\u00e4rgmiste p\u00e4ringute korral seda lugeda. Kui need kirje-lugemise protsessid toimuvad kiiremini kui funktsiooni t\u00e4itmine \u2013 saavutame kiirusel kasu. Kasu suurus v\u00f5ib ulatuda 100, 1000 ja isegi 100 000 korda (10^5 on pigem erand, kuid korralikult laguneva andmebaasi puhul on see t\u00e4iesti v\u00f5imalik).<\/p>\n<h2>Peamised n\u00f5uded vahem\u00e4llu salvestamise s\u00fcsteemile<\/h2>\n<p>\nEsimene, mis v\u00f5ib olla n\u00f5udmine vahem\u00e4llu salvestamise s\u00fcsteemile \u2014 kiire lugemisekiirus ja veidi v\u00e4hem \u2013 kirjutamise kiirus. See on t\u00f5si, kuid ainult seni, kuni me s\u00fcsteemi tootmisse toome.<\/p>\n<p>Loome sellise juhtumi.<\/p>\n<p>Oletame, et me oleme praegu koormuse jaoks riistvara taganud ja n\u00fc\u00fcd alustame j\u00e4rk-j\u00e4rgult vahem\u00e4lu kasutuselev\u00f5ttu. Kasutajate arv kasvab j\u00e4rk-j\u00e4rgult, koormus suureneb \u2014 lisame veidi vahem\u00e4lusid, \u00fchendame neid siin-seal. Nii j\u00e4tkub see m\u00f5nda aega, ja n\u00fc\u00fcd kutsutakse juba raske funktsioonide t\u00e4itmine t\u00e4pselt harva \u2014 kogu peamine koormus lasub vahem\u00e4lu. Selle aja jooksul on kasutajate arv kasvanud N korda.<\/p>\n<p>Ja kui algne riistvara varu v\u00f5is olla 2-5 korda, siis vahem\u00e4lu abil saime t\u00f5sta j\u00f5udlust isegi 10 korda v\u00f5i, heas olukorras, 100 korda, kohati isegi 1000 korda. See t\u00e4hendab, et samas riistvara peal \u2014 t\u00f6\u00f6tleme 100 korda rohkem p\u00e4ringuid. Suurep\u00e4rane, oleme pr\u00e4\u00e4niku \u00e4ra teeninud!<\/p>\n<p>Aga n\u00fc\u00fcd, \u00fchel kenal hetkel, juhtus s\u00fcsteemis viga ja vahem\u00e4lu kukkus kokku. Miski erilist \u2014 oleneb ju sellest, et vahem\u00e4lu valiti n\u00f5udmisel \"k\u00f5rge lugemise ja kirjutamise kiirus, muu pole oluline.\"<\/p>\n<p>Algselt oli meie riistvaral koormus 2-5 korda, aga selle aja jooksul on koormus kasvanud 10-100 korda. Vahefilter elimineeris raskeid funktsioonide kutsungite laadimist, seega k\u00f5ik t\u00f6\u00f6tas sujuvalt. Aga n\u00fc\u00fcd, ilma vahefilterita \u2013 kui palju meie s\u00fcsteem kannatab? Mis meiega juhtub? S\u00fcsteem kukub kokku.<\/p>\n<p>Isegi kui meie vahefilter ei ole kokku kukkunud, vaid lihtsalt puhastatud m\u00f5neks ajaks \u2013 tuleb seda uuesti soojendada, ja see v\u00f5tab aega. Selle aja jooksul kukub peamine koormus funktsionaalsusele.<\/p>\n<p>Kokkuv\u00f5te: k\u00f5rge koormusega projektid tootmisprotsessis n\u00f5uavad s\u00fcsteemilt vahefilterit mitte ainult kiire lugemise ja kirjutamise osas, vaid ka andmete s\u00e4ilitamise ja t\u00f5rgete suhtes vastupidavust.<\/p>\n<h2>Valikute vaev<\/h2>\n<p>\nAdminpaneeli projektis kujunes valik selliseks: esmalt paigaldasime Hazelcasti, kuna olime selle tootega juba p\u00f5hisaidi kogemuse kaudu tuttavad. Kuid siin osutus selline valik eba\u00f5nnestunuks \u2013 meie koormuse profiili puhul t\u00f6\u00f6tab Hazelcast mitte lihtsalt aeglaselt, vaid \u00e4\u00e4rmiselt aeglaselt. Ja tootmisprotsessi t\u00e4htaegade osas olime tol hetkel juba allkirjastanud.<\/p>\n<p>Spoiler: how exactly the circumstances unfolded that led us to miss such a blunder and ended up in a tense situation \u2013 I will explain in the second part \u2014 how we got there and how we got out. But for now, I'll just say that it was a significant stress, and 'thinking \u2013 somehow, does not come to mind, we shake the bottle.' 'Shake the bottle' is also a spoiler, more on that later.<\/p>\n<p>What we did:<\/p>\n<ol>\n<li>We compile a list of all systems suggested by Google and StackOverflow. A little more than 30.<\/li>\n<li>We write load tests typical for production. For this, we recorded data that passes through the system in the production environment \u2014 a kind of sniffer for data not on the network but within the system. We ran exactly these data in the tests.<\/li>\n<li>As a team, each member selects the next system from the list, configures it, and runs the tests. If the test fails, can't handle the load \u2013 we discard it and move on to the next one in line.<\/li>\n<li>By the 17th system, it became clear that all was hopeless. Enough with 'shaking the bottle', it was time to think seriously.<\/li>\n<\/ol>\n<p>\nSee on valik, kus tuleb valida s\u00fcsteem, mis \"mahtus kiiruskatsetest\" l\u00e4bi. Aga kui selliseid katseid veel pole ja on soov valida kiiremat?<\/p>\n<p>Simuleerime sellist varianti (raske on ette kujutada, et arendaja, kelle oskused on keskmised ja k\u00f5rgemad, elab vaakumis, ning valiku hetkel pole ta veel otsustanud, millist toodet esimesena proovida \u2014 seega, edasised arutlused on pigem teoreetilised\/filosoofilised\/juniortaseme suhtes).<\/p>\n<p>Kui oleme n\u00f5uded selgeks teinud, alustame lahenduse valimist v\u00e4lja pakutud variandi hulgast. Miks peaks jalgratast leiutama: me v\u00f5tame valmis vahem\u00e4lu s\u00fcsteemi.<\/p>\n<p>Kui alles alustate ja hakkate guugeldama, siis j\u00e4rjekord on pluss-miinus sama, kuid \u00fcldiselt on suunised sellised. Esiteks satute kindlasti Redis'esse, see on k\u00f5ikjal tuntud. Siis saate teada, et on olemas EhCache, mis on vanim ja usaldusv\u00e4\u00e4rne s\u00fcsteem. Edasi kirjutatakse Tarantoolist \u2014 kodumaine arendus, milles on ainulaadne lahenduse aspekt. Ja samuti Ignite, kuna see on praegu populaarsuse t\u00f5usuteel ja naudib SberTechi toetust. L\u00f5puks veel Hazelcast, kuna ettev\u00f5tte maailmas on see sageli suurte ettev\u00f5tete seas silma j\u00e4\u00e4nud.<\/p>\n<p>See on vaid v\u00e4ike valik, s\u00fcsteeme on k\u00fcmneid. Meie valime neist vaid \u00fche. Vaatame viit valitud s\u00fcsteemi \"ilu konkurssile\" ja teeme valiku. Kes on v\u00f5itja?<\/p>\n<h3>Redis<\/h3>\n<p>\nLoe, mida ametlikul veebilehel kirjutatakse.<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/redis.io\/\">Redis<\/a><\/noindex> \u2014 avatud l\u00e4htekoodiga projekt. Pakub andmete salvestamist m\u00e4lu (in-memory) ja v\u00f5imalust salvestada kettale (on-disk), automaatset osade moodustamist, k\u00f5rget k\u00e4ttesaadavust ning taastumist v\u00f5rgukatkestuste korral.<\/p>\n<p>Tundub, et k\u00f5ik on suurep\u00e4rane, saab v\u00f5tta ja kasutama hakata \u2014 k\u00f5ik, mis vajalik, see t\u00f6\u00f6tab. Kuid vaatame lihtsalt huvi p\u00e4rast ka teisi kandidaate.<\/p>\n<h3>EhCache<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.ehcache.org\/\">EhCache<\/a><\/noindex> \u2014 \"k\u00f5ige laialdasemalt kasutatav Java vahem\u00e4lu\" (t\u00f5lge ametlikult veebilehelt). Ka avatud l\u00e4htekoodiga. Ja siin saame aru, et Redis ei ole Java jaoks, vaid universaalne, ning selleks, et sellega suhestuda, on vaja katet. EhCache tundub mugavam. Mida veel s\u00fcsteem lubab? Usaldusv\u00e4\u00e4rsus, testitud tootmine, t\u00e4ielik funktsionaalsus. Ja on ka k\u00f5ige levinum. Salvestab terabaitide ulatuses andmeid.<\/p>\n<p>Redis on unustanud, olen valmis valima EhCache.<\/p>\n<p>Aga patriootlik tunne ajendab mind vaatama, millega on hea Tarantool.<\/p>\n<h3>Tarantool<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.tarantool.io\/ru\/\">Tarantool<\/a><\/noindex> \u2014 tutvustatakse kui \u201eReaalaja andmete integreerimise platvorm\u201d. See k\u00f5lab keeruliselt, seega vaatame lehte p\u00f5hjalikult ja leidke v\u00e4ide: \u201eCache\u2019ib 100% andmeid m\u00e4lu sees\u201d. See peaks tekitama k\u00fcsimusi \u2014 kuna andmeid v\u00f5ib olla m\u00e4rkimisv\u00e4\u00e4rselt rohkem kui m\u00e4lu. Selgitus on selles, et andmete kirjutamisel ketta peale ei kasuta Tarantool serialiseerimist. Selle asemel kasutatakse madala taseme s\u00fcsteemi omadusi, kui m\u00e4lu kaardistatakse failis\u00fcsteemile v\u00e4ga hea I\/O j\u00f5udlusega. Kokkuv\u00f5ttes tehti see kuidagi suurep\u00e4raselt ja \u00e4gedalt.<\/p>\n<p>Vaadakem rakendusi: Mail.ru ettev\u00f5tte peamine kanal, Avito, Beeline, Megafon, Alfa-Bank, Gazprom\u2026<\/p>\n<p>Kui mul j\u00e4i veel kahtlusi Tarantooli osas, siis Mastercardi rakenduse juhtum veenab mind t\u00e4ielikult. Valin Tarantooli.<\/p>\n<p>Aga siiski\u2026<\/p>\n<h3>Ignite<\/h3>\n<p>\n\u2026 on veel <noindex><a rel=\"nofollow\" href=\"https:\/\/ignite.apache.org\/\">Ignite<\/a><\/noindex>, mis on deklareeritud kui \u201ein-memory arvutusplatvorm\u2026 in-memory kiirus petabaidandmete osas\u201d. Siin on ka palju eeliseid: jagatud in-memory vahem\u00e4lu, k\u00f5ige kiirem key-value salvestus ja vahem\u00e4lu, horisontaalne skaleeritavus, k\u00f5rge k\u00e4ttesaadavus, range terviklikkus. Kokkuv\u00f5ttes tundub, et k\u00f5ige kiirem on Ignite.<\/p>\n<p>Rakendused: Sberbank, American Airlines, Yahoo! Japan. Ja siis kuulen, et Ignite ei ole lihtsalt Sberbankis rakendatud, vaid SberTechi meeskond saadab oma inimesi Ignite'i meeskonda toodet t\u00e4iustama. See on t\u00e4iesti veenev ja ma olen valmis Ignite'i v\u00f5tma.<\/p>\n<p>T\u00e4iesti arusaamatu, miks ma vaatan viiendat punkti.<\/p>\n<h3>Hazelcast<\/h3>\n<p>\nSisenen veebisaidile <noindex><a rel=\"nofollow\" href=\"https:\/\/hazelcast.com\/\">Hazelcast<\/a><\/noindex>, loen. Ja selgub, et kiireim lahendus jagatud vahem\u00e4lu jaoks on Hazelcast. See on kordades kiirem kui k\u00f5ik muud lahendused ja ta on \u00fcldiselt liider in-memory andmev\u00f5rgus. T\u00e4nu sellele oleks midagi muud v\u00f5tta nagu enda mitte austamine. Ja ta kasutab ka \u00fcleliigset andmete hoidmist klastrite pidevaks t\u00f6\u00f6ks ilma andmekadudeta.<\/p>\n<p>K\u00f5ik, olen valmis Hazelcast'i v\u00f5tma.<\/p>\n<h2>V\u00f5rdlus<\/h2>\n<p>\nKuid kui vaadata, siis on k\u00f5ik viis kandidaati nii esitatud, et iga\u00fche seas on k\u00f5ige parem. Kuidas valida? V\u00f5ime vaadata, milline neist on k\u00f5ige populaarsem, otsida v\u00f5rdlusi ja peavalu kaob.<\/p>\n<p>Leidke selline <noindex><a rel=\"nofollow\" href=\"https:\/\/db-engines.com\/en\/ranking_trend\">\u00fclevaade<\/a><\/noindex>, valime meie 5 s\u00fcsteemi.<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas me Sportmasteris valisime vahem\u00e4lus\u00fcsteemi. Osa 1\" src=\"\/wp-content\/uploads\/2020\/03\/98a99bbce026318ac08aacfd829935bc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nSiin on nad sorteeritud: ees Redis, teisel kohal \u2014 Hazelcast, populaarsust koguvad Tarantool ja Ignite, EhCache j\u00e4\u00e4b endiselt samaks. <\/p>\n<p>Kuid vaatame <noindex><a rel=\"nofollow\" href=\"https:\/\/db-engines.com\/en\/ranking_definition\">arvutusmeetodit<\/a><\/noindex>: lingid veebisaitidele, \u00fcldine huvi s\u00fcsteemi vastu, t\u00f6\u00f6pakkumised \u2014 suurep\u00e4rane! See t\u00e4hendab, et kui minu s\u00fcsteem kukub, \u00fctlen: 'Ei, see on ju usaldusv\u00e4\u00e4rne! Siin on palju t\u00f6\u00f6pakkumisi...'. Niisugune lihtne v\u00f5rdlus ei sobi.<\/p>\n<p>K\u00f5ik need s\u00fcsteemid ei ole pelgalt vahem\u00e4lu s\u00fcsteemid. Neil on veel palju funktsioone, sealhulgas \u2014 kui mitte andmed edastatakse kliendile t\u00f6\u00f6tlemiseks, vaid vastupidi: kood, mis tuleb andmetega t\u00e4ita, liigub serverisse, seal t\u00e4idetakse ja tulemus tagastatakse. Ja kui eraldi vahem\u00e4lu s\u00fcsteemina ei vaadata neid liiga sageli.<\/p>\n<p>H\u00e4sti, ei anna alla, leidke s\u00fcsteemide otse v\u00f5rrelda. V\u00f5tame kaks \u00fclej\u00e4\u00e4nud varianti \u2014 Redis ja Hazelcast. Meid huvitab kiirus, selle parameetri j\u00e4rgi me neid ka v\u00f5rdleme.<\/p>\n<h3>Hz vs Redis<\/h3>\n<p>\nLeidke selline <noindex><a rel=\"nofollow\" href=\"https:\/\/hazelcast.com\/resources\/benchmark-redis-3-2-8-vs-hazelcast-3-8\/\">v\u00f5rdlus<\/a><\/noindex>:<br \/>\n<img decoding=\"async\" alt=\"Kuidas me Sportmasteris valisime vahem\u00e4lus\u00fcsteemi. Osa 1\" src=\"\/wp-content\/uploads\/2020\/03\/c59ff32b3b61f68f0c3917c1de2aaa8f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nSinine \u2014 see on Redis, punane \u2014 Hazelcast. Hazelcast v\u00f5idab igal pool, ja sellele on p\u00f5hjendus: see on mitmerealine, k\u00f5rgelt optimeeritud, iga l\u00f5ime t\u00f6\u00f6tab oma partitsiooniga, seega pole lukustusi. Redis on aga \u00fcherealine, seega ei saa ta kasu kaasaegsetest mitme s\u00fcdamikuga CPU-dest. Hazelcast kasutab as\u00fcnkroonset I\/O, Redis-Jedis aga blokeerivaid socket\u2019e. L\u00f5ppkokkuv\u00f5ttes kasutab Hazelcast binaarprotokolli, Redis on suunatud tekstile, mis t\u00e4hendab, et see on ebaefektiivne.<\/p>\n<p>Igaks juhuks vaatame veel \u00fchte v\u00f5rdlusallikat. Mida see meile n\u00e4itab?<\/p>\n<h3>Redis vs Hz<\/h3>\n<p>\nVeel \u00fcks <noindex><a rel=\"nofollow\" href=\"https:\/\/redislabs.com\/blog\/benchmarking-redis-enterprise-5-2-0-vs-hazelcast-3-9\/\">v\u00f5rdlus<\/a><\/noindex>:<br \/>\n<img decoding=\"async\" alt=\"Kuidas me Sportmasteris valisime vahem\u00e4lus\u00fcsteemi. Osa 1\" src=\"\/wp-content\/uploads\/2020\/03\/61e466d367dd6f9d52c1d7c6443d1713.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nSiin on vastupidi, punane \u2014 see on Redis. See t\u00e4hendab, et Redis on j\u00f5udluses \u00fcle Hazelcasti. Esimeses v\u00f5rdluses v\u00f5itis Hazelcast, teises \u2014 Redis. <noindex><a rel=\"nofollow\" href=\"https:\/\/redislabs.com\/blog\/benchmarking-redis-enterprise-5-2-0-vs-hazelcast-3-9\/\">Siin on<\/a><\/noindex> v\u00e4ga t\u00e4pselt selgitatud, miks eelnevas v\u00f5rdluses v\u00f5itis Hazelcast.<\/p>\n<p>Selgub, et esimese tulemusi oli tegelikult manipuleeritud: Redis viidi sisse baasversioonis, samas kui Hazelcast kohandati testijuhtumi jaoks. Seega, k\u00f5igepealt: kellelegi ei saa usaldada, teiseks, kui me l\u00f5puks valime s\u00fcsteemi, peame seda veel \u00f5igesti seadistama. Need seadistused h\u00f5lmavad k\u00fcmneid, peaaegu sadu parameetreid.<\/p>\n<h2>Raputame pudelit<\/h2>\n<p>\nJa kogu protsessi, mille me praegu l\u00e4bi r\u00e4\u00e4kisime, saan ma seletada sellise metafooriga nagu 'K\u00f5igutame pudelit'. See t\u00e4hendab, et hetkel ei pea programmeerima, hetkel on peamine osata lugeda Stack Overflow'd. Ja mul on meeskonnas inimene, professionaal, kes just niimoodi t\u00f6\u00f6tab kriitilistel hetkedel.<\/p>\n<p>Mida see teeb? Ta n\u00e4eb, et seade ei t\u00f6\u00f6ta, n\u00e4eb virhebaasi, v\u00f5tab sealt m\u00f5ned s\u00f5nad (millised t\u00e4pselt \u2014 see on tema ekspertteadmised programmist), otsib Google'ist, leiab Stack Overflow vastuste hulgast. Lugemata ja s\u00fcvenemata, valib ta vastustest midagi, mis sobib k\u00f5ige rohkem ettepanekuga \u201eteha seda ja toda\u201c (selle vastuse valimine on tema anne, sest see pole alati see vastus, mis on saanud k\u00f5ige rohkem meeldimisi), rakendab seda, vaatab: kui midagi on muutunud, siis on suurep\u00e4rane. Kui mitte \u2014 tagasi rullime. Ja kordame k\u00e4ivitamista ja kontrollimist ning otsimist. Nii intuitiivselt saavutab ta, et mingi aja p\u00e4rast kood t\u00f6\u00f6tab. Ta ei tea, miks, ta ei tea, mida ta tegi, ta ei saa selgitada. Aga! See asi t\u00f6\u00f6tab. Ja \u201etuli on kustutatud\u201c. N\u00fc\u00fcd hakkame aru saama, mida me tegime. Kui programm t\u00f6\u00f6tab \u2014 on see kordades lihtsam. Ja see s\u00e4\u00e4stab m\u00e4rkimisv\u00e4\u00e4rselt aega.<\/p>\n<p>Seda meetodit saab v\u00e4ga h\u00e4sti illustreerida j\u00e4rgmise n\u00e4itega.<\/p>\n<p>Kord oli v\u00e4ga populaarne koguda purjekat pudelisse. Purjekas on suur ja habras, aga pudeli suu on v\u00e4ga kitsas, sealt sisse p\u00e4\u00e4seda ei saa. Kuidas seda kokku panna?<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas me Sportmasteris valisime vahem\u00e4lus\u00fcsteemi. Osa 1\" src=\"\/wp-content\/uploads\/2020\/03\/6c69e04080f1f0da81abf7a6a80510f2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nOn selline meetod, v\u00e4ga kiire ja v\u00e4ga t\u00f5hus.<\/p>\n<p>Laev koosneb paljusid pisiasju: pulgad, n\u00f6\u00f6rid, purjed, liim. K\u00f5ik need paneme pudelisse.<br \/>\nV\u00f5tame pudeli kahe k\u00e4ega ja hakkame raputama. Raputame-raputame. Ja tavaliselt \u2013 tulemuseks on t\u00e4ielik jama, muidugi. Aga m\u00f5nikord. M\u00f5nikord tuleb laev! T\u00e4psemalt, midagi, mis meenutab laeva.<\/p>\n<p>Me n\u00e4itame seda kuskile: \u00abSerjega, n\u00e4ed!?\u00bb. Ja t\u00f5esti, kaugelt \u2013 n\u00e4eb v\u00e4lja nagu laev. Aga edasi seda lasta ei saa.<\/p>\n<p>On veel \u00fcks meetod. Kasutavad sellised edasij\u00f5udnud t\u00fc\u00fcbid, sellised h\u00e4kkerid.<\/p>\n<p>Andsin sellisele poisile \u00fclesande, ta tegi k\u00f5ik \u00e4ra ja l\u00e4ks minema. Ja vaatad \u2013 nagu oleks tehtud. Aga m\u00f5ne aja p\u00e4rast, kui tuleb koodi t\u00e4iendada \u2014 hakkab seal kohe midagi juhtuma... Hea, et ta on juba kaugele jooksnud. Sellised on need t\u00fc\u00fcbid, kes teevad pudeli n\u00e4itel nii: n\u00e4ete, seal, kus p\u00f5hi \u2013 klaas k\u00f5verdub. Ja ei ole p\u00e4ris selge, kas see on l\u00e4bipaistev v\u00f5i mitte. Siis \u00abh\u00e4kkerid\u00bb l\u00f5ikavad selle p\u00f5hjaga, panevad sinna laeva sisse, p\u00f5hja liimivad p\u00e4rast uuesti kinni ja nagu oleks nii olnudki.<\/p>\n<p>\u00dclesande m\u00e4\u00e4ratlemise seisukohalt n\u00e4ib k\u00f5ik \u00f5ige. Aga v\u00f5tame n\u00e4ite laevad: miks \u00fcldse selline laev teha, kellele see vajalik on? Tal pole mingit funktsionaalsust. Tavaliselt on sellised laevad v\u00e4ga k\u00f5rgete ametnike kingitused, kes panevad selle endale riiulile nagu s\u00fcmboli, m\u00e4rk. Kui sellise inimese, nagu suure ettev\u00f5tte juhi v\u00f5i k\u00f5rge ametniku, lipuna seisab midagi nii halba, mille kaela on l\u00f5igatud? K\u00fcll oleks parem, kui ta sellest kunagi ei angle. Nii et kuidas neid laevu siiski tehakse, et need saaks annetada olulisele inimesele?<\/p>\n<p>Ainult \u00fcks koht, millega t\u00f5eliselt midagi teha ei saa, on korpus. Ja laeva korpus l\u00e4bib just pudeli kaela. Samal ajal kui laev koostatakse pudelist v\u00e4ljaspool. Kuid laeva kokkupanemine ei ole lihtsalt asi, see on t\u00f5eline juveliiri k\u00e4sit\u00f6\u00f6. Koosseisu lisatakse spetsiaalsed k\u00e4epidemed, mis v\u00f5imaldavad neid hiljem \u00fcles t\u00f5sta. N\u00e4iteks pannakse purjed kokku, kantakse ettevaatlikult sisse ja seej\u00e4rel t\u00f5mmatakse neid pintsettide abil v\u00e4ga peenelt, t\u00e4pselt \u00fcles. Tulemuseks on kunstiteos, mille v\u00f5ib puhta s\u00fcdamega ja uhkusega kingituseks anda.<\/p>\n<p>Ja kui soovime, et projekt oleks edukas, peaks meeskonnas olema v\u00e4hemalt \u00fcks kunstnik. Keegi, kes hoolib toote kvaliteedist ja arvestab k\u00f5iki aspekte, mitte ei ohverda \u00fchtki isegi pingelistes olukordades, kui asjaolud n\u00f5uavad kiiret, kuid t\u00e4htsa arvelt. K\u00f5ik edukad projektid, mis on j\u00e4tkusuutlikud ja ajaproovile vastu pidanud, on ehitatud selle p\u00f5him\u00f5tte peale. Neis on midagi v\u00e4ga t\u00e4pset ja ainulaadset, midagi, mis kasutab k\u00f5iki v\u00f5imalikke ressursse. Laevatootmise n\u00e4ites pudelis m\u00e4ngitakse sellega, et laeva korpus tuleb l\u00e4bi kaela.<\/p>\n<p>Tagasi tulles meie vahem\u00e4luserveri valiku \u00fclesande juurde, kuidas saaks seda meetodit rakendada? Ma pakun sellist varianti k\u00f5igi s\u00fcsteemide hulgast \u2014 mitte pudelit raputada ja mitte valida, vaid vaadata, mis neil \u00fcldiselt on, millele t\u00e4helepanu p\u00f6\u00f6rata s\u00fcsteemi valimisel.<\/p>\n<h2>Kus otsida pudeli kaela?<\/h2>\n<p>\nProovime mitte pudelit raputada ega k\u00f5ike \u00fckshaaval \u00fcle vaadata, vaid vaatame, millised \u00fclesanded tekivad, kui \u00fcritame disainida sellise s\u00fcsteemi ise. Me ei hakka jalgratast leiutama, kuid kasutame seda skeemi, et suunata, millele toote kirjeldustes t\u00e4helepanu p\u00f6\u00f6rata. Joonistame sellise skeemi.<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas me Sportmasteris valisime vahem\u00e4lus\u00fcsteemi. Osa 1\" src=\"\/wp-content\/uploads\/2020\/03\/f2c36d07383d778e60b2f800749012ca.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nKui s\u00fcsteem on jaotatud, siis on meil mitu serverit (6). Oletame, et neid on neli (mis on pildil mugavalt paigutatavad, kuid neid v\u00f5ib olla ka rohkem). Kui serverid asuvad erinevates s\u00f5lmedes, siis t\u00f6\u00f6tab k\u00f5igil mingisugune kood, mis vastutab selle eest, et need s\u00f5lmed moodustaksid klastri ja vajadusel \u00fchenduksid ning \u00fcksteist tunneksid.<\/p>\n<p>Vaja on ka koodiloogikat (2), mis tegelikult tegeleb vahem\u00e4ljega. Selle koodiga suhtlevad kliendid teatud API kaudu. Kliendi kood (1) v\u00f5ib olla nii selle sama JVM-i raames, kui ka suhelda sellega v\u00f5rgus. Siseselt rakendatud loogika t\u00e4hendab, milliseid objekte vahemikus hoida ja milliseid v\u00e4lja visata. Vahem\u00e4lu hoidmiseks kasutame m\u00e4lu (3), kuid vajadusel saame osa andmeid ka kettale salvestada (4).<\/p>\n<p>Vaadakem, millistes osades koormus tekkib. Tegelikult koormatakse iga nool ja iga s\u00f5lm. Esiteks, kui see on v\u00f5rgu\u00fchendus, siis kliendi koodi ja API vahel v\u00f5ib n\u00e4htav j\u00f5udluse langus olla m\u00e4rgatav. Teiseks, API enda raames \u2014 kui loogika l\u00e4heb liiga keeruliseks, v\u00f5ime j\u00f5uda CPU piiri. Ja oleks hea, kui loogika ei ajaks m\u00e4lu alusetult ringi. J\u00e4\u00e4b veel suhtlemine failis\u00fcsteemiga \u2013 tavalises variandis on see serialiseerimine\/kordus ja kirjutamine\/lugemine.<\/p>\n<p>Edasi liikudes on suhtlemine klastri poole. T\u00f5en\u00e4oliselt on see sama s\u00fcsteemis, kuid v\u00f5ib olla ka eraldi. Siin tuleb samuti arvesse v\u00f5tta andmete edastamist, andmete serialiseerimise kiirus ja suhtlemine klastri vahel.<\/p>\n<p>N\u00fc\u00fcd, \u00fchest k\u00fcljest \u2013 saame kujutada, \"millised hammasrattaid p\u00f6\u00f6ratakse\" vahem\u00e4lu s\u00fcsteemis meie koodi p\u00e4ringute t\u00f6\u00f6tlemisel, ja teisest k\u00fcljest \u2013 saame hinnata, kui palju ja milliseid p\u00e4ringuid meie kood sellele s\u00fcsteemile genereerib. Seda on piisavalt, et teha enam-v\u00e4hem ratsionaalne valik \u2013 leida s\u00fcsteem meie kasutusvariandi jaoks.<\/p>\n<p><b>Hazelcast<\/b><\/p>\n<p>Vaadake, kuidas seda jaotust meie loendile rakendada. N\u00e4iteks, Hazelcast.<\/p>\n<p>Andmete paigutamiseks\/saamiseks Hazelcastis p\u00f6\u00f6rdub klientkood (1) api poole. Hz v\u00f5imaldab serveri k\u00e4ivitada embedded-re\u017eiimis, ja sel juhul on p\u00f6\u00f6rdumine api - meetodi v\u00e4ljakutse JVM-s, mida v\u00f5ib pidada tasuta.<\/p>\n<p>Et loogika (2) toimiks, toetub Hz serialiseeritud v\u00f5tme baitmassivale hash'ile - see t\u00e4hendab, et v\u00f5tme serialiseerimine toimub igal juhul. See on Hz jaoks v\u00e4ltimatu overhead.<br \/>\nEviction-strateegiad on h\u00e4sti ellu viidud, kuid erijuhtudel on v\u00f5imalik lisada oma. Selle p\u00e4rast muretsemine pole vajalik.<\/p>\n<p>Salvestusruumi (4) saab \u00fchendada. Suurep\u00e4rane. Interaktsioon (5) embedded-re\u017eiimis v\u00f5ib pidada koheseks. Andmevahetus s\u00f5lmede vahel klastris (6) - jah, see on olemas. See on panus k\u00f5lblikkuse ja t\u00f6\u00f6kindluse nimel kiirusel. Hz-funktsioon Near-cache aitab v\u00e4hendada kulusid - teistelt klastris\u00f5lmedelt saadud andmed salvestatakse vahem\u00e4llu.<\/p>\n<p>Mida sellistes tingimustes kiiruset\u00f5stmiseks teha?<\/p>\n<p>N\u00e4iteks, et v\u00e4ltida v\u00f5tme serialiseerimist (2) - Hazelcasti peale lisada veel \u00fcks vahem\u00e4lu k\u00f5ige kuumemate andmete jaoks. Sportmasteris valiti selle eesm\u00e4rgi saavutamiseks Caffeine.<\/p>\n<p>Selleks, et kohandada tasemel (6) Hz-is, pakutakse kahte t\u00fc\u00fcpi salvestamist: IMap ja ReplicatedMap.<br \/>\n<img decoding=\"async\" alt=\"Kuidas me Sportmasteris valisime vahem\u00e4lus\u00fcsteemi. Osa 1\" src=\"\/wp-content\/uploads\/2020\/03\/ce752c9a0f46609add8de8644a7ad17f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nOluline on r\u00e4\u00e4kida, kuidas Hazelcast sattus Sportmasteri tehnoloogiastakisse.<\/p>\n<p>2012. aastal, kui t\u00f6\u00f6tasime tulevase veebisaidi esimese protot\u00fc\u00fcbi kallal, oli Hazelcast esimene link, mille otsingumootor v\u00e4ljastas. Meie tutvumine algas \"esimesest korrast\" \u2014 see, et ta t\u00f6\u00f6tas vaid kahe tunni p\u00e4rast, kui olime Hz-s\u00fcsteemi integreerinud, oli meie jaoks suur \u00fcllatus. Ja see t\u00f6\u00f6tas h\u00e4sti. P\u00e4eva l\u00f5puks olime kirjutanud mitu testi ja olime rahul. Seda energiat j\u00e4tkus, et \u00fcletada aega jooksul ilmunud \u00fcllatused, mida Hz esitas. N\u00fc\u00fcd ei ole Sportmasteri meeskonnal mingit p\u00f5hjust Hazelcastist loobuda.<\/p>\n<p>Kuid argumendid nagu \"esimene link otsingumootoris\" ja \"kiire HelloWorldi kogumine\" on muidugi erand ja hetkede erip\u00e4ra, milles valik toimus. T\u00f5elised katsumused valitud s\u00fcsteemi jaoks algavad, kui see j\u00f5uab tootmisesse, ja just sellele etapile tasub t\u00e4helepanu p\u00f6\u00f6rata, valides mistahes s\u00fcsteemi, sealhulgas vahem\u00e4lu. Tegelikult v\u00f5ib \u00f6elda, et valisime Hazelcasti juhuslikult, kuid hiljem selgus, et tegime \u00f5igesti.<\/p>\n<p>Tootmise erilise t\u00e4helepanuta: j\u00e4lgimine, t\u00f5rgete t\u00f6\u00f6tlemine \u00fcksikutes s\u00f5lmedes, andmete replikatsioon ja skaleerimise kulud. Teisis\u00f5nu, tasub t\u00e4helepanu p\u00f6\u00f6rata probleemidele, mis tekivad just s\u00fcsteemi hooldamisel \u2014 kui koormus \u00fcletab korduvalt plaanitud taset, kui laadime kogemata sisse vale sisu ja vale koht, v\u00f5i kui on vaja v\u00e4ljendada uut koodiversiooni, andmeid vahetada ja teha seda klientidele m\u00e4rkamatuks.<\/p>\n<p>K\u00f5ikide nende n\u00f5uete jaoks sobib Hazelcast kindlasti.<\/p>\n<h2>J\u00e4tkub<\/h2>\n<p>\nKuid Hazelcast ei ole imerohi. 2017. aastal valisime Hazelcasti administraatori vaates m\u00e4lupuhvriks, tuginedes lihtsalt varasema hea kogemuse muljele. See m\u00e4ngis olulist rolli v\u00e4ga kurva nalja t\u00f5ttu, mis viis meid keerulisse olukorda, millest v\u00e4ljumine kestis \u201ekangelaslikult\u201c 60 p\u00e4eva. Kuid sellest r\u00e4\u00e4gime j\u00e4rgmises osas.<\/p>\n<p>Aga seni\u2026 Head uut koodi!<br \/>\n<br \/>Allikas: <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 4.9.10 - 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. \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\" \/>\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\/et\/blog\/administrirovanie\/kak-my-v-sportmastere-vybirali-sistemu-keshirovaniya-chast-1\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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. \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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/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\udd47Kuidas me Sportmasteris vahem\u00e4lu s\u00fcsteemi valisime. Osa 1 | ProHoster","description":"Tere! Minu nimi on Alexei Pjankov, olen arendaja ettev\u00f5ttes Sportmaster. Selles postituses r\u00e4\u00e4gin, kuidas Sportmasteri veebisaidi arendamine 2012. aastal algas, milliseid algatusi \u00f5nnestus \"edendada\" ja millised takistused me kogesime. T\u00e4na tahan jagada m\u00f5tteid, mis j\u00e4rgivad uut teemat \u2013 Java tagaplaneeringu vahem\u00e4lu s\u00fcsteemi valimine saidi administratiivpaneelis. See teema","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-my-v-sportmastere-vybirali-sistemu-keshirovaniya-chast-1","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","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. \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","og:url":"https:\/\/prohoster.info\/et\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/73949","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=73949"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/73949\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/73950"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=73949"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=73949"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=73949"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}