Tere! Minu nimi on Alexey Pjankov, olen arendaja ettevÔttes Sportmaster. Sel jagasime, kuidas Sportmasteri veebisaidi arendamine 2012. aastal algas, millised algatused Ônnestus "edendada" ja vastupidi, milliseid takistusi me kogusime.
TĂ€na tahan jagada mĂ”tteid, mis jĂ€rgivad teistsugust teemat â jaotussĂŒsteemi valimist Java-taustal saidi administreerimiseks. See teema on mulle eriti tĂ€htis â kuigi lugu kestis vaid 2 kuud, töötasime nendel 60 pĂ€eval 12â16 tundi pĂ€evas ja ilma ĂŒhegi puhkepĂ€evata. Ma pole kunagi varem mĂ”elnud ega kujutlenud, et on vĂ”imalik nii palju töötada.
SeetĂ”ttu jagan teksti kaheks osaks, et mitte ĂŒle koormata. Vastupidi, esimene osa on vĂ€ga kerge â ettevalmistus, sissejuhatus, mĂ”ned mĂ”tted, mis on vahemĂ€lu. Kui olete juba kogenud arendaja vĂ”i olete töötanud vahemĂ€ludega â tehnilisest kĂŒljest ei leia te tĂ”enĂ€oliselt selles artiklis midagi uut. Siiski vĂ”ib noorele arendajale see vĂ€ike ĂŒlevaade anda suuna, kuhu vaadata, kui ta satub sellisesse olukorda.
Kui Sportmasteri uus veebiversioon lansseeriti, toimusid andmete edastamine viisil, pehmelt öeldes, mitte vĂ€ga mugavalt. PĂ”hialuseks olid tabelid, mis olid ette valmistatud eelmise veebiversiooni (Bitrix) jaoks, mida tuli ETL-sse tĂ”mmata, uue vormi saavutamiseks muudatusi teha ja rikastada erinevate âsĂŒĆŸeedeâ abil veel kĂŒmnest sĂŒsteemist. Et uus pilt vĂ”i tootekirjeldus veebilehele jĂ”uaks, tuli oodata jĂ€rgmise pĂ€evani â uuendamine toimus ainult öösel, ĂŒks kord pĂ€evas.
Alguses oli esimestel nĂ€dalatel pĂ€rast tootmisse minekut nii palju muresid, et sellised ebamugavused sisuhalduritele tundusid pisiasjadena. Kuid kui kĂ”ik paika loksus, jĂ€tkus projekti areng â mĂ”ne kuu pĂ€rast, 2015. aasta alguses, hakkasime aktiivselt arendama administreerimissektorit. 2015. ja 2016. aastatel lĂ€ks kĂ”ik hĂ€sti, avaldasime regulaarselt uusi versioone, administreerimissektor hĂ”lmas ĂŒha suuremat osa andmete ettevalmistamisest ja valmistusime selleks, et varsti usaldatakse meie meeskonnale kĂ”ige tĂ€htsam ja keerulisem ĂŒlesanne â tootejoon (kogu tooteandmete ettevalmistamine ja haldamine). Kuid suvel 2017, just enne tootejoone kĂ€ivitamist, sattus projekt vĂ€ga keerulisse olukorda â just seoses vahemĂ€lu probleemidega. Sellest episoodist tahangi rÀÀkida teises osas sellest kaheteisest avaldamisest.
Kuid selles postituses alustan kaugelt, tuues vĂ€lja mĂ”ned mĂ”tted â arusaamad vahemĂ€llu salvestamisest, mille ĂŒle oleks enne suurt projekti hea ette mĂ”elda.
Kuidas vahemÀlustamine tekib
VahemĂ€lustamise ĂŒlesanne ei teki lihtsalt niisama. Me oleme arendajad, kirjutame tarkvaratooteid ja soovime, et need oleksid nĂ”utud. Kui toode on nĂ”utud ja edukas â saabub ĂŒha rohkem kasutajaid. Ja aina rohkem ja rohkem. Ja siis on kasutajaid juba palju ning toode muutub suure koormusega.
Esimestel etappidel me ei mĂ”tle koodi optimeerimisele ja jĂ”udlusele. Peamine on funktsionaalsus, kiiresti vĂ€lja visata eskiis ja testida hĂŒpoteese. Ja kui koormus kasvab â suurendame riistvara. Suurendame seda kaks-kolm-kĂŒmme korda, olgu. Kusagil siin ei luba rahade tĂ”us rohkem edasi minna. Ja mitu korda kasutajate hulk siis suureneb? See ei ole 2-5-10, vaid juhul, kui Ă”nnestub â siis vĂ”ib see kasvada 100-1000 ja kuni 100 000 korda. See tĂ€hendab, et varem vĂ”i hiljem tuleb optimeerimisega tegeleda.
Oletame, et mingi osa koodist (nimetame seda osaks funktsiooniks) töötab hĂ€bivÀÀrselt kaua ja me soovime vĂ€hendada tĂ€itmise aega. Funktsioon â see vĂ”ib olla andmebaasi juurde pÀÀsemine vĂ”i mingi keerulise loogika tĂ€itmine â oluline on, et see kestab kaua. Kui palju saame tĂ€itmise aega vĂ€hendada? PiiriĂŒleselt â saame vĂ€hendada nullini, mitte kaugemale. Kuidas saame tĂ€itmise aja nullini vĂ€hendada? Vastus: vĂ€listada tĂ€itmine ĂŒldse. Selle asemel saame kohe tagastada tulemuse. Kuidas teada saada tulemus? Vastus: kas arvutada vĂ”i kuskil peegeldada. Arvutamine â see on pikk protsess. Ja peegeldamine â see tĂ€hendab nĂ€iteks meeles pidada, milline tulemus funktsioon eelmisel korral sama parameetritega andis.
See, the implementation of the function doesn't matter to us. It's enough to know what parameters affect the result. Therefore, if we represent the parameter values as an object that can be used as a key in some storage, we can save the calculation result and retrieve it the next time. If these read-write operations are faster than executing the function, we gain speed profit. The profit can reach 100, 1000, or even 100,000 times (10^5 is more of an exception, but in the case of a significantly lagging database, it is quite possible).
Main requirements for the caching system
The first requirement for a caching system could be fast read speed and slightly less so for write speed. This is true, but only until we deploy the system into production.
Let's consider such a case.
Suppose we have ensured the current load with hardware and are now gradually implementing caching. User numbers are slightly increasing, the load is growing â we add caches here and there. This goes on for some time, and now the heavy functions are hardly called anymore â the main load is handled by the cache. The number of users has increased N times during this period.
If the initial hardware capacity was 2-5 times, then with caching we could boost performance by 10 times or, in a good case, 100 times, sometimes even 1000. In other words, on the same hardware, we process 100 times more requests. Great, we've earned a reward!
But now, at one point, accidentally, the system failed and the cache crashed. Nothing special â we chose the cache based on the requirement of 'high read and write speed, the rest doesn't matter.'
In relation to the initial load, our hardware capacity was 2-5 times, and the load during this time has grown 10-100 times. With caching, we eliminated calls to heavy functions, so everything was running smoothly. But now, without caching â how much will our system drop? What will happen to us? The system will crash.
Even if our cache hasnât crashed but just cleared for a while â it will need to be warmed up, which will take some time. During this time, the main load will fall on the functionality.
VĂ€ljund: kĂ”rge koormusega projektid tootmises nĂ”uavad sĂŒsteemilt mitte ainult kiiret lugemist ja kirjutamist, vaid ka andmete sĂ€ilitamist ja tĂ”rgeteta toimimist.
Valikute vaev
Projektis, kus on administraatori paneel, lĂ€ks valik nii: kĂ”igepealt paigaldasime Hazelcasti, kuna olime selle tootega juba tuttavad meie pĂ”hisaidi kogemuste kaudu. Kuid siin osutus selline valik ebaĂ”nnestumiseks â meie koormuse profiili juures töötab Hazelcast mitte lihtsalt aeglaselt, vaid kohutavalt aeglaselt. Ja tootmisse mineku tĂ€htaegade osas olime me sel hetkel juba allkirjastanud.
Spoiler: kuidas tĂ€pselt tingimused kokku langesid, et me jĂ€tsime sellise vĂ”imaluse maha ja saime terava ning pingelise olukorra â rÀÀgin sellest teises osas â ja kuidas me sattusime, ja kuidas vĂ€lja tulime. Kuid praegu â ĂŒtlen ainult, et see oli suur stress, ja "mĂ”elda - kuidagi ei mĂ”tle, raputame pudelit." "Raputame pudelit" â see on samuti spoiler, sellest veidi hiljem.
Mida me tegime:
- Koostame loendi kĂ”igist sĂŒsteemidest, mida Google ja StackOverflow soovitavad. Veidi rohkem kui 30
- Kirjutame koormustestisid, mis on iseloomulikud tootmiskeskkonnale. Selleks salvestasime andmed, mis lĂ€bivad sĂŒsteemi tootmiskeskkonnas â omamoodi sniffer andmete jaoks, mis ei ole vĂ”rgus, vaid sĂŒsteemi sees. Testides kĂ€ivitasime just need andmed.
- Kogu tiim, igaĂŒks valib jĂ€rgmise sĂŒsteemi loendist, seadistab, kĂ€ivitab testid. Kui test ei lĂ€he lĂ€bi, ei suuda koormust taluda â viskame vĂ€lja, liigume jĂ€rgmise juurde.
- 17. sĂŒsteemis sai selgeks, et kĂ”ik on lootusetu. Aeg on lĂ”petada "pudeli raputamine", on aeg tĂ”siselt jĂ€rele mĂ”elda.
Kuid see on variant, kui tuleb valida sĂŒsteem, mis "mahub kiirusest" ette valmistatud testides. Aga kui selliseid teste veel ei ole ja tahaks kiiremini valida?
Simuleerime sellist varianti (raske on ette kujutada, et keskmise taseme arendaja elab vaakumis, ja valiku tegemise hetkel ei ole veel oma eelistust vĂ€ljendanud, millist toodet esmajoones proovida â seega edasised arutlused on pigem teoreetilised/filosoofilised/noore arendaja teemad).
Otsustades nĂ”udmised, alustame valmis lahenduse valimist. Miks jalgratast uuesti leiutada: lĂ€heme ja vĂ”tame valmis vahemĂ€lusĂŒsteemi.
Kui te alles alustate ja Google'ist otsite, siis jĂ€rjestus on enam-vĂ€hem selline, kuid suunised jÀÀvad samaks. Esiteks satute Redis'e peale, see on igal pool teemaks. Siis saate teada, et on olemas EhCache, mis on ĂŒks vanimaid ja kĂ”ige usaldusvÀÀrsemaid sĂŒsteeme. JĂ€rgmisena rÀÀgitakse Tarantoolist â kohalikust arendusest, millel on ainulaadne lahenduse aspekt. Ja samuti Ignite, kuna see on praegu populaarsuse tĂ”usu teel ja saavad toetust SberTechi poolt. LĂ”puks veel Hazelcast, kuna see tihti esineb ettevĂ”tte maailmas suurte firmade seas.
See nimekiri ei ole lĂ”plik, sĂŒsteeme on kĂŒmneid. Me kĂ€sitleme ainult ĂŒhte. Vaatame valitud 5 sĂŒsteemi âilu vĂ”istluseleâ ja viime lĂ€bi valiku. Kes saab vĂ”itjaks?
Redis
Loomulikult vaatame, mida ametlikul saidil kirjutatakse.
â avatud allikas projekt. Pakub andmete in-memory salvestust, vĂ”imalust salvestada andmeid kettale, automaatset jagamist partiideks, kĂ”rget kĂ€ttesaadavust ja taastumist vĂ”rgu katkemise jĂ€rel.
Tundub, et kĂ”ik on suurepĂ€rane, seda vĂ”ib vĂ”tta ja kasutada â kĂ”ik, mis vajalik, see teeb. Kuid vaatame lihtsalt huvi pĂ€rast teisi kandidaate.
EhCache
â âkĂ”ige laialdasemalt kasutatav vahemĂ€lu Java jaoksâ (ametliku saidi slogan tĂ”lgituna). Samuti avatud allikas. Ja siit mĂ”istame, et Redis ei ole Java jaoks, vaid ĂŒldine, ja selleks, et sellega suhelda, on vajalik wrapper. Kuid EhCache on mugavam. Mida veel sĂŒsteem lubab? UsaldusvÀÀrsust, tĂ”estatud tulemusi, tĂ€isfunktsionaalsust. Ja pealegi on see kĂ”ige levinum. Ja see cache'ib terabaiti andmeid.
Redis on unustatud, ma olen valmis valima EhCache'i.
Aga patriotismi tunne sunnib mind vaatama, millised omadused on Tarantoolil.
Tarantool
â esitleb end kui âReaalajas andmete integreerimisplatvormâ. Tundub vĂ€ga keeruline, seega loeme lehte pĂ”hjalikult ja leiame kĂ”lava vĂ€ite: âCache'ib 100% andmeid operatiivmĂ€lu.â See peaks tekitama kĂŒsimusi â sest andmeid vĂ”ib olla oluliselt rohkem kui mĂ€lu. Selgitus on selles, et Tarantool ei tee mĂ€lu andmete kettale salvestamisel serialiseerimist. Selle asemel kasutab see madala taseme sĂŒsteemi omadusi, kui mĂ€lu lihtsalt kaardistatakse failisĂŒsteemile, millel on vĂ€ga head I/O nĂ€itajad. Ăldiselt, tehti kuidagi suurepĂ€raselt ja toredalt.
Vaadakem rakendusi: Mail.ru ettevÔtte taristu, Avito, Beeline, Megafon, Alfa-Bank, Gazprom...
Kui Tarantooli osas oli veel mingeid kahtlusi, siis Mastercardi rakenduse juhtum on mind maha löönud. Valin Tarantooli.
Aga sellegipoolestâŠ
Ignite
⊠on veel , mida kirjeldatakse kui âin-memory arvutusplatvorm⊠in-memory kiirus petabaidides andmetesâ. Siin on ka palju plusse: jaotatud in-memory vahemĂ€lu, kĂ”ige kiirem key-value salvestus ja vahemĂ€lu, horisontaalne skaleeritavus, kĂ”rge saadavus, range terviklikkus. KokkuvĂ”ttes, tundub, et kĂ”ige kiirem ongi Ignite.
Rakendused: Sberbank, American Airlines, Yahoo! Japan. Ja siis ma veel avastan, et Ignite ei ole lihtsalt Sberbankis kasutusele vĂ”etud, vaid SberTechi meeskond saadab oma inimesi Igniteâi meeskonda toodet tĂ€iustama. See ostab mind tĂ€ielikult ja olen valmis Igniteâi vĂ”tma.
TĂ€iesti arusaamatult vaatan viiendat punkti.
Hazelcast
KĂŒlastan veebisaiti , loen. Ja selgub, et kĂ”ige kiirem lahendus jaotatud vahemĂ€lu jaoks on Hazelcast. See on oluliselt kiirem kui kĂ”ik teised lahendused ja on ĂŒldiselt liider in-memory andmevĂ”rgu valdkonnas. Sellise taustaga on midagi muud vĂ”tta enda mitte austamisele.
KÔik, olen valmis Hazelcasti vÔtma.
VÔrdlus
Aga kui vaadata, siis kĂ”ik viis kandidaati on nii kirja pandud, et igaĂŒhes neist â parim. Kuidas valida? VĂ”ime vaadata, milline neist on kĂ”ige populaarsem, otsida vĂ”rreldes ja peavalu kaob.
Leidsime sellise , valime meie 5 sĂŒsteemi.

