Hur vi pÄ Sportmaster valde ett cachingsystem. Del 1

HallÄ! Jag heter Alexey Pyankov, jag Àr utvecklare pÄ företaget Sportmaster. I den posta Jag berÀttade hur arbetet med Sportmaster-webbplatsen började 2012, vilka initiativ vi lyckades "driva igenom" och vice versa, vilken rake vi samlade in.

Idag vill jag dela tankar som följer ett annat Àmne - att vÀlja ett cachingsystem för java-backend i webbplatsens adminpanel. Den hÀr handlingen har en speciell betydelse för mig - Àven om historien utspelade sig i bara 2 mÄnader, arbetade vi under dessa 60 dagar 12-16 timmar och utan en enda ledig dag. Jag hade aldrig trott eller förestÀllt mig att det var möjligt att jobba sÄ hÄrt.

DÀrför delar jag upp texten i 2 delar för att inte ladda den helt. TvÀrtom kommer den första delen att vara vÀldigt lÀtt - förberedelse, introduktion, nÄgra funderingar om vad cachning Àr. Om du redan Àr en erfaren utvecklare eller har arbetat med cacher, frÄn den tekniska sidan kommer det med största sannolikhet inte finnas nÄgot nytt i den hÀr artikeln. Men för en junior kan en sÄ liten recension tala om för honom Ät vilket hÄll han ska titta om han befinner sig vid ett sÄdant vÀgskÀl.

Hur vi pÄ Sportmaster valde ett cachingsystem. Del 1

NĂ€r den nya versionen av Sportmaster-webbplatsen sattes i produktion togs uppgifterna emot pĂ„ ett sĂ€tt som var milt uttryckt inte sĂ€rskilt bekvĂ€mt. Grunden var tabeller förberedda för den tidigare versionen av sajten (Bitrix), som mĂ„ste dras in i ETL, föras till en ny form och berikas med olika smĂ„saker frĂ„n ett dussin fler system. För att en ny bild eller produktbeskrivning skulle dyka upp pĂ„ sajten var man tvungen att vĂ€nta till nĂ€sta dag – uppdateringar endast pĂ„ natten, en gĂ„ng om dagen.

Till en början var det sĂ„ mĂ„nga bekymmer frĂ„n de första veckorna av produktion att sĂ„dana besvĂ€r för innehĂ„llshanterare var en bagatell. Men sĂ„ fort allt ordnade sig fortsatte utvecklingen av projektet - nĂ„gra mĂ„nader senare, i början av 2015, började vi aktivt utveckla adminpanelen. Under 2015 och 2016 gĂ„r allt bra, vi slĂ€pper regelbundet, adminpanelen tĂ€cker mer och mer av dataförberedelserna, och vi förbereder oss för det faktum att snart kommer vĂ„rt team att anförtros det viktigaste och mest komplexa - produkten krets (fullstĂ€ndig förberedelse och underhĂ„ll av data pĂ„ alla produkter). Men sommaren 2017, strax före lanseringen av rĂ„varukretsen, kommer projektet att hamna i en mycket svĂ„r situation – just pĂ„ grund av problem med cachning. Jag vill prata om det hĂ€r avsnittet i den andra delen av denna tvĂ„delade publikation.

Men i det hÀr inlÀgget kommer jag att börja pÄ lÄngt hÄll, jag kommer att presentera nÄgra tankar - idéer om cachning, vilket skulle vara ett bra steg att scrolla igenom inför ett stort projekt.

NÀr en cachningsuppgift intrÀffar

Cachningsuppgiften visas inte bara. Vi Àr utvecklare, skriver en mjukvaruprodukt och vill att den ska vara efterfrÄgad. Om produkten Àr efterfrÄgad och framgÄngsrik kommer anvÀndare. Och fler och fler kommer. Och sÄ Àr det mÄnga anvÀndare och dÄ blir produkten högt laddad.

