Hej! Jag heter Alexey Pyankov, jag Àr utvecklare pÄ företaget Sportmaster. I detta berÀttade jag om hur arbetet med Sportmasters webbplats började 2012, vilka initiativ vi lyckades "trycka igenom" och tvÀrtom, vilka fallgropar vi stötte pÄ.
Idag vill jag dela med mig av tankar som följer ett annat Ă€mne â valet av cache-system för java-backenden i webbplatsens adminpanel. Detta Ă€mne har en sĂ€rskild betydelse för mig â Ă€ven om historien utspelade sig under bara 2 mĂ„nader, arbetade vi dessa 60 dagar 12-16 timmar om dagen utan en enda ledig dag. Jag har aldrig tidigare tĂ€nkt eller förestĂ€llt mig att man kan arbeta sĂ„ mycket.
DĂ€rför delar jag texten i 2 delar för att inte överbelasta helt. TvĂ€rtom, första delen kommer att vara mycket lĂ€tt â en förberedelse, en introduktion, nĂ„gra tankar om vad caching Ă€r. Om du redan Ă€r en erfaren utvecklare eller har arbetat med cachar, kommer det troligtvis inte finnas nĂ„got nytt ur teknisk synpunkt i denna artikel. Men för en junior kan en liten översikt ge en vink om vilken riktning man ska titta i, om man befinner sig vid en sĂ„dan korsning.
NĂ€r den nya versionen av Sportmasters webbplats lanserades i produktion, kom data pĂ„ ett sĂ€tt som, milt sagt, inte var sĂ€rskilt praktiskt. Grunden var tabeller som förberetts för den tidigare versionen av webbplatsen (Bitrix), som behövde dras in i ETL, omformas och berikas med olika tillĂ€gg Ă€ven frĂ„n ett dussin andra system. För att den nya bilden eller produktbeskrivningen skulle dyka upp pĂ„ webbplatsen, var man tvungen att vĂ€nta till nĂ€sta dag â uppdateringen skedde bara pĂ„ natten, en gĂ„ng om dagen.
I början var det sĂ„ mĂ„nga bekymmer under de första veckorna av produktlanseringen att content managers' besvĂ€r kĂ€ndes som struntsaker. Men sĂ„ snart allt hade stabiliserat sig fortsatte projektet att utvecklas â nĂ„gra mĂ„nader senare, i början av 2015, började vi aktivt utveckla administrationsgrĂ€nssnittet. Under 2015 och 2016 gick allt bra, vi slĂ€ppte regelbundet nya versioner, administrationsgrĂ€nssnittet tĂ€ckte allt större delar av databehandlingen och vi förberedde oss pĂ„ att snart fĂ„ det mest viktiga och utmanande â produktflödet (fullstĂ€ndig hantering och underhĂ„ll av data för alla produkter). Men sommaren 2017, precis innan lanseringen av produktflödet, befann sig projektet i en mycket svĂ„r situation â just pĂ„ grund av problem med cachehantering. Om detta avsnitt vill jag berĂ€tta i den andra delen av denna tvĂ„delade publikation.
Men i detta inlĂ€gg börjar jag frĂ„n början, sammanfattar nĂ„gra tankar â förestĂ€llningar om caching, som det skulle vara bra att ha förhandsgranskat innan ett stort projekt.
NÀr cachingproblematiken uppstÄr
Cachingproblematiken uppstĂ„r inte av sig sjĂ€lv. Vi Ă€r utvecklare, vi skriver mjukvaruprodukter och vill att de ska vara efterfrĂ„gade. Om produkten Ă€r efterfrĂ„gad och framgĂ„ngsrik â sĂ„ kommer anvĂ€ndarna. De kommer och kommer, och plötsligt har vi en stor mĂ€ngd anvĂ€ndare, och produkten blir högt belastad.
I de tidiga stadierna tĂ€nker vi inte pĂ„ kodens optimering och prestanda. Det viktigaste Ă€r funktionaliteten, att snabbt rulla ut en pilotversion och testa hypoteser. Och om belastningen ökar â förbĂ€ttrar vi hĂ„rdvaran. Vi ökar kapaciteten med tvĂ„ till tre, fem, kanske tio gĂ„nger. Vid en viss punkt kommer ekonomin att sĂ€tta stopp. Men hur mycket kommer antalet anvĂ€ndare att öka? Det kommer inte bara vara 2-5-10, utan i hĂ€ndelse av framgĂ„ng â kan det gĂ„ frĂ„n 100-1000 upp till 100 000 gĂ„nger. SĂ„ förr eller senare kommer vi att behöva ta itu med optimering.
Anta att en viss del av koden (lÄt oss kalla den hÀr delen för en funktion) tar orimligt lÄng tid att köra, och vi vill minska exekveringstiden. En funktion kan vara Ätkomst till databas, det kan vara att utföra nÄgon komplex logik - huvudsaken Àr att det tar lÄng tid. Hur mycket kan vi minska exekveringstiden? I teorin kan vi minska den till noll, inte lÀngre. Men hur kan vi minska exekveringstiden till noll? Svaret: helt enkelt hoppa över exekveringen. IstÀllet kan vi direkt returnera resultatet. Hur vet vi resultatet? Svaret: antingen berÀkna det eller kolla nÄgonstans. Att berÀkna det Àr lÄngsamt. Att kolla betyder till exempel att komma ihÄg det resultat som funktionen gav vid senaste anropet med samma parametrar.
Det betyder att implementationen av funktionen Àr irrelevant för oss. Det Àr tillrÀckligt att veta vilka parametrar som resultatet beror pÄ. Om vi dÄ kan representera vÀrdena för parametrarna som ett objekt som kan anvÀndas som nyckel i nÄgot lagringsutrymme - kan vi spara resultatet av berÀkningen och vid nÀsta anrop hÀmta det. Om dessa skrivning-och-lÀsning av resultatet gÄr snabbare Àn att köra funktionen - har vi en hastighetsfördel. Styrkan i fördelen kan nÄ upp till 100, 1000 eller 100 000 gÄnger (10^5 - det Àr mer av en undantag, men i ett fall med en ordentligt slö databas - helt möjligt).
Huvudkraven för ett cache-system
Det första som kan bli ett krav för ett cache-system Àr snabb lÀshastighet och i nÄgot mindre grad - skrivhastighet. Det Àr sant, men bara tills vi rullar ut systemet i produktion.
LÄt oss ta ett sÄdant scenario.
Anta att vi har sÀkerstÀllt hÄrdvaran för den nuvarande belastningen och nu lÄngsamt börjar införa caching. Antalet anvÀndare ökar nÄgot, belastningen vÀxer - vi lÀgger till nÄgra cache-poster, kopplar in dem hÀr och dÀr. SÄ fortsÀtter det ett tag, och nu anropas de tunga funktionerna i stort sett inte lÀngre - hela den huvudsakliga belastningen faller pÄ cachen. Antalet anvÀndare har under denna tid ökat N gÄnger.
Och om den initiala hÄrdvarureserven kunde vara 2-5 gÄnger, sÄ kunde vi med caching dra upp prestandan 10 gÄnger eller, i bÀsta fall, 100 gÄnger, ibland kanske Àven 1000 gÄnger. Det vill sÀga, pÄ samma hÄrdvara - behandlar vi 100 gÄnger fler förfrÄgningar. Fantastiskt, vi förtjÀnar en belöning!
Men nu, plötsligt, gav systemet upp och cachen kraschade. Inget speciellt â cachen valdes efter kravet "hög lĂ€shastighet och skrivhastighet, resten spelar ingen roll".
Vad gĂ€ller den initiala belastningen hade vi en hĂ„rdvarumarginal pĂ„ 2-5 gĂ„nger, medan belastningen under den tiden ökade 10-100 gĂ„nger. Med hjĂ€lp av cachen uteslöt vi anrop för tunga funktioner och dĂ€rför flöt allt pĂ„. Men nu, utan cache â hur mycket kommer vĂ„r system att sjunka? Vad kommer att hĂ€nda? Systemet kommer att gĂ„ ner.
Ăven om vĂ„r cache inte kraschade, utan bara rensades under en tid â mĂ„ste den vĂ€rmas upp, och det kommer att ta tid. Och under den tiden kommer den huvudsakliga belastningen att ligga pĂ„ funktionaliteten.
Slutsats: högbelastade projekt i produktion krÀver att systemet för caching inte bara har hög lÀshastighet och skrivhastighet, utan ocksÄ dataskydd och stabilitet mot störningar.
Valets plÄgor
I projektet med adminpanelen gjordes valet sĂ„ hĂ€r: först installerades Hazelcast, eftersom vi redan var bekanta med denna produkt frĂ„n erfarenheten av huvudwebbplatsen. Men hĂ€r visade sig detta val vara olyckligt â för vĂ„r belastningsprofil arbetar Hazelcast inte bara lĂ„ngsamt, utan fruktansvĂ€rt lĂ„ngsamt. Och med tidsramarna för att fĂ„ ut det i produktion hade vi redan skrivit pĂ„.
Spoiler: hur omstĂ€ndigheterna utvecklade sig till att vi missade en sĂ„dan överraskning och hamnade i en akut och spĂ€nd situation â kommer jag att berĂ€tta i del tvĂ„ â och hur vi hamnade dĂ€r, och hur vi kom ut. Men just nu â sĂ€ger jag bara att det var en stor stress, och "att tĂ€nka â gĂ„r liksom inte, vi skakar flaskan". "Vi skakar flaskan" â det Ă€r ocksĂ„ en spoiler, om det lite lĂ€ngre fram.
Vad vi gjorde:
- Vi sammanstÀller en lista över alla system som Google och StackOverflow föreslÄr. Lite mer Àn 30.
- Vi skriver tester med belastning som Ă€r typisk för produktion. För detta har vi spelat in data som passerar genom systemet i produktionsmiljön â en typ av sniffer för data som inte Ă€r pĂ„ nĂ€tet, men inom systemet. Dessa data körde vi i testerna.
- Hela teamet, var och en vĂ€ljer nĂ€sta system frĂ„n listan, konfigurerar och kör tester. GĂ„r inte testet, klarar inte belastningen â slĂ€nger vi det och gĂ„r vidare till nĂ€sta pĂ„ tur.
- Vid det 17:e systemet blev det klart att allt var hopplöst. Dags att sluta med "att skaka flaskan", vi mÄste tÀnka allvarligt.
Men detta Àr ett alternativ nÀr man behöver vÀlja ett system som "klarar hastighetskraven" i förberedda tester. Men om sÄdana tester inte finns och man vill vÀlja nÄgot snabbare?
Vi modellerar ett sĂ„dant alternativ (det Ă€r svĂ„rt att förestĂ€lla sig att en medelnivĂ„+ utvecklare lever i vakuum, och vid valet Ă€nnu inte har bestĂ€mt vilket produkt de vill prova först â dĂ€rför Ă€r de följande resonemangen mer teoretiska/filosofiska/om en junior).
NÀr vi har faststÀllt kraven börjar vi vÀlja en fÀrdig lösning. Varför Äteruppfinna hjulet: vi gÄr och plockar en fÀrdig cachelösning.
Om du just har börjat och kommer att googla, sĂ„ Ă€r ordningen ungefĂ€r densamma, men överlag kommer riktlinjerna att vara som följer. Först kommer du att stöta pĂ„ Redis, som Ă€r allmĂ€nt kĂ€nt. Sedan fĂ„r du veta att det finns EhCache, som Ă€r det Ă€ldsta och mest beprövade systemet. Sedan följer Tarantool â en inhemsk utveckling med unika lösningar. Och Ă€ven Ignite, eftersom det nu Ă€r pĂ„ uppgĂ„ng och stöds av SberTech. Slutligen kommer Hazelcast, som ofta dyker upp i företagsvĂ€rlden bland stora företag.
Denna lista Àr inte uttömmande, det finns mÄnga system. Men vi kommer att fokusera pÄ ett enda. Vi tar de utvalda 5 systemen till en "skönhetstÀvling" och gör en urval. Vem blir vinnaren?
Redis
LÄt oss lÀsa vad som stÄr pÄ den officiella hemsidan.
â ett opensource-projekt. Erbjuder ett in-memory datalagringssystem, möjlighet till on-disk lagring, automatisk partitionering, hög tillgĂ€nglighet och Ă„terstĂ€llning efter nĂ€tverksavbrott.
Det verkar bra, man kan ta det och koppla in â allt vad som behövs görs. Men lĂ„t oss titta pĂ„ de andra kandidaterna av ren nyfikenhet.
EhCache
â "den mest anvĂ€nda cachen för Java" (översĂ€ttning av slogan frĂ„n den officiella hemsidan). Ăven detta Ă€r opensource. HĂ€r förstĂ„r vi att Redis inte Ă€r för Java, utan allmĂ€nt, och för att interagera med det behövs en wrapper. EhCache kommer att vara bekvĂ€mare. Vad lovar systemet mer? Tillförlitlighet, beprövadhet, fullstĂ€ndighet. Och det Ă€r den mest spridda. Och cachen hanterar terabyte av data.
Redis Àr glömt, jag Àr redo att vÀlja EhCache.
Men min patriotism driver mig att kolla vad som Àr bra med Tarantool.
Tarantool
â möter beteckningen "Plattform för realtidsintegration av data". Det lĂ„ter mycket komplicerat, sĂ„ vi lĂ€ser sidan noggrant och hittar det stora pĂ„stĂ„endet: "Cachar 100% av data i RAM". Detta bör vĂ€cka frĂ„gor â eftersom datan kan vara betydligt mer Ă€n minnet. Förklaringen Ă€r att hĂ€r syftas det pĂ„ att för att skriva data till disken frĂ„n minnet, anvĂ€nder Tarantool inte serialization. IstĂ€llet anvĂ€nder den lĂ„gnivĂ„funktioner i systemet, dĂ€r minnet helt enkelt mappas pĂ„ filsystemet med mycket bra I/O-prestanda. SĂ„, det har gjorts pĂ„ ett fantastiskt och smart sĂ€tt.
LĂ„t oss titta pĂ„ implementationerna: Mail.ru företagsbackbone, Avito, Beeline, Megafon, Alfa-Bank, GazpromâŠ
Om det fortfarande finns nÄgra tvivel kring Tarantool, sÄ övertygar mig fallet med Mastercard. Jag vÀljer Tarantool.
Men Ă€ndĂ„âŠ
Ignite
⊠finns det mer , som anges som "in-memory berÀkningsplattform... in-memory hastigheter pÄ petabyte data". HÀr finns ocksÄ mÄnga fördelar: distribuerad in-memory cache, den snabbaste key-value lagring och cache, horisontell skalbarhet, hög tillgÀnglighet, strikt integritet. SÄ det visar sig att den snabbaste Àr Ignite.
Implementationer: Sberbank, American Airlines, Yahoo! Japan. Och sedan fÄr jag ocksÄ veta att Ignite inte bara har implementerats i Sberbank, utan att SberTech-teamets medlemmar skickas till Ignite-teamet för att förbÀttra produkten. Det hÀr övertygar mig helt och jag Àr redo att vÀlja Ignite.
Helt oklart varför, jag ser pÄ den femte punkten.
Hazelcast
Jag gĂ„r in pĂ„ webbplatsen , lĂ€ser. Och det visar sig att den snabbaste lösningen för distribuerad caching Ă€r Hazelcast. Det Ă€r mĂ„nga gĂ„nger snabbare Ă€n alla andra lösningar och Ă€r verkligen ledande inom in-memory data grid. I ljuset av detta, att vĂ€lja nĂ„got annat â att inte respektera sig sjĂ€lv. Dessutom anvĂ€nder den redundant datalagring för att sĂ€kerstĂ€lla att klustret fortsĂ€tter att fungera utan datalĂ€ckage.
Det Àr klart, jag Àr redo att vÀlja Hazelcast.
JÀmförelse
Men om vi ser pÄ det, sÄ Àr alla fem kandidater sÄ beskrivna att var och en av dem Àr den bÀsta. Hur vÀljer man? Vi kan titta pÄ vilken av dem som Àr mest populÀr, leta efter jÀmförelser, och huvudvÀrken försvinner.
Vi hittar en sÄdan , vi vÀljer vÄra 5 system.