Siin on nad jĂ€rjestatud: eespool Redis, teisel kohal â Hazelcast, populaarsust koguvad Tarantool ja Ignite, EhCache jÀÀb endiseks.
Aga vaatame : lingid veebisaitidele, sĂŒsteemi ĂŒldine huvi, tööpakkumised â tore! Siis, kui minu sĂŒsteem kokku kukub, ĂŒtlen: âEi, see on ju usaldusvÀÀrne! Siin on palju tööpakkumisiâŠâ. Selline lihtne vĂ”rdlus ei sobi.
KĂ”ik need sĂŒsteemid ei ole lihtsalt vahemĂ€llu salvestamise sĂŒsteemid. Neil on veel palju funktsioone, sealhulgas â kui mitte andmeid edastatakse kliendile töötluseks, vaid vastupidiselt: kood, mida peab andmete ĂŒle töötlema, liigub serverisse, seal kĂ€ivitatakse ja tulemus tagastatakse. Ja kui eraldi vahemĂ€lu sĂŒsteemina ei vaadata neid nii sageli.
Hea, ei anname alla, leiame otsese vĂ”rdluse sĂŒsteemide vahel. VĂ”tame kaks ĂŒlemist varianti â Redis ja Hazelcast. Meid huvitab kiirus, selle parameetri pĂ”hjal neid ka vĂ”rreldakse.
Hz vs Redis
Leidsime sellise :