I de första stegen tĂ€nker vi inte pĂ„ optimering och kodprestanda. Huvudsaken Ă€r funktionalitet, att snabbt rulla ut en pilot och testa hypoteser. Och om belastningen ökar pumpar vi upp jĂ€rnet. Vi ökar den tvĂ„ eller tre gĂ„nger, fem gĂ„nger, kanske 10 gĂ„nger. NĂ„gonstans hĂ€r – ekonomin tillĂ„ter det inte lĂ€ngre. Hur mĂ„nga gĂ„nger kommer antalet anvĂ€ndare att öka? Det blir inte som 2-5-10, men om det lyckas blir det frĂ„n 100-1000 till 100 tusen gĂ„nger. Det vill sĂ€ga, förr eller senare mĂ„ste du göra optimering.

LÄt oss sÀga att en del av koden (lÄt oss kalla den hÀr delen en funktion) tar anstÀndigt lÄng tid, och vi vill minska exekveringstiden. En funktion kan vara tillgÄng till en databas, eller sÄ kan det vara exekvering av nÄgon komplex logik - huvudsaken Àr att den tar lÄng tid att exekvera. Hur mycket kan du minska utförandetiden? I grÀnsen kan du minska den till noll, inte lÀngre. Hur kan du minska exekveringstiden till noll? Svar: eliminera exekveringen helt och hÄllet. Returnera istÀllet resultatet omedelbart. Hur kan du ta reda pÄ resultatet? Svar: antingen rÀkna ut det eller leta nÄgonstans. Det tar lÄng tid att rÀkna ut. Och att spionera Àr till exempel att komma ihÄg resultatet som funktionen gav senast nÀr den anropades med samma parametrar.

Det vill sÀga implementeringen av funktionen Àr inte viktig för oss. Det rÀcker bara att veta vilka parametrar resultatet beror pÄ. Sedan, om parametervÀrdena representeras i form av ett objekt som kan anvÀndas som en nyckel i nÄgon lagring, kan resultatet av berÀkningen sparas och lÀsas ut nÀsta gÄng det öppnas. Om denna skrivning och lÀsning av resultatet gÄr snabbare Àn att exekvera funktionen har vi en vinst i form av hastighet. VinstmÀngden kan nÄ 100, 1000 och 100 tusen gÄnger (10^5 Àr snarare ett undantag, men i fallet med en ganska efterslÀpande bas Àr det fullt möjligt).

Grundkrav för ett cachningssystem

Det första som kan bli ett krav för ett cachningssystem Àr snabb lÀshastighet och i nÄgot mindre utstrÀckning skrivhastighet. Detta Àr sant, men bara tills vi rullar ut systemet till produktion.

LÄt oss spela det hÀr fallet.

LÄt oss sÀga att vi har försett den nuvarande belastningen med hÄrdvara och nu gradvis introducerar cachning. Antalet anvÀndare vÀxer lite, belastningen vÀxer - vi lÀgger till lite cacher, skruvar in hÀr och dÀr. Detta fortsÀtter ett tag, och nu kallas tunga funktioner praktiskt taget inte lÀngre - hela huvudbelastningen faller pÄ cachen. Antalet anvÀndare under denna tid har ökat N gÄnger.

Och om det initiala utbudet av hĂ„rdvara kunde vara 2-5 gĂ„nger, sĂ„ skulle vi med hjĂ€lp av cachen kunna förbĂ€ttra prestandan med en faktor 10 eller, i ett bra fall, med en faktor 100, pĂ„ vissa stĂ€llen kanske med en faktor pĂ„ 1000. Det vill sĂ€ga pĂ„ samma hĂ„rdvara – vi behandlar 100 gĂ„nger fler förfrĂ„gningar. JĂ€ttebra, du förtjĂ€nar pepparkakan!

Men nu, vid ett vackert ögonblick, av en slump kraschade systemet och cachen kollapsade. Inget speciellt - trots allt valdes cachen baserat pÄ kravet "hög lÀs- och skrivhastighet, resten spelar ingen roll."

I förhÄllande till startbelastningen var vÄr jÀrnreserv 2-5 gÄnger, och belastningen ökade under denna tid 10-100 gÄnger. Med hjÀlp av cachen eliminerade vi anrop för tunga funktioner och dÀrför fungerade allt. Och nu, utan cache, hur mÄnga gÄnger kommer vÄrt system att sakta ner? Vad kommer att hÀnda med oss? Systemet kommer att falla.