HÀr Àr de sorterade: högst upp Redis, tvÄa Àr Hazelcast, Tarantool och Ignite vinner popularitet, EhCache förblir som det var.
Men lĂ„t oss titta pĂ„ : lĂ€nkar till webbplatser, allmĂ€n intresse för systemet, jobbannonser â fantastiskt! SĂ„, nĂ€r mitt system gĂ„r ner, kommer jag att sĂ€ga: «Nej, den Ă€r ju pĂ„litlig! HĂ€r Ă€r mĂ„nga jobb erbjudanden...». En sĂ„dan enkel jĂ€mförelse fungerar inte.
Dessa system Ă€r inte bara cachingsystem. De har mycket mer funktionalitet, inklusive â nĂ€r inte data överförs till klienten för bearbetning, utan tvĂ€rtom: koden som mĂ„ste utföras pĂ„ data flyttas till servern, dĂ€r den körs och resultatet returneras. Och som ett separat cachingsystem övervĂ€gs de inte sĂ„ ofta.
Okej, vi ger inte upp, vi ska hitta en direkt jĂ€mförelse av systemen. Vi tar de tvĂ„ bĂ€sta alternativen â Redis och Hazelcast. Vi Ă€r intresserade av hastighet, och vi ska jĂ€mföra dem efter detta kriterium.
Hz vs Redis
Vi hittar nÄgot sÄdant :