Sinine on Redis, punane Hazelcast. Hazelcast vĂ”idab kĂ”ikides vĂ”rdlustes ning sellel on oma pĂ”hjused: see on mitme lĂ”imega, tugevalt optimeeritud, iga lĂ”im töötab oma partiiga, seega ei toimu ummikuid. Redis on aga ĂŒhe lĂ”imega, seega ei suuda see tĂ€napĂ€evastelt mitme tuumalistelt CPU-delt vĂ”itu saada. Hazelcast kasutab asĂŒnkroonset I/O-d, Redis-Jedis aga blokeerivaid socket-e. LĂ”ppude lĂ”puks kasutab Hazelcast binaarset protokolli, samas kui Redis on suunatud tekstile, mis tĂ€hendab, et see on ebaefektiivne.
Igaks juhuks viidates veel ĂŒhele vĂ”rdluse allikale. Mida see meile nĂ€itab?
Redis vs Hz
Veel ĂŒks :

Siin on vastupidi, punane on Redis. See tÀhendab, et Redis vÔidab Hazelcasti tootlikkuses. Esimeses vÔrdluses vÔitis Hazelcast, teises aga Redis. on vÀga tÀpselt selgitatud, miks eelnevas vÔrdluses vÔitis Hazelcast.
Selgub, et esimese tulemus oli faktiliselt vale: Redis vĂ”eti pĂ”hiversioonis, samas kui Hazelcast kohandati testjuhtumi jaoks. Nii et kokkuvĂ”ttes: esiteks, kellelegi ei saa usaldada, teiseks, kui me ikkagi valime sĂŒsteemi, siis peame selle ka Ă”igesti seadistama. Need seaded hĂ”lmavad kĂŒmneid, peaaegu sadu parameetreid.
Raputame pudelit
Ja kogu protsessi, mida me praegu lÀbime, saan ma selgitada sellise metafooriga «Raputame pudelit». See tÀhendab, et praegu ei ole vaja programmeerida, praegu on peamine osata lugeda stackoverflow-d. Ja minu meeskonnas on inimene, professionaal, kes töötab just niimoodi kriitilistel hetkedel.
Mida ta teeb? Ta nĂ€eb mitte töötavat asja, nĂ€eb stack trace'i, vĂ”tab sealt sĂ”nu (milli just â see on tema ekspertiis programmis), otsib Googlest, leiab stackoverflow vastuste seast. Mitte lugedes, mitte mĂ”eldes, vastuste seas valib ta midagi, mis on kĂ”ige sarnasem vĂ€ljendiga «teha seda ja toda» (selle vastuse valimine on tema talent, kuna see ei pruugi alati olla see vastus, mis on saanud rohkem hÀÀli), rakendab, vaatab: kui midagi on muutunud, siis on kĂ”ik korras. Kui ei ole muutunud â tagastame. Ja kordame kĂ€ivitamist-kontrollimist-otsimist. Ja niimoodi intuitsiooniga saavutab ta selle, et mingil hetkel kood töötab. Ta ei tea, miks, ta ei tea, mida ta tegi, ta ei oska selgitada. Kuid! See jama töötab. Ja «tuli on kustutatud». NĂŒĂŒd saame aru, mida me tegime. Kui programm töötab â on see kordades lihtsam. Ja sÀÀstab oluliselt aega.
See, this method is very well explained with such an example.
Once, it was very popular to build a ship in a bottle. The ship is large and fragile, while the neck of the bottle is very narrow, making it impossible to push it inside. How to assemble it?