Även om vĂ„r cache inte kraschade, utan bara rensades ett tag, kommer den att behöva vĂ€rmas upp, och det kommer att ta lite tid. Och under denna tid kommer huvudbördan att falla pĂ„ funktionalitet.

Slutsats: högt belastade produktionsprojekt krÀver att ett cachningssystem inte bara har höga lÀs- och skrivhastigheter, utan ocksÄ för att sÀkerstÀlla datasÀkerhet och motstÄndskraft mot fel.

Valets vÄnda

I ett projekt med en adminpanel gick valet sÄ hÀr: först installerade vi Hazelcast, eftersom Vi var redan bekanta med den hÀr produkten frÄn erfarenheten frÄn huvudsidan. Men hÀr visade sig detta val vara misslyckat - under vÄr belastningsprofil Àr Hazelcast inte bara lÄngsam, utan fruktansvÀrt lÄngsam. Och vid den tiden hade vi redan anmÀlt oss till releasedatumet.

Spoiler: hur exakt omstĂ€ndigheterna utvecklades att vi missade en sĂ„ stor grej och hamnade i en akut och spĂ€nd situation – jag ska berĂ€tta i andra delen – och hur vi hamnade och hur vi tog oss ur. Men nu - jag ska bara sĂ€ga att det var mycket stress, och "att tĂ€nka - pĂ„ nĂ„got sĂ€tt kan jag inte tĂ€nka, vi skakar flaskan." "Shaking the bottle" Ă€r ocksĂ„ en spoiler, mer om det senare.

Vad vi gjorde:

  1. Vi gör en lista över alla system som Google och StackOverflow föreslÄr. Lite över 30
  2. Vi skriver tester med en belastning typisk för produktion. För att göra detta spelade vi in ​​data som passerar genom systemet i en produktionsmiljö - ett slags sniffer för data inte pĂ„ nĂ€tverket, utan inne i systemet. Exakt dessa data anvĂ€ndes i testerna.
  3. Med hela teamet vĂ€ljer alla nĂ€sta system frĂ„n listan, konfigurerar det och kör tester. Den klarar inte testet, den bĂ€r inte lasten – vi kastar den och gĂ„r vidare till nĂ€sta i raden.
  4. PÄ det 17:e systemet stod det klart att allt var hopplöst. Sluta skaka flaskan, det Àr dags att tÀnka pÄ allvar.

Men det hÀr Àr ett alternativ nÀr du behöver vÀlja ett system som kommer att "ta sig igenom hastigheten" i förberedda tester. TÀnk om det inte finns nÄgra sÄdana test Àn och du vill vÀlja snabbt?

LÄt oss modellera detta alternativ (det Àr svÄrt att förestÀlla sig att en medelhög utvecklare lever i ett vakuum och vid tidpunkten för urvalet Ànnu inte har formaliserat sin preferens om vilken produkt som ska testas först - dÀrför Àr ytterligare resonemang mer av en teoretiker/filosofi/ ungefÀr en junior).

Efter att ha beslutat om kraven, lÄt oss börja vÀlja en lösning direkt. Varför uppfinna hjulet pÄ nytt: vi gÄr och tar ett fÀrdigt cachingsystem.

Om du precis har börjat och googla, ge eller ta bestÀllningen, men generellt sett kommer riktlinjerna att vara sÄ hÀr. Först och frÀmst kommer du att stöta pÄ Redis, det hörs överallt. DÄ fÄr du reda pÄ att EhCache Àr det Àldsta och mest beprövade systemet. DÀrefter kommer vi att skriva om Tarantool, en inhemsk utveckling som har en unik aspekt av lösningen. Och Àven Ignite, eftersom det nu ökar i popularitet och Ätnjuter stöd frÄn SberTech. I slutet finns ocksÄ Hazelcast, för i företagsvÀrlden dyker det ofta upp bland stora företag.

