Tere! Minu nimi on Aleksei Pjankov, ma olen arendaja ettevÔttes Sportmaster. Selles rÀÀgin, kuidas Sportmasteri veebisaidi tegemine 2012. aastal algas, milliseid algatusi Ônnestus "lÀbi viia" ja vastupidi, milliseid tÔkkeid me kogusime.
TĂ€na tahan jagada mĂ”tteid, mis jĂ€rgivad teist teemat â Java tagaplaneerimise vahemĂ€lu sĂŒsteemi valimine saidi administreerimiseks. See teema on minu jaoks eriti oluline â kuigi lugu kestis vaid 2 kuud, töötasime nendel 60 pĂ€eval 12-16 tundi ja ei saanud ĂŒhtki vaba pĂ€eva. Paar korda ei olnud ma kunagi varem mĂ”elnud ega kujutlenud, et saab nii palju tööd teha.
SeetĂ”ttu jagan teksti kaheks osaks, et mitte liiga koormata. Vastupidi, esimene osa saab olema vĂ€ga kerge â ettevalmistus, sissejuhatus, mĂ”ned mĂ”tted, mis on vahemĂ€lu. Kui olete juba kogenud arendaja vĂ”i töötanud vahemĂ€ludega â tehniliselt ei pakkuda see artikkel tĂ”enĂ€oliselt midagi uut. Siiski, vĂ€ikese ĂŒlevaate alla algajale vĂ”ib see anda suuniseid, kuhu pöörduda, kui ta satub sellele teele.
Kui Sportmasteri uue veebiversiooni tootmise kĂ€ivitamine toimus, toimusid andmete edastamine, ĂŒtleme 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ĂŒsteemidest. Et uus pilt vĂ”i tootekirjeldus veebis ilmuks, tuli oodata jĂ€rgmise pĂ€evani â uuendamine toimus ainult öösel, ĂŒks kord ööpĂ€evas.
Alguses oli esimesel nĂ€dalal pĂ€rast tootmisse minekut nii palju muresid, et sisu haldajate ebamugavused tundusid tĂŒhised. Kuid niipea, kui kĂ”ik rahunes, jĂ€tkus projekti areng â 2015. aasta alguses, pĂ€rast mitmeid kuud, hakkasime aktiivselt arendama administraatori paneeli. Aastal 2015 ja 2016 lĂ€ks kĂ”ik hĂ€sti, me teostasime regulaarselt versioone, administraatori paneel hĂ”lmas ĂŒha suuremat osa andmete ettevalmistamisest ja valmistusime selleks, et peagi usaldatakse meie meeskonnale kĂ”ige tĂ€htsam ja keerulisem â toote kontuur (tĂ€ielik andmete ettevalmistamine ja haldamine kĂ”igi toodete osas). Kuid suvel 2017, just enne toote kontuuri kĂ€ivitamist, sattus projekt vĂ€ga keerulisse olukorda â just seoses probleemidega vahemĂ€luga. Sellest episoodist ma tahangi rÀÀkida selle kaheosalisest publikatsioonist teises osas.
Kuid selles postituses alustan kaugelt, kogudes teatud mĂ”tteid â ettekujutusi vahemĂ€lust, mille ĂŒle oleks olnud hea enne suurt projekti eelnevalt mĂ”elda.
Kui tekib vahemĂ€luga seotud ĂŒlesanne
Cache'i ĂŒlesanne ei teki lihtsalt nii. Me oleme arendajad, kirjutame tarkvaratoote ja tahame, et see oleks nĂ”utud. Kui toode on nĂ”utud ja edukas â kasutajad tulevad. Ja nad tulevad taas ja taas. Ning lĂ”puks on kasutajaid vĂ€ga palju, ja siis muutub toode suure koormuse all olevaks.
Esimestel etappidel ei mĂ”tle me koodi optimeerimisele ja tootlikkusele. Peamine on funktsionaalsus, kiiresti piloot vĂ€lja viia ja hĂŒpoteese testida. Ja kui koormus kasvab â me uuendame riistvara. Suurendame selle mahutavust kaks, kolm, viis vĂ”i isegi kĂŒmme korda. Siin vĂ”ib rahandus rohkem ei lubada. Ja kui palju kasutajate arv kasvab? See ei ole 2-5-10, vaid edusammude korral â see vĂ”ib ulatuda 100-1000 ja kuni 100 000 korda. Seega, varem vĂ”i hiljem tuleb optimeerimisega tegelema hakata.
Kujutame ette, et mingi koodi osa (nimetame seda funktsiooniks) töötab ebamugavalt kaua ja me tahame tĂ€itmisaja vĂ€hendada. Funktsioon vĂ”ib olla nĂ€iteks juurdepÀÀs andmebaasile vĂ”i mĂ”ne keeruka loogika tĂ€itmine â peamine on see, et see kestab kaua. Kuidas saaksime tĂ€itmisaja nulli viia? Teoreetiliselt on vĂ”imalus vĂ€hendada selle aega kuni nullini, ei kaugemale. Kuidas aga viia tĂ€itmise aeg nulli? Vastus: ĂŒldse mitte tĂ€ita. Selle asemel â tagastada kohe tulemus. Kuidas aga tulemus teada saada? Vastus: kas arvutada see vĂ€lja vĂ”i vaadata kuskilt. VĂ€lja arvutamine â see on pikk protsess. Aga vaatamine â see tĂ€hendab nĂ€iteks meeles pidada tulemust, mille funktsioon eelmisel korral andis, kui seda sama koosseisu parametritega kutsuti.
See, rakenduse funktsioon ei ole meile oluline. Piisab ainult teada, millistest parameetritest tulemus sĂ”ltub. Kui aga esitada parameetrite vÀÀrtused objekti kujul, mida saab kasutada vĂ”tmena mingis salvestuses â siis saame arvutamise tulemuse salvestada ja jĂ€rgmiste pĂ€ringute korral seda lugeda. Kui need kirje-lugemise protsessid toimuvad kiiremini kui funktsiooni tĂ€itmine â saavutame kiirusel kasu. Kasu suurus vĂ”ib ulatuda 100, 1000 ja isegi 100 000 korda (10^5 on pigem erand, kuid korralikult laguneva andmebaasi puhul on see tĂ€iesti vĂ”imalik).
Peamised nĂ”uded vahemĂ€llu salvestamise sĂŒsteemile
Esimene, mis vĂ”ib olla nĂ”udmine vahemĂ€llu salvestamise sĂŒsteemile â kiire lugemisekiirus ja veidi vĂ€hem â kirjutamise kiirus. See on tĂ”si, kuid ainult seni, kuni me sĂŒsteemi tootmisse toome.
Loome sellise juhtumi.
Oletame, et me oleme praegu koormuse jaoks riistvara taganud ja nĂŒĂŒd alustame jĂ€rk-jĂ€rgult vahemĂ€lu kasutuselevĂ”ttu. Kasutajate arv kasvab jĂ€rk-jĂ€rgult, koormus suureneb â lisame veidi vahemĂ€lusid, ĂŒhendame neid siin-seal. Nii jĂ€tkub see mĂ”nda aega, ja nĂŒĂŒd kutsutakse juba raske funktsioonide tĂ€itmine tĂ€pselt harva â kogu peamine koormus lasub vahemĂ€lu. Selle aja jooksul on kasutajate arv kasvanud N korda.
Ja kui algne riistvara varu vĂ”is olla 2-5 korda, siis vahemĂ€lu abil saime tĂ”sta jĂ”udlust isegi 10 korda vĂ”i, heas olukorras, 100 korda, kohati isegi 1000 korda. See tĂ€hendab, et samas riistvara peal â töötleme 100 korda rohkem pĂ€ringuid. SuurepĂ€rane, oleme prÀÀniku Ă€ra teeninud!
Aga nĂŒĂŒd, ĂŒhel kenal hetkel, juhtus sĂŒsteemis viga ja vahemĂ€lu kukkus kokku. Miski erilist â oleneb ju sellest, et vahemĂ€lu valiti nĂ”udmisel "kĂ”rge lugemise ja kirjutamise kiirus, muu pole oluline."
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Ă”ik töötas sujuvalt. Aga nĂŒĂŒd, ilma vahefilterita â kui palju meie sĂŒsteem kannatab? Mis meiega juhtub? SĂŒsteem kukub kokku.
Isegi kui meie vahefilter ei ole kokku kukkunud, vaid lihtsalt puhastatud mĂ”neks ajaks â tuleb seda uuesti soojendada, ja see vĂ”tab aega. Selle aja jooksul kukub peamine koormus funktsionaalsusele.
KokkuvĂ”te: kĂ”rge koormusega projektid tootmisprotsessis nĂ”uavad sĂŒsteemilt vahefilterit mitte ainult kiire lugemise ja kirjutamise osas, vaid ka andmete sĂ€ilitamise ja tĂ”rgete suhtes vastupidavust.
Valikute vaev
Adminpaneeli projektis kujunes valik selliseks: esmalt paigaldasime Hazelcasti, kuna olime selle tootega juba pĂ”hisaidi kogemuse kaudu tuttavad. Kuid siin osutus selline valik ebaĂ”nnestunuks â meie koormuse profiili puhul töötab Hazelcast mitte lihtsalt aeglaselt, vaid ÀÀrmiselt aeglaselt. Ja tootmisprotsessi tĂ€htaegade osas olime tol hetkel juba allkirjastanud.
Spoiler: how exactly the circumstances unfolded that led us to miss such a blunder and ended up in a tense situation â I will explain in the second part â how we got there and how we got out. But for now, I'll just say that it was a significant stress, and 'thinking â somehow, does not come to mind, we shake the bottle.' 'Shake the bottle' is also a spoiler, more on that later.
What we did:
- We compile a list of all systems suggested by Google and StackOverflow. A little more than 30.
- We write load tests typical for production. For this, we recorded data that passes through the system in the production environment â a kind of sniffer for data not on the network but within the system. We ran exactly these data in the tests.
- 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 â we discard it and move on to the next one in line.
- By the 17th system, it became clear that all was hopeless. Enough with 'shaking the bottle', it was time to think seriously.
See on valik, kus tuleb valida sĂŒsteem, mis "mahtus kiiruskatsetest" lĂ€bi. Aga kui selliseid katseid veel pole ja on soov valida kiiremat?
Simuleerime sellist varianti (raske on ette kujutada, et arendaja, kelle oskused on keskmised ja kĂ”rgemad, elab vaakumis, ning valiku hetkel pole ta veel otsustanud, millist toodet esimesena proovida â seega, edasised arutlused on pigem teoreetilised/filosoofilised/juniortaseme suhtes).
Kui oleme nĂ”uded selgeks teinud, alustame lahenduse valimist vĂ€lja pakutud variandi hulgast. Miks peaks jalgratast leiutama: me vĂ”tame valmis vahemĂ€lu sĂŒsteemi.
Kui alles alustate ja hakkate guugeldama, siis jĂ€rjekord on pluss-miinus sama, kuid ĂŒldiselt on suunised sellised. Esiteks satute kindlasti Redis'esse, see on kĂ”ikjal tuntud. Siis saate teada, et on olemas EhCache, mis on vanim ja usaldusvÀÀrne sĂŒsteem. Edasi kirjutatakse Tarantoolist â kodumaine arendus, milles on ainulaadne lahenduse aspekt. Ja samuti Ignite, kuna see on praegu populaarsuse tĂ”usuteel ja naudib SberTechi toetust. LĂ”puks veel Hazelcast, kuna ettevĂ”tte maailmas on see sageli suurte ettevĂ”tete seas silma jÀÀnud.
See on vaid vĂ€ike valik, sĂŒsteeme on kĂŒmneid. Meie valime neist vaid ĂŒhe. Vaatame viit valitud sĂŒsteemi "ilu konkurssile" ja teeme valiku. Kes on vĂ”itja?
Redis
Loe, mida ametlikul veebilehel kirjutatakse.
â avatud lĂ€htekoodiga projekt. Pakub andmete salvestamist mĂ€lu (in-memory) ja vĂ”imalust salvestada kettale (on-disk), automaatset osade moodustamist, kĂ”rget kĂ€ttesaadavust ning taastumist vĂ”rgukatkestuste korral.
Tundub, et kĂ”ik on suurepĂ€rane, saab vĂ”tta ja kasutama hakata â kĂ”ik, mis vajalik, see töötab. Kuid vaatame lihtsalt huvi pĂ€rast ka teisi kandidaate.
EhCache
â "kĂ”ige laialdasemalt kasutatav Java vahemĂ€lu" (tĂ”lge ametlikult veebilehelt). Ka avatud lĂ€htekoodiga. 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ĂŒsteem lubab? UsaldusvÀÀrsus, testitud tootmine, tĂ€ielik funktsionaalsus. Ja on ka kĂ”ige levinum. Salvestab terabaitide ulatuses andmeid.
Redis on unustanud, olen valmis valima EhCache.
Aga patriootlik tunne ajendab mind vaatama, millega on hea Tarantool.
Tarantool
â tutvustatakse kui âReaalaja andmete integreerimise platvormâ. See kĂ”lab keeruliselt, seega vaatame lehte pĂ”hjalikult ja leidke vĂ€ide: âCacheâib 100% andmeid mĂ€lu seesâ. See peaks tekitama kĂŒsimusi â kuna andmeid vĂ”ib olla mĂ€rkimisvÀÀrselt rohkem kui mĂ€lu. Selgitus on selles, et andmete kirjutamisel ketta peale ei kasuta Tarantool serialiseerimist. Selle asemel kasutatakse madala taseme sĂŒsteemi omadusi, kui mĂ€lu kaardistatakse failisĂŒsteemile vĂ€ga hea I/O jĂ”udlusega. KokkuvĂ”ttes tehti see kuidagi suurepĂ€raselt ja Ă€gedalt.
Vaadakem rakendusi: Mail.ru ettevĂ”tte peamine kanal, Avito, Beeline, Megafon, Alfa-Bank, GazpromâŠ
Kui mul jÀi veel kahtlusi Tarantooli osas, siis Mastercardi rakenduse juhtum veenab mind tÀielikult. Valin Tarantooli.
Aga siiskiâŠ
Ignite
⊠on veel , mis on deklareeritud kui âin-memory arvutusplatvorm⊠in-memory kiirus petabaidandmete osasâ. Siin on ka palju eeliseid: jagatud in-memory vahemĂ€lu, kĂ”ige kiirem key-value salvestus ja vahemĂ€lu, horisontaalne skaleeritavus, kĂ”rge kĂ€ttesaadavus, range terviklikkus. KokkuvĂ”ttes tundub, et kĂ”ige kiirem on Ignite.
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Àiustama. See on tÀiesti veenev ja ma olen valmis Ignite'i vÔtma.
TĂ€iesti arusaamatu, miks ma vaatan viiendat punkti.
Hazelcast
Sisenen veebisaidile , loen. Ja selgub, et kiireim lahendus jagatud vahemĂ€lu jaoks on Hazelcast. See on kordades kiirem kui kĂ”ik muud lahendused ja ta on ĂŒldiselt liider in-memory andmevĂ”rgus. TĂ€nu sellele oleks midagi muud vĂ”tta nagu enda mitte austamine. Ja ta kasutab ka ĂŒleliigset andmete hoidmist klastrite pidevaks tööks ilma andmekadudeta.
KÔik, olen valmis Hazelcast'i vÔtma.
VÔrdlus
Kuid kui vaadata, siis on kĂ”ik viis kandidaati nii esitatud, et igaĂŒhe seas on kĂ”ige parem. Kuidas valida? VĂ”ime vaadata, milline neist on kĂ”ige populaarsem, otsida vĂ”rdlusi ja peavalu kaob.
Leidke selline , valime meie 5 sĂŒsteemi.