BlÄtt Àr Redis, rött Àr Hazelcast. Hazelcast vinner överallt, och detta har en förklaring: det Àr flödesbaserat, högoptimerat, varje trÄd arbetar med sin partition, sÄ det finns inga lÄs. Redis Àr flödesbaserat, frÄn moderna flerprocessorer tar det inte nÄgra vinster. Hazelcast har asynkron I/O, hos Redis-Jedis Àr socketarna blockerande. I slutÀndan anvÀnder Hazelcast ett binÀrt protokoll, medan Redis Àr textorienterat, vilket innebÀr att det Àr ineffektivt.
För sÀkerhets skull ska vi vÀnda oss till en annan kÀlla för jÀmförelse. Vad kommer den att visa oss?
Redis vs Hz
Ănnu en :

HĂ€r Ă€r det tvĂ€rtom, rött Ă€r Redis. Det innebĂ€r att Redis prestanda vinner över Hazelcast. I den första jĂ€mförelsen vann Hazelcast, i den andra â Redis. det mycket noggrant förklarat varför Hazelcast vann i den föregĂ„ende jĂ€mförelsen.
Det visar sig att resultatet frÄn den första jÀmförelsen faktiskt var manipulerat: Redis togs i sin grundlÀggande version, medan Hazelcast anpassades för testscenariot. SÄ det visar sig: för det första, ingen kan man lita pÄ, för det andra, nÀr vi ÀndÄ vÀljer ett system, mÄste vi ocksÄ konfigurera det korrekt. Dessa instÀllningar inkluderar dussintals, nÀstan hundra parametrar.
Skakar flaskan
Och hela processen som vi just har genomfört kan jag förklara med metaforen «Skakar flaskan». Det vill sÀga, just nu behöver man inte programmera, det viktigaste Àr att kunna lÀsa stackoverflow. Och jag har en professionell person i mitt team som just arbetar sÄ i kritiska stunder.
Vad gör han? Han ser en trasig grej, ser stack trace, tar nĂ„gra ord frĂ„n den (vilka exakt â det Ă€r hans expertis i programmet), söker pĂ„ Google, hittar stackoverflow bland svaren. Utan att lĂ€sa, utan att tĂ€nka, bland svaren pĂ„ frĂ„gan â vĂ€ljer han nĂ„got som liknar förslaget "gör det hĂ€r och det hĂ€r" (att vĂ€lja ett sĂ„dant svar â det Ă€r hans talang, för det Ă€r inte alltid den svar som fĂ„tt flest gilla). Han tillĂ€mpar det, tittar: om nĂ„got har förĂ€ndrats, bra. Om inget har förĂ€ndrats â vi backar. Och vi upprepar körning-kontroll-sökning. PĂ„ det intuitiva sĂ€ttet lyckas han fĂ„ koden att fungera efter ett tag. Han vet inte varför, han vet inte vad han gjorde, han kan inte förklara. Men! Den fungerar. Och "branden Ă€r slĂ€ckt". Nu gĂ„r vi igenom vad vi har gjort. NĂ€r programmet fungerar â Ă€r det mycket lĂ€ttare. Och sparar betydligt tid.
Det hÀr sÀttet förklaras mycket bra med ett exempel.
Det var en gÄng mycket populÀrt att bygga en segelbÄt i en flaska. SegelbÄten Àr stor och skör, medan flaskans hals Àr vÀldigt smal, man kan inte pressa in den. Hur ska man bygga den?