Listan Àr inte uttömmande, det finns dussintals system. Och vi ska bara skruva pÄ en sak. LÄt oss ta de utvalda 5 systemen för "skönhetstÀvlingen" och göra ett urval. Vem blir vinnaren?

Redis

Vi lÀser vad de skriver pÄ den officiella hemsidan.
Redis - opensource-projekt. Erbjuder datalagring i minnet, möjlighet att spara pÄ disk, automatisk partitionering, hög tillgÀnglighet och ÄterstÀllning frÄn nÀtverksavbrott.

Det verkar som att allt Àr bra, du kan ta det och skruva pÄ det - allt du behöver, det gör det. Men bara för skojs skull, lÄt oss titta pÄ de andra kandidaterna.

EhCache

EhCache - "den mest anvĂ€nda cachen för Java" (översĂ€ttning av sloganen frĂ„n den officiella webbplatsen). Även öppen kĂ€llkod. Och dĂ„ förstĂ„r vi att Redis inte Ă€r för java, utan generellt, och för att interagera med det behöver du ett omslag. Och EhCache kommer att vara bekvĂ€mare. Vad mer lovar systemet? Tillförlitlighet, beprövad, full funktionalitet. Tja, det Ă€r ocksĂ„ det vanligaste. Och cachar terabyte med data.

Redis Àr bortglömd, jag Àr redo att vÀlja EhCache.

Men en kÀnsla av patriotism driver mig att se vad som Àr bra med Tarantool.

Tarantool

Tarantool - uppfyller beteckningen "Realtidsdataintegrationsplattform". Det lĂ„ter vĂ€ldigt komplicerat, sĂ„ vi lĂ€ser sidan i detalj och hittar ett högt uttalande: "Cachelagrar 100 % av datan i RAM." Detta borde vĂ€cka frĂ„gor – trots allt kan det finnas mycket mer data Ă€n minne. Förklaringen Ă€r att det betyder att Tarantool inte kör serialisering för att skriva data till disk frĂ„n minnet. IstĂ€llet anvĂ€nder den lĂ„gnivĂ„funktioner i systemet, nĂ€r minnet helt enkelt mappas till ett filsystem med mycket bra I/O-prestanda. I allmĂ€nhet gjorde de nĂ„got underbart och coolt.

LÄt oss titta pÄ implementeringarna: Mail.ru corporate highway, Avito, Beeline, Megafon, Alfa-Bank, Gazprom...

Om det fortfarande fanns nÄgra tvivel om Tarantool, sÄ avslutar implementeringsfallet pÄ Mastercard mig. Jag tar Tarantool.

Men Ă€ndÄ 

TĂ€nd


 finns det nĂ„gra fler TĂ€nd, faktureras som en "in-memory computing platform...in-memory speeds on petabyte of data." Det finns ocksĂ„ mĂ„nga fördelar hĂ€r: distribuerad cache i minnet, den snabbaste nyckel-vĂ€rdelagringen och cachen, horisontell skalning, hög tillgĂ€nglighet, strikt integritet. I allmĂ€nhet visar det sig att snabbast Ă€r Ignite.

Implementeringar: Sberbank, American Airlines, Yahoo! Japan. Och sÄ fÄr jag reda pÄ att Ignite inte bara Àr implementerat i Sberbank, utan SberTech-teamet skickar sina medarbetare till sjÀlva Ignite-teamet för att förfina produkten. Det hÀr Àr helt fÀngslande och jag Àr redo att ta Ignite.

Det Àr helt oklart varför, jag tittar pÄ den femte punkten.

Hasselcast

Jag gÄr till sidan Hasselcast, lÀsa. Och det visar sig att den snabbaste lösningen för distribuerad caching Àr Hazelcast. Det Àr storleksordningar snabbare Àn alla andra lösningar och i allmÀnhet Àr det ledande inom omrÄdet för in-memory data grid. Mot denna bakgrund Àr att ta nÄgot annat inte att respektera sig sjÀlv. Den anvÀnder ocksÄ redundant datalagring för kontinuerlig drift av klustret utan dataförlust.

Det var allt, jag Àr redo att ta Hazelcast.