There is a method, very quick and very effective.
The ship consists of a bunch of small parts: sticks, strings, sails, glue. We put all this into the bottle.
We take the bottle with both hands and start shaking. We shake it and shake it. And usually â it turns out to be a complete mess, of course. But sometimes, just sometimes, it turns into a ship! Or rather, something that resembles a ship.
We show this something to someone: "Seryoga, see!?". And indeed, from a distance â it looks like a ship. But you can't let it go further.
There's another way. More advanced guys, like hackers, use it.
I gave such a guy a task, he completed it and left. And you see â it seems done. But after a while, when you need to modify the code â that's when the trouble starts⊠Good thing he has already run far away. These are the kinds of guys who can take the example of the bottle and do this: see, where the bottom is â the glass bends. And itâs not quite clear if itâs transparent or not. Then the 'hackers' cut off this bottom, insert the ship inside, glue the bottom back, and it looks like it's meant to be.
From the perspective of task assignment, everything seems right. But taking the example of ships: why make this ship at all, who needs it? It doesn't serve any functionality. Usually, such ships are gifts for very high-ranking people, who place them on a shelf above themselves, as a symbol, as a sign. And if such a person, a leader of a large business or a high-ranking official, has a shabby artifact with its neck cut off standing as a flag? It would be better if he never finds out about it. So how do they ultimately make these ships that can be gifted to an important person?
Ainult ĂŒks koht, vĂ”tmekoht, millega tĂ”eliselt midagi ei saa ette vĂ”tta, on korpus. Ja laeva korpus lĂ€heb justkui kaela kaudu lĂ€bi. Samas kui laev ehitatakse pudelist vĂ€lja. Kuid see ei ole lihtsalt laeva kokku panemine, see on tĂ”eline kullaomaniku kĂ€sitöö. Koos komponentidega lisatakse spetsiaalsed kĂ€epidemed, mis vĂ”imaldavad neid hiljem ĂŒles tĂ”sta. NĂ€iteks volditakse purjed ettevaatlikult sisse ja seejĂ€rel tĂ”mmatakse ja tĂ”stetakse neid vĂ€ga tĂ€pselt pintsettidega. Tulemusena saadakse kunstiteos, mida saab puhta sĂŒdametunnistuse ja uhkusega kinkida.
Ja kui me tahame, et projekt oleks edukas â peab meeskonnas olema vĂ€hemalt ĂŒks kuldsep. See, kes hoolib toote kvaliteedist ja arvestab kĂ”iki aspekte, mitte ĂŒhtegi ohverdades isegi stressi hetkedel, kui olud nĂ”uavad kiiret, mis tuleb olulise arvelt. KĂ”ik edukad projektid, mis on vastupidavad ja mis on aja katsumuse vastu pidanud, on selle pĂ”himĂ”tte pĂ”hjal ehitatud. Neis on midagi vĂ€ga tĂ€pset ja ainulaadset, midagi, mis kasutab kĂ”iki saadaval olevaid vĂ”imalusi. NĂ€ites pudelilaeva kohta - mĂ€ngitakse vĂ€lja see, et laeva korpus lĂ€heb lĂ€bi kaela.
Tagasi tulles ĂŒlesande juurde, kuidas valida meie vahemĂ€lu serverit, kuidas seda meetodit vĂ”iks rakendada? Ma pakun vĂ€lja sellise valiku kĂ”igist olemasolevatest sĂŒsteemidest - mitte pudelit raputada, mitte valida, vaid vaadata, mis seal tegelikult on, millele tĂ€helepanu pöörata sĂŒsteemi valimisel.
Kus otsida pudelikaela
Proovime mitte pudelit raputada, mitte jĂ€rjest kĂ”ike lĂ€bi vaadata, vaid vaatame, millised ĂŒlesanded vĂ”ivad tekkida, kui peaksime oma ĂŒlesande jaoks iseseisvalt sellise sĂŒsteemi projekteerima. Jalgratast me loomulikult ei leiuta, kuid kasutame seda skeemi, et orienteeruda, millele tĂ€helepanu pöörata toodete kirjeldustes. Joonistame vĂ€lja sellise skeemi.