Det finns en metod som Àr vÀldigt snabb och effektiv.
BÄten bestÄr av massor av smÄdelar: pinnar, snören, segel, lim. Allt detta lÀgger vi i flaskan.
Vi tar flaskan med bÄda hÀnderna och börjar skaka. Vi skakar den och skakar. Och oftast blir det en total katastrof, sÄklart. Men ibland. Ibland blir det en bÄt! NÀrmare bestÀmt, nÄgot som liknar en bÄt.
Vi visar detta nĂ„got för nĂ„gon: "Sergej, ser du!?". Och faktiskt, pĂ„ avstĂ„nd â ser det ut som en bĂ„t. Men lĂ€ngre Ă€n sĂ„ kan man inte gĂ„.
Det finns ocksÄ ett annat sÀtt. Mer avancerade killar, sÄdana hackare, anvÀnder det.
Jag gav en sĂ„dan kille en uppgift, han gjorde allt och gick. Och man ser â det ser ut som gjort. Men efter ett tag, nĂ€r man behöver justera koden â dĂ„ börjar det hĂ€nda konstiga saker pĂ„ grund av honom⊠Tur att han redan har lyckats springa lĂ„ngt bort. Det Ă€r sĂ„dana killar som, pĂ„ exempel med flaskan, gör sĂ„: ser ni, dĂ€r botten Ă€r â glaset böjer sig. Och det Ă€r inte helt klart, Ă€r det genomskinligt eller inte. DĂ„ "hackarna" sĂ„gar av botten, sĂ€tter in bĂ„ten, sĂ€tter sedan tillbaka botten med lim, och sĂ„ ser det ut som det alltid ska vara.
Ur ett uppgiftsformuleringsperspektiv verkar allt rÀtt. Men nÀr det gÀller bÄtar: varför i hela vÀrlden skulle man ens göra denna bÄt, vem behöver den ens? Den har ingen funktionalitet. Vanligtvis Àr sÄdana bÄtar gÄvor till mycket högstÄende personer, som stÀller dem pÄ en hyllan ovanför sig, som en symbol, som ett tecken. Och om en sÄdan person, en ledare för ett stort företag eller en hög tjÀnsteman, har sÄdan vÀrdelöshet som flagga, vars hals Àr avskuren? Det Àr bÀttre att han aldrig fÄr veta det. SÄ hur gör man dessa bÄtar som kan ges till viktiga personer?
Det enda stÀllet, det enda viktiga, som man verkligen inte kan Àndra pÄ, Àr skrovet. Och skrovet pÄ bÄten gÄr just genom halsen. Men bÄten sÀtts ihop utanför flaskan. Men det Àr inte bara att sÀtta ihop en bÄt, det Àr ett riktigt hantverk. I delarna lÀggs speciella spakar till, som gör det möjligt att senare lyfta dem. Till exempel, seglen viks ihop, förs varsamt in, och sedan, med pincett, lyfts de mycket noggrant och exakt. Resultatet blir ett konstverk som man kan ge bort med gott samvete och stolthet.
Och om vi vill att projektet ska bli framgĂ„ngsrikt â mĂ„ste det finnas minst en juvelerare i teamet. Den som bryr sig om produktens kvalitet och tar hĂ€nsyn till alla aspekter, utan att offra nĂ„got, inte ens i stressiga stunder nĂ€r omstĂ€ndigheterna krĂ€ver snabba Ă„tgĂ€rder pĂ„ bekostnad av det viktiga. Alla framgĂ„ngsrika projekt som Ă€r hĂ„llbara och har stĂ„tt tidens prov bygger pĂ„ denna princip. De har nĂ„got vĂ€ldigt exakt och unikt, nĂ„got som utnyttjar alla tillgĂ€ngliga möjligheter. I exemplet med bĂ„ten i en flaska beskrivs hur skrovet pĂ„ bĂ„ten passerar genom halsen.
Ă terkommande till uppgiften att vĂ€lja vĂ„r cache-server, hur skulle denna metod kunna tillĂ€mpas? Jag föreslĂ„r ett sĂ€tt att göra urval frĂ„n alla system som finns â att inte skaka flaskan, inte vĂ€lja, utan att se vad som egentligen finns dĂ€r som man borde tĂ€nka pĂ„ nĂ€r man vĂ€ljer system.
Var ska man leta efter flaskhalsar
Vi försöker att inte skaka flaskan, inte gÄ igenom allt en och en, men vi ser vilka uppgifter som dyker upp om vi helt plötsligt, för vÄr uppgift - att designa ett sÄdant system pÄ egen hand. Vi kommer givetvis inte att bygga en cykel, utan vi ska anvÀnda detta schema för att orientera oss om vilka punkter vi ska uppmÀrksamma i produktbeskrivningarna. Vi skissar pÄ ett sÄdant schema.