Siin on nad sorteeritud: ees Redis, teisel kohal â Hazelcast, populaarsust koguvad Tarantool ja Ignite, EhCache jÀÀb endiselt samaks.
Kuid vaatame : lingid veebisaitidele, ĂŒldine huvi sĂŒsteemi vastu, tööpakkumised â suurepĂ€rane! See tĂ€hendab, et kui minu sĂŒsteem kukub, ĂŒtlen: 'Ei, see on ju usaldusvÀÀrne! Siin on palju tööpakkumisi...'. Niisugune lihtne vĂ”rdlus ei sobi.
KĂ”ik need sĂŒsteemid ei ole pelgalt vahemĂ€lu sĂŒsteemid. Neil on veel palju funktsioone, sealhulgas â kui mitte andmed edastatakse kliendile töötlemiseks, vaid vastupidi: kood, mis tuleb andmetega tĂ€ita, liigub serverisse, seal tĂ€idetakse ja tulemus tagastatakse. Ja kui eraldi vahemĂ€lu sĂŒsteemina ei vaadata neid liiga sageli.
HĂ€sti, ei anna alla, leidke sĂŒsteemide otse vĂ”rrelda. VĂ”tame kaks ĂŒlejÀÀnud varianti â Redis ja Hazelcast. Meid huvitab kiirus, selle parameetri jĂ€rgi me neid ka vĂ”rdleme.
Hz vs Redis
Leidke selline :