jÀmförelse

Men om man tittar sÄ beskrivs alla fem kandidaterna pÄ ett sÄdant sÀtt att var och en av dem Àr bÀst. Hur ska man vÀlja? Vi kan se vilken som Àr mest populÀr, leta efter jÀmförelser och huvudvÀrken försvinner.

Vi hittar en sÄdan hÀr översikt, vÀlj vÄra 5 system.

Hur vi pÄ Sportmaster valde ett cachingsystem. Del 1

HÀr Àr de sorterade: Redis ligger i topp, Hazelcast ligger pÄ andra plats, Tarantool och Ignite vinner popularitet, EhCache har varit och förblir densamma.

Men lÄt oss titta pÄ berÀkningsmetod: lÀnkar till hemsidor, allmÀnt intresse för systemet, jobberbjudanden - bra! Det vill sÀga, nÀr mitt system misslyckas, kommer jag att sÀga: "Nej, det Àr pÄlitligt! Det finns mÄnga jobberbjudanden..." En sÄdan enkel jÀmförelse rÀcker inte.

Alla dessa system Àr inte bara cachningssystem. De har ocksÄ en hel del funktionalitet, bland annat nÀr data inte pumpas till klienten för bearbetning, men vice versa: koden som behöver exekveras pÄ datan flyttas till servern, exekveras dÀr och resultatet returneras. Och de betraktas inte sÄ ofta som ett separat system för cachning.

Okej, lÄt oss inte ge upp, lÄt oss hitta en direkt jÀmförelse av systemen. LÄt oss ta de tvÄ översta alternativen - Redis och Hazelcast. Vi Àr intresserade av hastighet, och vi kommer att jÀmföra dem baserat pÄ denna parameter.

Hz vs Redis

Vi hittar detta jÀmförelse:
Hur vi pÄ Sportmaster valde ett cachingsystem. Del 1

BlÄtt Àr Redis, rött Àr Hazelcast. Hazelcast vinner överallt, och det finns ett skÀl till detta: den Àr flertrÄdad, mycket optimerad, varje trÄd fungerar med sin egen partition, sÄ det finns ingen blockering. Och Redis Àr entrÄdig, den drar inte nytta av moderna flerkÀrniga processorer. Hazelcast har asynkron I/O, Redis-Jedis har blockerande uttag. NÀr allt kommer omkring anvÀnder Hazelcast ett binÀrt protokoll, och Redis Àr textcentrerad, vilket betyder att det Àr ineffektivt.

För sÀkerhets skull, lÄt oss vÀnda oss till en annan kÀlla för jÀmförelse. Vad kommer han att visa oss?

Redis vs Hz

annan jÀmförelse:
Hur vi pÄ Sportmaster valde ett cachingsystem. Del 1

HÀr Àr tvÀrtom Redis rött. Det vill sÀga att Redis övertrÀffar Hazelcast nÀr det gÀller prestanda. Hazelcast vann den första jÀmförelsen, Redis vann den andra. Precis hÀr förklarade mycket exakt varför Hazelcast vann den tidigare jÀmförelsen.

Det visar sig att resultatet av den första faktiskt var riggat: Redis togs i baslÄdan och Hazelcast skrÀddarsyddes för ett testfall. Sedan visar det sig: för det första kan vi inte lita pÄ nÄgon, och för det andra, nÀr vi Àntligen vÀljer ett system, mÄste vi fortfarande konfigurera det korrekt. Dessa instÀllningar inkluderar dussintals, nÀstan hundratals parametrar.

Skakar flaskan

Och jag kan förklara hela processen som vi nu har gjort med följande metafor: "Skaka flaskan." Det vill sÀga, nu behöver du inte programmera, nu Àr det viktigaste att kunna lÀsa stackoverflow. Och jag har en person i mitt team, ett proffs, som arbetar precis sÄ hÀr i kritiska ögonblick.