Om systemet Àr distribuerat, innebÀr det att vi kommer att ha flera servrar (6). LÄt oss anta att det Àr fyra (det Àr bekvÀmt att placera i bilden, men det kan förstÄs vara hur mÄnga som helst). Om servrarna Àr pÄ olika noder, innebÀr det att det körs viss kod pÄ dem alla, som ansvarar för att dessa noder bildar ett kluster och vid avbrott - ansluter, kÀnner igen varandra.
Vi behöver ocksÄ koden-logik (2), som handlar om cachelagring. Denna kod interagerar med klienterna via ett visst API. Klientkoden (1) kan antingen vara inom samma JVM eller kontakta den över nÀtverket. Logiken som Àr implementerad internt handlar om att fatta beslut om vilka objekt som ska behÄllas i cachen och vilka som ska slÀngas. För att lagra cachen anvÀnder vi minne (3), men om det behövs kan vi ocksÄ spara delar av data pÄ disken (4).
Vi ska se var belastningen kommer att uppstÄ. Faktiskt kommer varje pil och varje nod att belastas. Först och frÀmst, mellan klientkoden och API:et, om det Àr en nÀtverksinteraktion, kan nedgÄngen vara ganska mÀrkbar. För det andra, inom sjÀlva API:et - om vi överdriver med komplicerad logik kan vi stöta pÄ CPU-problem. Det skulle vara bra om logiken inte behöver hantera minnet i onödan. Och kvarstÄr Àr interaktionen med filsystemet - i det vanliga fallet handlar det om att serialisera / ÄterstÀlla och skriva / lÀsa.
Vidare interaktion med klustret. Troligtvis kommer den att finnas i samma system, men den kan ocksÄ vara separat. HÀr mÄste man ocksÄ ta hÀnsyn till dataöverföringen till det, hastigheten för dataserialisering och interaktionen mellan klustret.
Nu, Ä ena sidan - kan vi förestÀlla oss "vilka kugghjul som kommer att snurra" i cachen-systemet vid behandling av förfrÄgningar frÄn vÄr kod, och Ä andra sidan - kan vi uppskatta hur mÄnga och vilka förfrÄgningar vÄr kod kommer att generera till detta system. Det Àr tillrÀckligt för att göra ett mer eller mindre rationellt val - att vÀlja ett system som passar vÄr anvÀndning.
Hazelcast
LÄt oss se hur vi kan tillÀmpa en sÄdan uppdelning pÄ vÄr lista. Till exempel, Hazelcast.
För att lagra/hÀmta data frÄn Hazelcast, interagerar klientkoden (1) med API:et. Hz tillÄter att kör servern som inbÀddad, och i det fallet Àr interaktionen med API:et ett metodanrop inom JVM, vilket kan anses vara kostnadsfritt.
För att logiken ska fungera i (2), förlitar sig Hz pĂ„ en hash av byte-arrayen av den serialiserade nyckeln â det vill sĂ€ga, serialiseringen av nyckeln kommer att ske oavsett. Detta Ă€r en oundviklig overhead för Hz.
Evictionsstrategierna Àr vÀl implementerade, men för speciella fall kan egna kopplas in. För denna del kan man vara lugn.
Lagringen (4) kan kopplas in. UtmĂ€rkt. Interaktionen (5) för inbĂ€ddad kan ses som omedelbar. Datautbyte mellan noder i klustret (6) â ja, det finns. Detta bidrar till motstĂ„ndskraftighet pĂ„ bekostnad av hastighet. Kostnaden kan sĂ€nkas genom Hz-funktionen Near-cache â data som erhĂ„llits frĂ„n andra noder i klustret kommer att cachas.
Vad kan man göra i sÄdana omstÀndigheter för att öka hastigheten?
Till exempel, för att undvika serialisering av nyckeln i (2) â kan man lĂ€gga till ytterligare en cache ovanpĂ„ Hazelcast, för de hetaste data. PĂ„ Sportmaster valde man för detta Ă€ndamĂ„l Caffeine.
För justeringar pÄ nivÄ (6), erbjuder Hz tvÄ typer av lagring: IMap och ReplicatedMap.