Sinine â see on Redis, punane â Hazelcast. Hazelcast vĂ”idab igal pool, ja sellele on pĂ”hjendus: see on mitmerealine, kĂ”rgelt optimeeritud, iga lĂ”ime töötab oma partitsiooniga, seega pole lukustusi. Redis on aga ĂŒherealine, seega ei saa ta kasu kaasaegsetest mitme sĂŒdamikuga CPU-dest. Hazelcast kasutab asĂŒnkroonset I/O, Redis-Jedis aga blokeerivaid socketâe. LĂ”ppkokkuvĂ”ttes kasutab Hazelcast binaarprotokolli, Redis on suunatud tekstile, mis tĂ€hendab, et see on ebaefektiivne.
Igaks juhuks vaatame veel ĂŒhte vĂ”rdlusallikat. Mida see meile nĂ€itab?
Redis vs Hz
Veel ĂŒks :

Siin on vastupidi, punane â see on Redis. See tĂ€hendab, et Redis on jĂ”udluses ĂŒle Hazelcasti. Esimeses vĂ”rdluses vĂ”itis Hazelcast, teises â Redis. vĂ€ga tĂ€pselt selgitatud, miks eelnevas vĂ”rdluses vĂ”itis Hazelcast.
Selgub, et esimese tulemusi oli tegelikult manipuleeritud: Redis viidi sisse baasversioonis, samas kui Hazelcast kohandati testijuhtumi jaoks. Seega, kĂ”igepealt: kellelegi ei saa usaldada, teiseks, kui me lĂ”puks valime sĂŒsteemi, peame seda veel Ă”igesti seadistama. Need seadistused hĂ”lmavad kĂŒmneid, peaaegu sadu parameetreid.
Raputame pudelit
Ja kogu protsessi, mille me praegu lÀbi rÀÀkisime, saan ma seletada sellise metafooriga nagu 'KÔigutame pudelit'. See tÀhendab, et hetkel ei pea programmeerima, hetkel on peamine osata lugeda Stack Overflow'd. Ja mul on meeskonnas inimene, professionaal, kes just niimoodi töötab kriitilistel hetkedel.
Mida see teeb? Ta nĂ€eb, et seade ei tööta, nĂ€eb virhebaasi, vĂ”tab sealt mĂ”ned sĂ”nad (millised tĂ€pselt â see on tema ekspertteadmised programmist), otsib Google'ist, leiab Stack Overflow vastuste hulgast. Lugemata ja sĂŒvenemata, valib ta vastustest midagi, mis sobib kĂ”ige rohkem ettepanekuga âteha seda ja todaâ (selle vastuse valimine on tema anne, sest see pole alati see vastus, mis on saanud kĂ”ige rohkem meeldimisi), rakendab seda, vaatab: kui midagi on muutunud, siis on suurepĂ€rane. Kui mitte â tagasi rullime. Ja kordame kĂ€ivitamista ja kontrollimist ning otsimist. Nii intuitiivselt saavutab ta, et mingi aja pĂ€rast kood töötab. Ta ei tea, miks, ta ei tea, mida ta tegi, ta ei saa selgitada. Aga! See asi töötab. Ja âtuli on kustutatudâ. NĂŒĂŒd hakkame aru saama, mida me tegime. Kui programm töötab â on see kordades lihtsam. Ja see sÀÀstab mĂ€rkimisvÀÀrselt aega.
Seda meetodit saab vÀga hÀsti illustreerida jÀrgmise nÀitega.
Kord oli vÀga populaarne koguda purjekat pudelisse. Purjekas on suur ja habras, aga pudeli suu on vÀga kitsas, sealt sisse pÀÀseda ei saa. Kuidas seda kokku panna?