Vad gör han? Han ser en trasig sak, ser ett stackspÄr, tar nÄgra ord frÄn det (vilka À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 mest liknar meningen "gör det och det" (att vÀlja ett sÄdant svar Àr hans talang, eftersom det inte alltid Àr svaret som fick flest likes), gÀller , utseende: om nÄgot har förÀndrats, sÄ bra. Om det inte har Àndrats, rulla tillbaka det. Och upprepa start-kontroll-sökning. Och pÄ detta intuitiva sÀtt ser han till att koden fungerar efter en tid. Han vet inte varför, han vet inte vad han gjorde, han kan inte förklara. Men! Denna infektion fungerar. Och "branden Àr slÀckt". Nu ska vi ta reda pÄ vad vi gjorde. NÀr programmet fungerar Àr det en storleksordning lÀttare. Och det sparar mycket tid.

Denna metod förklaras mycket vÀl med detta exempel.

Det var en gÄng vÀldigt populÀrt att samla en segelbÄt pÄ flaska. Samtidigt Àr segelbÄten stor och ömtÄlig, och flaskans hals Àr vÀldigt smal, det Àr omöjligt att trycka in den. Hur sÀtter man ihop det?

Hur vi pÄ Sportmaster valde ett cachingsystem. Del 1

Det finns en sÄdan metod, mycket snabb och mycket effektiv.

Skeppet bestÄr av en massa smÄsaker: pinnar, rep, segel, lim. Vi lÀgger allt detta i en flaska.
Vi tar flaskan med bÄda hÀnderna och börjar skaka. Vi skakar och skakar henne. Och oftast visar det sig vara komplett skrÀp förstÄs. Men ibland. Ibland visar det sig vara ett skepp! NÀrmare bestÀmt nÄgot som liknar ett fartyg.

Vi visar det hÀr nÄgot för nÄgon: "Seryoga, ser du!?" Och faktiskt, pÄ lÄngt hÄll ser det ut som ett skepp. Men detta kan inte tillÄtas fortsÀtta.

Det finns ett annat sÀtt. De anvÀnds av mer avancerade killar, som hackare.

Jag gav den hÀr killen en uppgift, han gjorde allt och gick. Och du ser - det ser ut som det Àr gjort. Och efter ett tag, nÀr koden mÄste slutföras, börjar detta pÄ grund av honom... Det Àr bra att han redan har lyckats springa lÄngt bort. Det hÀr Àr killarna som, med exemplet med en flaska, kommer att göra detta: du ser, var botten Àr, böjs glaset. Och det Àr inte helt klart om det Àr transparent eller inte. Sedan skÀr "hackerna" av den hÀr botten, sÀtter in ett skepp dÀr, limma sedan fast botten igen, och det Àr som om det Àr sÄ det ska vara.

Ur synvinkeln att stÀlla in problemet verkar allt vara korrekt. Men med fartyg som exempel: varför göra det hÀr fartyget överhuvudtaget, vem behöver det egentligen? Det ger ingen funktionalitet. Vanligtvis Àr sÄdana fartyg gÄvor till mycket högt uppsatta personer, som lÀgger det pÄ en hylla ovanför dem, som nÄgon form av symbol, som ett tecken. Och om en sÄdan person, chef för ett stort företag eller en högt uppsatt tjÀnsteman, hur kommer flaggan att stÄ för ett sÄdant hack, vars hals Àr avskuren? Det vore bÀttre om han aldrig visste om det. SÄ, hur gör de dessa fartyg som kan ges till en viktig person?

Den enda nyckelplatsen som du egentligen inte kan göra nĂ„got Ă„t ​​Àr kroppen. Och fartygets skrov passar rakt in i halsen. Medan skeppet Ă€r monterat utanför flaskan. Men det Ă€r inte bara att montera ett skepp, det Ă€r ett riktigt smyckeshantverk. Speciella spakar lĂ€ggs till komponenterna som sedan gör att de kan lyftas. Till exempel viks seglen, förs försiktigt in, och sedan, med hjĂ€lp av pincett, dras och höjs de mycket exakt, med precision. Resultatet Ă€r ett konstverk som kan begĂ„vas med gott samvete och stolthet.

Och om vi vill att projektet ska bli framgÄngsrikt mÄste det finnas minst en juvelerare i laget. NÄgon som bryr sig om produktens kvalitet och tar hÀnsyn till alla aspekter, utan att offra nÄgot, Àven i stunder av stress, nÀr omstÀndigheterna krÀver att man gör det brÄdskande pÄ bekostnad av det viktiga. Alla framgÄngsrika projekt som Àr hÄllbara, som har bestÄtt tidens tand, bygger pÄ denna princip. Det Àr nÄgot vÀldigt exakt och unikt med dem, nÄgot som utnyttjar alla tillgÀngliga möjligheter. I exemplet med skeppet i flaskan spelas det upp att skeppets skrov passerar genom halsen.

För att ÄtergÄ till uppgiften att vÀlja vÄr cachingserver, hur kan denna metod tillÀmpas? Jag erbjuder det hÀr alternativet att vÀlja bland alla system som finns - skaka inte flaskan, vÀlj inte, utan titta pÄ vad de har i princip, vad du ska titta efter nÀr du vÀljer ett system.

Var man ska leta efter flaskhals

LÄt oss försöka att inte skaka flaskan, inte gÄ igenom allt som finns dÀr en efter en, men lÄt oss se vilka problem som kommer att uppstÄ om vi plötsligt, för vÄr uppgift, designar ett sÄdant system sjÀlva. Naturligtvis kommer vi inte att montera cykeln, men vi kommer att anvÀnda det hÀr diagrammet för att hjÀlpa oss att ta reda pÄ vilka punkter vi ska vara uppmÀrksamma pÄ i produktbeskrivningarna. LÄt oss skissera ett sÄdant diagram.

Hur vi pÄ Sportmaster valde ett cachingsystem. Del 1

Om systemet Àr distribuerat kommer vi att ha flera servrar (6). LÄt oss sÀga att det finns fyra (det Àr bekvÀmt att placera dem pÄ bilden, men det kan naturligtvis vara sÄ mÄnga som du vill). Om servrarna finns pÄ olika noder betyder det att de alla kör nÄgon kod som ansvarar för att dessa noder bildar ett kluster och i hÀndelse av ett avbrott ansluter och kÀnner igen varandra.

Vi behöver ocksÄ kodlogik (2), som egentligen handlar om cachning. Klienter interagerar med den hÀr koden via nÄgot API. Klientkod (1) kan antingen finnas inom samma JVM eller komma Ät den över nÀtverket. Logiken som implementeras inuti Àr beslutet om vilka objekt som ska lÀmnas i cachen och vilka som ska kastas ut. Vi anvÀnder minne (3) för att lagra cachen, men vid behov kan vi spara en del av datan pÄ disk (4).

LÄt oss se i vilka delar belastningen kommer att ske. Faktiskt kommer varje pil och varje nod att laddas. För det första, mellan klientkoden och api:n, om detta Àr nÀtverkskommunikation, kan sÀttningen vara ganska mÀrkbar. För det andra, inom ramen för sjÀlva api:n - om vi överdriver det med komplex logik kan vi stöta pÄ problem med CPU:n. Och det skulle vara trevligt om logiken inte slösade tid pÄ minnet. Och det ÄterstÄr interaktion med filsystemet - i den vanliga versionen Àr detta serialisera / ÄterstÀlla och skriva / lÀsa.

NÀsta Àr interaktion med klustret. Troligtvis kommer det att vara i samma system, men det kan vara separat. HÀr mÄste du ocksÄ ta hÀnsyn till överföringen av data till den, hastigheten för dataserialisering och interaktioner mellan klustret.

Nu kan vi Ä ena sidan förestÀlla oss "vilka vÀxlar kommer att vÀnda" i cachesystemet nÀr vi behandlar förfrÄgningar frÄn vÄr kod, och Ä andra sidan kan vi uppskatta vilka och hur mÄnga förfrÄgningar vÄr kod kommer att generera för detta system. Detta rÀcker för att göra ett mer eller mindre sobert val - att vÀlja ett system för vÄrt anvÀndningsfall.

Hasselcast

LÄt oss se hur man tillÀmpar denna nedbrytning pÄ vÄr lista. Till exempel Hazelcast.

För att lÀgga/ta data frÄn Hazelcast kommer klientkoden Ät (1) api. Hz lÄter dig köra servern som inbÀddad, och i det hÀr fallet Àr Ätkomst till api:n ett metodanrop inuti JVM, vilket kan anses vara gratis.

För att logiken i (2) ska fungera, förlitar sig Hz pÄ hashen för byte-arrayen för den serialiserade nyckeln - det vill sÀga, nyckeln kommer att serialiseras i alla fall. Detta Àr oundvikligt overhead för Hz.
VrÀkningsstrategier implementeras vÀl, men för speciella fall kan du lÀgga till egna. Du behöver inte oroa dig för den hÀr delen.

FörrÄd (4) kan anslutas. Bra. Interaktion (5) för inbÀddad kan betraktas som omedelbar. Datautbyte mellan noder i klustret (6) - ja, det finns. Detta Àr en investering i feltolerans pÄ bekostnad av hastighet. Hz-funktionen Near-cache lÄter dig sÀnka priset - data som tas emot frÄn andra noder i klustret kommer att cachelagras.

Vad kan man göra under sÄdana förhÄllanden för att öka hastigheten?

Till exempel, för att undvika serialisering av nyckeln i (2) - bifoga en annan cache ovanpÄ Hazelcast, för de hetaste data. Sportmaster valde koffein för detta ÀndamÄl.

För vridning pÄ nivÄ (6) erbjuder Hz tvÄ typer av lagring: IMap och ReplicatedMap.
Hur vi pÄ Sportmaster valde ett cachingsystem. Del 1

Det Àr vÀrt att nÀmna hur Hazelcast hamnade i Sportmaster-teknologistacken.

2012, nÀr vi arbetade med den allra första piloten av den framtida sajten, var det Hazelcast som visade sig vara den första lÀnken som sökmotorn returnerade. Bekantskapen började "första gÄngen" - vi hÀnfördes av det faktum att bara tvÄ timmar senare, nÀr vi skruvade in Hz i systemet, fungerade det. Och det fungerade bra. Vid slutet av dagen hade vi genomfört ett antal tester och var nöjda. Och denna kraftreserve rÀckte för att övervinna överraskningarna som Hz slÀngde upp med tiden. Nu har Sportmaster-teamet ingen anledning att överge Hazelcast.

Men sÄdana argument som "den första lÀnken i sökmotorn" och "HelloWorld var snabbt sammansatt" Àr naturligtvis ett undantag och ett inslag i det ögonblick dÄ valet Àgde rum. De riktiga testerna för det valda systemet börjar med lanseringen i produktion, och det Àr i detta skede du bör vara uppmÀrksam nÀr du vÀljer vilket system som helst, inklusive cache. Egentligen kan vi i vÄrt fall sÀga att vi valde Hazelcast av en slump, men sÄ visade det sig att vi valde rÀtt.

För produktion, mycket viktigare: övervakning, hantering av fel pÄ enskilda noder, datareplikering, kostnad för skalning. Det vill sÀga, det Àr vÀrt att uppmÀrksamma de uppgifter som kommer att uppstÄ under underhÄllet av systemet - nÀr belastningen Àr tiotals gÄnger högre Àn planerat, nÀr vi av misstag laddar upp nÄgot pÄ fel plats, nÀr vi behöver rulla ut en ny version av koden, ersÀtt data och gör det obemÀrkt för kunderna.

För alla dessa krav passar Hazelcast verkligen rÀkningen.

FortsÀttning följer

Men Hazelcast Àr inget universalmedel. Under 2017 valde vi Hazelcast för admin-cachen, helt enkelt baserat pÄ goda intryck frÄn tidigare erfarenheter. Detta spelade en nyckelroll i ett mycket grymt skÀmt, pÄ grund av vilket vi befann oss i en svÄr situation och "heroiskt" kom oss ur det i 60 dagar. Men mer om det i nÀsta del.

Under tiden... Glad ny kod!

KĂ€lla: will.com

LĂ€gg en kommentar