Det Àr vÀrt att nÀmna hur Hazelcast kom in i Sportmasters teknikstack.
Ă r 2012, nĂ€r vi arbetade med den första piloten av framtida webbplatsen, var det faktiskt Hazelcast som visade sig vara den första lĂ€nken sökmotorn gav. Bekantskapen inleddes 'frĂ„n första taget' â vi blev imponerade av att bara tvĂ„ timmar efter att vi kopplat in Hz i systemet â fungerade det. Och fungerade bra. Fram till slutet av dagen skrev vi nĂ„gra tester, blev glada. Och det lilla lagret av energi rĂ€ckte för att övervinna de överraskningar som Hz gav över tid. Nu har Sportmasters team inga skĂ€l att avstĂ„ frĂ„n Hazelcast.
Men sÄdana argument som 'första lÀnken i sökmotorn' och 'snabbt satte ihop HelloWorld' Àr sjÀlvklart undantag och egenskaper hos det ögonblick dÄ valet gjordes. De verkliga prövningarna för det valda systemet börjar nÀr man gÄr produktionsvÀgen, och det Àr just pÄ det hÀr steget man bör fokusera vid valet av vilket system som helst, inklusive cache. I vÄrt fall kan man sÀga att vi valde Hazelcast av en slump, men det visade sig senare att vi valde rÀtt.
För produktion Ă€r mycket viktigare: övervakning, hantering av fel pĂ„ enskilda noder, datareplication, kostnad för skalning. Det vill sĂ€ga, man bör uppmĂ€rksamma de utmaningar som kan uppstĂ„ just under systemets drift â nĂ€r belastningen tio gĂ„nger överstiger den planerade, nĂ€r vi av misstag laddar upp fel saker pĂ„ fel stĂ€llen, nĂ€r det behövs en ny version av koden rullas ut, byta data och göra detta osynligt för kunderna.
För alla dessa krav passar Hazelcast definitivt.
FortsÀttning följer
Men Hazelcast Àr ingen universallösning. à r 2017 valde vi Hazelcast för cache i adminpanelen, helt enkelt baserat pÄ tidigare positiva erfarenheter. Detta spelade en avgörande roll i ett vÀldigt intrikat skÀmt, vilket ledde till att vi hamnade i en svÄr situation och "hjÀltedÄdigt" kÀmpade oss ur den pÄ 60 dagar. Men mer om detta i nÀsta del.
Och tills dess⊠Happy New Code!
KĂ€lla: habr.com