On selline meetod, vÀga kiire ja vÀga tÔhus.
Laev koosneb paljusid pisiasju: pulgad, nöörid, purjed, liim. KÔik need paneme pudelisse.
VĂ”tame pudeli kahe kĂ€ega ja hakkame raputama. Raputame-raputame. Ja tavaliselt â tulemuseks on tĂ€ielik jama, muidugi. Aga mĂ”nikord. MĂ”nikord tuleb laev! TĂ€psemalt, midagi, mis meenutab laeva.
Me nĂ€itame seda kuskile: «Serjega, nĂ€ed!?». Ja tĂ”esti, kaugelt â nĂ€eb vĂ€lja nagu laev. Aga edasi seda lasta ei saa.
On veel ĂŒks meetod. Kasutavad sellised edasijĂ”udnud tĂŒĂŒbid, sellised hĂ€kkerid.
Andsin sellisele poisile ĂŒlesande, ta tegi kĂ”ik Ă€ra ja lĂ€ks minema. Ja vaatad â nagu oleks tehtud. Aga mĂ”ne aja pĂ€rast, kui tuleb koodi tĂ€iendada â hakkab seal kohe midagi juhtuma... Hea, et ta on juba kaugele jooksnud. Sellised on need tĂŒĂŒbid, kes teevad pudeli nĂ€itel nii: nĂ€ete, seal, kus pĂ”hi â klaas kĂ”verdub. Ja ei ole pĂ€ris selge, kas see on lĂ€bipaistev vĂ”i mitte. Siis «hĂ€kkerid» lĂ”ikavad selle pĂ”hjaga, panevad sinna laeva sisse, pĂ”hja liimivad pĂ€rast uuesti kinni ja nagu oleks nii olnudki.
Ălesande mÀÀratlemise seisukohalt nĂ€ib kĂ”ik Ă”ige. Aga vĂ”tame nĂ€ite laevad: miks ĂŒldse selline laev teha, kellele see vajalik on? Tal pole mingit funktsionaalsust. Tavaliselt on sellised laevad vĂ€ga kĂ”rgete ametnike kingitused, kes panevad selle endale riiulile nagu sĂŒmboli, mĂ€rk. Kui sellise inimese, nagu suure ettevĂ”tte juhi vĂ”i kĂ”rge ametniku, lipuna seisab midagi nii halba, mille kaela on lĂ”igatud? KĂŒll oleks parem, kui ta sellest kunagi ei angle. Nii et kuidas neid laevu siiski tehakse, et need saaks annetada olulisele inimesele?
Ainult ĂŒks koht, millega tĂ”eliselt midagi teha ei saa, on korpus. Ja laeva korpus lĂ€bib just pudeli kaela. Samal ajal kui laev koostatakse pudelist vĂ€ljaspool. Kuid laeva kokkupanemine ei ole lihtsalt asi, see on tĂ”eline juveliiri kĂ€sitöö. Koosseisu lisatakse spetsiaalsed kĂ€epidemed, mis vĂ”imaldavad neid hiljem ĂŒles tĂ”sta. NĂ€iteks pannakse purjed kokku, kantakse ettevaatlikult sisse ja seejĂ€rel tĂ”mmatakse neid pintsettide abil vĂ€ga peenelt, tĂ€pselt ĂŒles. Tulemuseks on kunstiteos, mille vĂ”ib puhta sĂŒdamega ja uhkusega kingituseks anda.
Ja kui soovime, et projekt oleks edukas, peaks meeskonnas olema vĂ€hemalt ĂŒks kunstnik. Keegi, kes hoolib toote kvaliteedist ja arvestab kĂ”iki aspekte, mitte ei ohverda ĂŒhtki isegi pingelistes olukordades, kui asjaolud nĂ”uavad kiiret, kuid tĂ€htsa arvelt. KĂ”ik edukad projektid, mis on jĂ€tkusuutlikud ja ajaproovile vastu pidanud, on ehitatud selle pĂ”himĂ”tte peale. Neis on midagi vĂ€ga tĂ€pset ja ainulaadset, midagi, mis kasutab kĂ”iki vĂ”imalikke ressursse. Laevatootmise nĂ€ites pudelis mĂ€ngitakse sellega, et laeva korpus tuleb lĂ€bi kaela.
Tagasi tulles meie vahemĂ€luserveri valiku ĂŒlesande juurde, kuidas saaks seda meetodit rakendada? Ma pakun sellist varianti kĂ”igi sĂŒsteemide hulgast â mitte pudelit raputada ja mitte valida, vaid vaadata, mis neil ĂŒldiselt on, millele tĂ€helepanu pöörata sĂŒsteemi valimisel.
Kus otsida pudeli kaela?
Proovime mitte pudelit raputada ega kĂ”ike ĂŒkshaaval ĂŒle vaadata, vaid vaatame, millised ĂŒlesanded tekivad, kui ĂŒritame disainida sellise sĂŒsteemi ise. Me ei hakka jalgratast leiutama, kuid kasutame seda skeemi, et suunata, millele toote kirjeldustes tĂ€helepanu pöörata. Joonistame sellise skeemi.