Kui sĂŒsteem on jagatud, siis on meil mitmeid servereid (6). Oletame, et neli (mugav joonistada pildile, kuid neid vĂ”ib olla igasugune hulk). Kui serverid asuvad erinevates sĂ”lmedes, siis töötab neis kĂ”igis mingi kood, mis vastutab selle eest, et need sĂ”lmed moodustaksid klastri ja katkestamise korral - ĂŒhenduksid, tunneksid ĂŒksteist.
Vajame ka koodilogikat (2), mis sisuliselt tegeleb vahenduse vahemÀllu salvestamisega. Selle koodiga suhtlevad kliendid teatud API kaudu. Klientide kood (1) vÔib olla nii sellesama JVM raames kui ka sellele vÔrgu kaudu juurde pÀÀseda. Sees rakendatud loogika mÀÀrab, millised objektid jÀÀvad vahemÀllu ja millised visatakse vÀlja. VahemÀlu hoidmiseks kasutame mÀlu (3), kuid vajadusel saame osa andmeid ka kettale salvestada (4).
Vaatame, millistes osades koormus tekib. Tegelikult koormatakse iga noolt ja igat sĂ”lme. Esiteks klientide koodi ja API vahel, kui see on vĂ”rguvaheline suhtlemine, vĂ”ib allasurumine olla ĂŒsna mĂ€rgatav. Teiseks, API enda raames - kui keerukaks loogikaks minna, vĂ”ime jĂ”uda CPU piirini. Ja oleks hea, kui loogika ei sunniks mĂ€lu liigset kasutama. JÀÀb veel suhtlemine failisĂŒsteemiga â tavapĂ€rasel juhul tuleb see serialiseerida / taastada ja kirjutada / lugeda.
Edasi liikudes klastriga suhtlemine. TĂ”enĂ€oliselt on see samas sĂŒsteemis, kuid vĂ”ib olla ka eraldi. Siin tuleb samuti arvesse vĂ”tta andmete edastamist, andmete serialiseerimise kiirus ja suhtlemine klastriga.
NĂŒĂŒd, ĂŒhelt poolt - saame mĂ”elda, "millised hammasrattad pöörlevad" vahemĂ€lu sĂŒsteemis meie koodi pĂ€ringute töötlemisel, ja teiselt poolt - saame hinnata, kui palju ja milliseid pĂ€ringuid meie kood sellele sĂŒsteemile genereerib. Seda on piisavalt, et teha enam-vĂ€hem tasakaalustatud valik - valida sĂŒsteem vastavalt meie kasutusvariandile.
Hazelcast
Vaatame, kuidas sellist jaotust oma nimekirjale rakendada. NĂ€iteks Hazelcast.
Kuna andmete lisamiseks / vÔtmiseks Hazelcastist pöördub kliendi kood (1) API poole. Hz vÔimaldab kÀivitada serverit kui embedded, ja sellisel juhul on API-le pöördumine meetodi kutsumine JVM sees, mida vÔib pidada tasuta.
Kuna loogika (2) töötamiseks toetub Hz serialiseeritud vĂ”tme baitmassiivist saadud hash'ile â see tĂ€hendab, et vĂ”tme serialiseerimine toimub igal juhul. See on Hz jaoks vĂ€ltimatu ĂŒlejÀÀk.
Eemaldamisstrateegiad on hĂ€sti rakendatud, kuid erijuhtudel â saab lisada oma. Selle osa pĂ€rast ei ole vaja muretseda.
Salvestust (4) saab ĂŒhendada. SuurepĂ€rane. Interaktsioon (5) embedded jaoks vĂ”ib pidada koheseks. Andmete vahetamine sĂ”lmede vahel klastris (6) â jah, see on olemas. See on panus sĂŒsteemi töökindluse nimel, ohverdatud kiirusel. Hinna langetamine on vĂ”imalik Hz-funktsiooniga Near-cache â andmed, mis saadakse teistelt klastrinoodidelt, salvestatakse vahemĂ€lu.
Mida sellistes tingimustes teha kiiruselise tÔusu saavutamiseks?
NĂ€iteks, et vĂ€ltida vĂ”tme serialiseerimist (2) â lisada Hazelcastile veel ĂŒks vahemĂ€lu, kĂ”ige kuumemate andmete jaoks. Sportmasteris vĂ€lja valitud Caffeine.
Selle taseme (6) optimeerimiseks pakub Hz kahte tĂŒĂŒpi salvestamist: IMap ja ReplicatedMap.