Kui sĂŒsteem on jaotatud, siis on meil mitu serverit (6). Oletame, et neid on neli (mis on pildil mugavalt paigutatavad, kuid neid vĂ”ib olla ka rohkem). Kui serverid asuvad erinevates sĂ”lmedes, siis töötab kĂ”igil mingisugune kood, mis vastutab selle eest, et need sĂ”lmed moodustaksid klastri ja vajadusel ĂŒhenduksid ning ĂŒksteist tunneksid.
Vaja on ka koodiloogikat (2), mis tegelikult tegeleb vahemÀljega. Selle koodiga suhtlevad kliendid teatud API kaudu. Kliendi kood (1) vÔib olla nii selle sama JVM-i raames, kui ka suhelda sellega vÔrgus. Siseselt rakendatud loogika tÀhendab, milliseid objekte vahemikus hoida ja milliseid vÀlja visata. VahemÀlu hoidmiseks kasutame mÀlu (3), kuid vajadusel saame osa andmeid ka kettale salvestada (4).
Vaadakem, millistes osades koormus tekkib. Tegelikult koormatakse iga nool ja iga sĂ”lm. Esiteks, kui see on vĂ”rguĂŒhendus, siis kliendi koodi ja API vahel vĂ”ib nĂ€htav jĂ”udluse langus olla mĂ€rgatav. Teiseks, API enda raames â kui loogika lĂ€heb liiga keeruliseks, vĂ”ime jĂ”uda CPU piiri. Ja oleks hea, kui loogika ei ajaks mĂ€lu alusetult ringi. JÀÀb veel suhtlemine failisĂŒsteemiga â tavalises variandis on see serialiseerimine/kordus ja kirjutamine/lugemine.
Edasi liikudes on suhtlemine klastri poole. TĂ”enĂ€oliselt on see sama sĂŒsteemis, kuid vĂ”ib olla ka eraldi. Siin tuleb samuti arvesse vĂ”tta andmete edastamist, andmete serialiseerimise kiirus ja suhtlemine klastri vahel.
NĂŒĂŒd, ĂŒhest kĂŒljest â saame kujutada, "millised hammasrattaid pööratakse" vahemĂ€lu sĂŒsteemis meie koodi pĂ€ringute töötlemisel, ja teisest kĂŒljest â saame hinnata, kui palju ja milliseid pĂ€ringuid meie kood sellele sĂŒsteemile genereerib. Seda on piisavalt, et teha enam-vĂ€hem ratsionaalne valik â leida sĂŒsteem meie kasutusvariandi jaoks.
Hazelcast
Vaadake, kuidas seda jaotust meie loendile rakendada. NĂ€iteks, Hazelcast.
Andmete paigutamiseks/saamiseks Hazelcastis pöördub klientkood (1) api poole. Hz vĂ”imaldab serveri kĂ€ivitada embedded-reĆŸiimis, ja sel juhul on pöördumine api - meetodi vĂ€ljakutse JVM-s, mida vĂ”ib pidada tasuta.
Et loogika (2) toimiks, toetub Hz serialiseeritud vÔtme baitmassivale hash'ile - see tÀhendab, et vÔtme serialiseerimine toimub igal juhul. See on Hz jaoks vÀltimatu overhead.
Eviction-strateegiad on hÀsti ellu viidud, kuid erijuhtudel on vÔimalik lisada oma. Selle pÀrast muretsemine pole vajalik.
Salvestusruumi (4) saab ĂŒhendada. SuurepĂ€rane. Interaktsioon (5) embedded-reĆŸiimis vĂ”ib pidada koheseks. Andmevahetus sĂ”lmede vahel klastris (6) - jah, see on olemas. See on panus kĂ”lblikkuse ja töökindluse nimel kiirusel. Hz-funktsioon Near-cache aitab vĂ€hendada kulusid - teistelt klastrisĂ”lmedelt saadud andmed salvestatakse vahemĂ€llu.
Mida sellistes tingimustes kiirusetÔstmiseks teha?
NĂ€iteks, et vĂ€ltida vĂ”tme serialiseerimist (2) - Hazelcasti peale lisada veel ĂŒks vahemĂ€lu kĂ”ige kuumemate andmete jaoks. Sportmasteris valiti selle eesmĂ€rgi saavutamiseks Caffeine.
Selleks, et kohandada tasemel (6) Hz-is, pakutakse kahte tĂŒĂŒpi salvestamist: IMap ja ReplicatedMap.

Oluline on rÀÀkida, kuidas Hazelcast sattus Sportmasteri tehnoloogiastakisse.
2012. aastal, kui töötasime tulevase veebisaidi esimese prototĂŒĂŒbi kallal, oli Hazelcast esimene link, mille otsingumootor vĂ€ljastas. Meie tutvumine algas "esimesest korrast" â see, et ta töötas vaid kahe tunni pĂ€rast, kui olime Hz-sĂŒsteemi integreerinud, oli meie jaoks suur ĂŒllatus. Ja see töötas hĂ€sti. PĂ€eva lĂ”puks olime kirjutanud mitu testi ja olime rahul. Seda energiat jĂ€tkus, et ĂŒletada aega jooksul ilmunud ĂŒllatused, mida Hz esitas. NĂŒĂŒd ei ole Sportmasteri meeskonnal mingit pĂ”hjust Hazelcastist loobuda.
Kuid argumendid nagu "esimene link otsingumootoris" ja "kiire HelloWorldi kogumine" on muidugi erand ja hetkede eripĂ€ra, milles valik toimus. TĂ”elised katsumused valitud sĂŒsteemi jaoks algavad, kui see jĂ”uab tootmisesse, ja just sellele etapile tasub tĂ€helepanu pöörata, valides mistahes sĂŒsteemi, sealhulgas vahemĂ€lu. Tegelikult vĂ”ib öelda, et valisime Hazelcasti juhuslikult, kuid hiljem selgus, et tegime Ă”igesti.
Tootmise erilise tĂ€helepanuta: jĂ€lgimine, tĂ”rgete töötlemine ĂŒksikutes sĂ”lmedes, andmete replikatsioon ja skaleerimise kulud. TeisisĂ”nu, tasub tĂ€helepanu pöörata probleemidele, mis tekivad just sĂŒsteemi hooldamisel â kui koormus ĂŒletab korduvalt plaanitud taset, kui laadime kogemata sisse vale sisu ja vale koht, vĂ”i kui on vaja vĂ€ljendada uut koodiversiooni, andmeid vahetada ja teha seda klientidele mĂ€rkamatuks.
KÔikide nende nÔuete jaoks sobib Hazelcast kindlasti.
JĂ€tkub
Kuid Hazelcast ei ole imerohi. 2017. aastal valisime Hazelcasti administraatori vaates mĂ€lupuhvriks, tuginedes lihtsalt varasema hea kogemuse muljele. See mĂ€ngis olulist rolli vĂ€ga kurva nalja tĂ”ttu, mis viis meid keerulisse olukorda, millest vĂ€ljumine kestis âkangelaslikultâ 60 pĂ€eva. Kuid sellest rÀÀgime jĂ€rgmises osas.
Aga seni⊠Head uut koodi!
Allikas: habr.com