Tuleb mainida, kuidas Hazelcast sattus Sportmasteri tehnoloogia virna.
Aastal 2012, kui töötasime tulevase saidi esimeses pilotprojektis, osutus Hazelcast just esimeseks lingiks, mille otsingumootor vĂ€ljastas. Kohtumine algas "esimese korraga" â meid vĂ”lus see, et vaid kahe tunni pĂ€rast, kui me Hz sĂŒsteemi lisasime â see töötas. Ja töötas hĂ€sti. PĂ€rast seda pĂ€eva lisasime palju teste, olime rÔÔmsad. Ja see energiatĂ€idetus piisavalt, et ĂŒletada need ĂŒllatused, mida Hz aja jooksul kĂŒlvas. Praeguseks pole Sportmasteri meeskonnal pĂ”hjuseid Hazelcastist loobuda.
Kuid sellised argumendid nagu âesimene link otsingumootorisâ ja âkiirelt kokkupanek HelloWorld'ileâ on muidugi erand ja hetkeomadus, milles valik toimus. TĂ”elised katsed valitud sĂŒsteemi jaoks algavad tootmisfaasis, ja just sellele etapile tasub tĂ€helepanu pöörata iga sĂŒsteemi, kaasa arvatud vahemĂ€lu, valimisel. Tegelikult vĂ”ib meie puhul öelda, et valisime Hazelcast juhuslikult, kuid hiljem selgus, et tegime Ă”ige valiku.
Tootmises on palju olulisemad: jĂ€lgimine, vigade kĂ€sitsemine eraldi sĂ”lmedes, andmete replikatsioon, skaleerimise kulud. Seega tasub pöörata tĂ€helepanu ĂŒlesannetele, mis tekivad just sĂŒsteemi haldamisel â siis, kui koormus ĂŒletab korduvalt planeeritud taset, kui juhuslikult laadime midagi vale ja valesse kohta, kui on vajalik uue koodiversiooni vĂ€ljatöötamine, andmete asendamine ja selle tegemine klientidele mĂ€rkamatuks.
KÔikide nende nÔudmiste jaoks sobib Hazelcast kindlasti.
JĂ€tkub
Kuid Hazelcast ei ole imevahend. 2017. aastal valisime Hazelcasti administreerimise vahemÀlu jaoks, tuginedes lihtsalt varasemate kogemuste heale muljele. See mÀngis vÔtmerolli vÀga halvas naljas, mis viis meid keerulisse olukorda, millest ''kangelaslikult'' pÀÀsesime 60 pÀevaga. Kuid sellest rÀÀgime jÀrgmises osas.
Ja seni⊠Head uut koodi!
Allikas: habr.com
