{"id":73949,"date":"2020-03-13T02:42:07","date_gmt":"2020-03-12T23:42:07","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/kak-my-v-sportmastere-vybirali-sistemu-keshirovaniya-chast-1"},"modified":"2020-03-13T02:42:07","modified_gmt":"2020-03-12T23:42:07","slug":"kak-my-v-sportmastere-vybirali-sistemu-keshirovaniya-chast-1","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/kak-my-v-sportmastere-vybirali-sistemu-keshirovaniya-chast-1","title":{"rendered":"Jak wybierali\u015bmy system cache w Sportmasterze. Cz\u0119\u015b\u0107 1","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Cze\u015b\u0107! Nazywam si\u0119 Aleksiej Pjanow, jestem programist\u0105 w firmie Sportmaster. W tym <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/485088\/\">po\u015bcie<\/a><\/noindex> opowiem, jak zacz\u0119\u0142a si\u0119 praca nad stron\u0105 Sportmastera w 2012 roku, jakie inicjatywy uda\u0142o si\u0119 \"przepchn\u0105\u0107\", a jakie problemy napotkali\u015bmy.<\/p>\n<p>Dzi\u015b chc\u0119 podzieli\u0107 si\u0119 my\u015blami, kt\u00f3re wynikaj\u0105 z innego tematu \u2013 wyb\u00f3r systemu cache dla backendu java w panelu administracyjnym strony. Ten temat ma dla mnie szczeg\u00f3lne znaczenie \u2013 cho\u0107 historia rozwija\u0142a si\u0119 tylko przez 2 miesi\u0105ce, to w ci\u0105gu tych 60 dni pracowali\u015bmy po 12-16 godzin bez ani jednego dnia wolnego. Nigdy wcze\u015bniej nie my\u015bla\u0142em i nie wyobra\u017ca\u0142em sobie, \u017ce mo\u017cna tak du\u017co pracowa\u0107.<\/p>\n<p>Dlatego tekst dziel\u0119 na 2 cz\u0119\u015bci, aby nie przeci\u0105\u017cy\u0107 odbiorcy. Przeciwnie, pierwsza cz\u0119\u015b\u0107 b\u0119dzie bardzo lekka \u2014 wprowadzeniem, kilkoma przemy\u015bleniami, czym jest cache. Je\u015bli jeste\u015b ju\u017c do\u015bwiadczonym programist\u0105 lub pracowa\u0142e\u015b z cache, to z technicznego punktu widzenia w tym artykule prawdopodobnie nie znajdziesz nic nowego. Natomiast dla juniora to kr\u00f3tka przegl\u0105d mo\u017ce zasugerowa\u0107, w kt\u00f3r\u0105 stron\u0119 warto spojrze\u0107, gdy stanie na takim rozdro\u017cu.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/490912\/\"><img decoding=\"async\" alt=\"Jak wybierali\u015bmy system cache w Sportmasterze. Cz\u0119\u015b\u0107 1\" src=\"\/wp-content\/uploads\/2020\/03\/634b7420b86d65bd5175536a1cb39078.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nGdy nowa wersja strony Sportmaster zosta\u0142a uruchomiona w produkcji, dane by\u0142y pozyskiwane w spos\u00f3b, delikatnie m\u00f3wi\u0105c, niewygodny. Podstaw\u0105 by\u0142y tabele przygotowane dla poprzedniej wersji strony (Bitrix), kt\u00f3re trzeba by\u0142o za\u0142adowa\u0107 do ETL, przekszta\u0142ci\u0107 do nowej formy i wzbogaci\u0107 r\u00f3\u017cnymi elementami z jeszcze dziesi\u0119ciu system\u00f3w. Aby nowy obrazek lub opis produktu znalaz\u0142y si\u0119 na stronie, trzeba by\u0142o czeka\u0107 do nast\u0119pnego dnia \u2014 aktualizacja tylko w nocy, raz dziennie.<\/p>\n<p>Na pocz\u0105tku by\u0142o tak wiele zmartwie\u0144 w pierwszych tygodniach po premierze, \u017ce problemy z obs\u0142ug\u0105 tre\u015bci by\u0142y drobnostk\u0105. Jednak gdy wszystko si\u0119 ustabilizowa\u0142o, rozw\u00f3j projektu poszed\u0142 do przodu \u2014 po kilku miesi\u0105cach, na pocz\u0105tku 2015 roku zacz\u0119li\u015bmy intensywnie rozwija\u0107 panel administracyjny. W latach 2015 i 2016 wszystko sz\u0142o dobrze, regularnie wydawali\u015bmy aktualizacje, panel admina obejmowa\u0142 coraz wi\u0119ksz\u0105 cz\u0119\u015b\u0107 przygotowania danych, a my przygotowywali\u015bmy si\u0119 na to, \u017ce wkr\u00f3tce nasz zesp\u00f3\u0142 dostanie do zaufania najwa\u017cniejszy i najtrudniejszy element \u2013 obr\u00f3t towarami (pe\u0142ne przygotowanie i zarz\u0105dzanie danymi wszystkich produkt\u00f3w). Ale latem 2017 roku, tu\u017c przed uruchomieniem obrotu towarami, projekt znalaz\u0142 si\u0119 w bardzo trudnej sytuacji \u2013 w\u0142a\u015bnie z powodu problem\u00f3w z buforowaniem. O tym epizodzie chc\u0119 opowiedzie\u0107 w drugiej cz\u0119\u015bci tej dwucz\u0119\u015bciowej publikacji.<\/p>\n<p>Ale w tym po\u015bcie zaczn\u0119 od pocz\u0105tku, podsumuj\u0119 niekt\u00f3re my\u015bli \u2013 wyobra\u017cenia o buforowaniu, kt\u00f3re przemy\u015blenie przed du\u017cym projektem by\u0142oby dobrym krokiem.<\/p>\n<h2>Kiedy pojawia si\u0119 zadanie buforowania<\/h2>\n<p>\nZadanie buforowania nie pojawia si\u0119 ot tak. Jeste\u015bmy programistami, piszemy produkty oprogramowania i chcemy, aby by\u0142y po\u017c\u0105dane. Je\u015bli produkt jest po\u017c\u0105dany i odnosi sukces \u2014 u\u017cytkownicy przybywaj\u0105. A przybywaj\u0105, i jeszcze przybywaj\u0105. I oto mamy bardzo wielu u\u017cytkownik\u00f3w, a produkt staje si\u0119 wysoko obci\u0105\u017cony.<\/p>\n<p>Na pocz\u0105tkowych etapach nie my\u015blimy o optymalizacji i wydajno\u015bci kodu. Najwa\u017cniejsza jest funkcjonalno\u015b\u0107, szybko wdra\u017camy wer\u00adsy pilota\u017cowe i testujemy hipotezy. A je\u015bli obci\u0105\u017cenie ro\u015bnie \u2013 podkr\u0119camy sprz\u0119t. Zwi\u0119kszamy go razy dwa, trzy, pi\u0119\u0107, powiedzmy dziesi\u0119\u0107. Tutaj finanse przestaj\u0105 pozwala\u0107. A o ile wzro\u015bnie liczba u\u017cytkownik\u00f3w? To ju\u017c nie b\u0119d\u0105 2-5-10, ale w przypadku sukcesu \u2013 to b\u0119dzie od 100-1000 a\u017c do 100 tysi\u0119cy razy. Tak wi\u0119c pr\u0119dzej czy p\u00f3\u017aniej, ale zajmie si\u0119 tym optymalizacj\u0105.<\/p>\n<p>Za\u0142\u00f3\u017cmy, \u017ce jaka\u015b cz\u0119\u015b\u0107 kodu (nazwijmy t\u0119 cz\u0119\u015b\u0107 funkcj\u0105) dzia\u0142a wyj\u0105tkowo d\u0142ugo, a my chcemy skr\u00f3ci\u0107 czas wykonania. Funkcja \u2013 to mo\u017ce by\u0107 dost\u0119p do bazy danych lub wykonanie jakiej\u015b skomplikowanej logiki \u2013 g\u0142\u00f3wnie to, co trwa d\u0142ugo. O ile mo\u017cna skr\u00f3ci\u0107 czas wykonania? Teoretycznie mo\u017cna to skr\u00f3ci\u0107 do zera, ale nie dalej. A jak mo\u017cna skr\u00f3ci\u0107 czas wykonania do zera? Odpowied\u017a: ca\u0142kowicie wykluczy\u0107 wykonanie. Zamiast tego \u2013 od razu zwr\u00f3ci\u0107 wynik. A jak pozna\u0107 wynik? Odpowied\u017a: albo obliczy\u0107, albo gdzie\u015b podejrze\u0107. Obliczenie \u2014 to d\u0142ugo trwa. A podejrzenie \u2014 to na przyk\u0142ad zapami\u0119tanie wyniku, kt\u00f3ry funkcja zwr\u00f3ci\u0142a poprzednio przy takich samych parametrach.<\/p>\n<p>To znaczy, realizacja funkcji nie ma dla nas znaczenia. Wystarczy tylko wiedzie\u0107, od jakich parametr\u00f3w zale\u017cy wynik. Wtedy, je\u015bli warto\u015bci parametr\u00f3w przedstawimy w formie obiektu, kt\u00f3ry mo\u017cna wykorzysta\u0107 jako klucz w pewnym magazynie \u2014 to wynik obliczenia mo\u017cemy zapisa\u0107 i przy nast\u0119pnym zapytaniu odczyta\u0107. Je\u015bli zapis-odczyt wyniku przebiega szybciej ni\u017c wykonanie funkcji \u2013 mamy zysk na pr\u0119dko\u015bci. Warto\u015b\u0107 zysku mo\u017ce wynosi\u0107 nawet 100, 1000, a nawet 100 tysi\u0119cy razy (10^5 \u2013 to raczej wyj\u0105tek, ale w przypadku naprawd\u0119 mocno laguj\u0105cej bazy \u2013 jak najbardziej mo\u017cliwe).<\/p>\n<h2>Podstawowe wymagania dla systemu cache'owania<\/h2>\n<p>\nPierwsze, co mo\u017ce by\u0107 wymaganiem dla systemu cache'owania \u2014 szybki czas odczytu i w nieco mniejszym stopniu \u2013 czas zapisu. Tak, ale tylko do momentu, gdy nie wdra\u017camy systemu na produkcj\u0119.<\/p>\n<p>Rozpatrzmy taki przypadek.<\/p>\n<p>Za\u0142\u00f3\u017cmy, \u017ce zapewnili\u015bmy sprz\u0119t do aktualnego obci\u0105\u017cenia i teraz stopniowo wprowadzamy cache'owanie. U\u017cytkownik\u00f3w przybywa, obci\u0105\u017cenie ro\u015bnie \u2013 stopniowo dodajemy cache'e, przy\u0142\u0105czaj\u0105c je tu i tam. Tak trwa przez pewien czas, a ci\u0119\u017ckie funkcje s\u0105 ju\u017c prawie nie wywo\u0142ywane \u2014 ca\u0142e g\u0142\u00f3wne obci\u0105\u017cenie spoczywa na cache'u. Liczba u\u017cytkownik\u00f3w w tym czasie wzros\u0142a N razy.<\/p>\n<p>I je\u015bli pocz\u0105tkowy zapas sprz\u0119tu m\u00f3g\u0142 wynosi\u0107 2-5 razy, to za pomoc\u0105 cache'a mogli\u015bmy podnie\u015b\u0107 wydajno\u015b\u0107 o 10 razy, a w dobrym przypadku o 100, a miejscami nawet o 1000. To znaczy, na tym samym sprz\u0119cie \u2014 obs\u0142ugujemy 100 razy wi\u0119cej zapyta\u0144. Wspaniale, zas\u0142u\u017cyli\u015bmy na nagrod\u0119!<\/p>\n<p>Ale teraz, w pewnym pi\u0119knym momencie, system przypadkowo zawi\u00f3d\u0142, a pami\u0119\u0107 podr\u0119czna upad\u0142a. Nic nadzwyczajnego \u2013 pami\u0119\u0107 podr\u0119czna zosta\u0142a wybrana z wymaganiem \u201ewysoka pr\u0119dko\u015b\u0107 odczytu i zapisu, reszta nie jest wa\u017cna\u201d.<\/p>\n<p>Pod wzgl\u0119dem pocz\u0105tkowego obci\u0105\u017cenia mieli\u015bmy zapas sprz\u0119towy 2-5 razy, a obci\u0105\u017cenie przez ten czas wzros\u0142o 10-100 razy. Dzi\u0119ki pami\u0119ci podr\u0119cznej eliminowali\u015bmy wywo\u0142ania dla ci\u0119\u017ckich funkcji, wi\u0119c wszystko dzia\u0142a\u0142o p\u0142ynnie. A teraz, bez pami\u0119ci podr\u0119cznej \u2013 o ile spadnie nasz system? Co si\u0119 stanie? System si\u0119 zawiesi.<\/p>\n<p>Nawet je\u015bli nasza pami\u0119\u0107 podr\u0119czna nie upad\u0142a, a tylko chwilowo si\u0119 wyczy\u015bci\u0142a \u2013 trzeba b\u0119dzie j\u0105 podgrzewa\u0107, a to zajmie troch\u0119 czasu. I w tym czasie g\u0142\u00f3wne obci\u0105\u017cenie spadnie na funkcjonalno\u015b\u0107.<\/p>\n<p>Wnioski: wysokoobci\u0105\u017cone projekty w produkcji wymagaj\u0105 od systemu pami\u0119ci podr\u0119cznej nie tylko wysokiej pr\u0119dko\u015bci odczytu i zapisu, ale r\u00f3wnie\u017c integralno\u015bci danych i odporno\u015bci na awarie.<\/p>\n<h2>K\u0142opoty z wyborem<\/h2>\n<p>\nW projekcie z panelem administracyjnym wyb\u00f3r przebiega\u0142 tak: najpierw zainstalowali\u015bmy Hazelcast, poniewa\u017c ju\u017c znali\u015bmy ten produkt z do\u015bwiadczenia g\u0142\u00f3wnej witryny. Jednak tutaj ten wyb\u00f3r okaza\u0142 si\u0119 nietrafiony \u2013 przy naszym profilu obci\u0105\u017cenia Hazelcast dzia\u0142a nie tylko wolno, ale strasznie wolno. A przed terminami uruchomienia w produkcji ju\u017c si\u0119 na to podpisali\u015bmy.<\/p>\n<p>Spojler: jak dok\u0142adnie u\u0142o\u017cy\u0142y si\u0119 okoliczno\u015bci, \u017ce przeoczyli\u015bmy taki hicior i znale\u017ali\u015bmy si\u0119 w trudnej i napi\u0119tej sytuacji \u2013 opowiem w drugiej cz\u0119\u015bci \u2014 oraz jak si\u0119 znale\u017ali\u015bmy i jak wyszli\u015bmy. Ale teraz \u2014 powiem tylko, \u017ce to by\u0142 du\u017cy stres, a \u201emy\u015blenie \u2013 jako\u015b nie my\u015bli si\u0119, potrz\u0105samy butelk\u0105\u201d. \u201ePotrz\u0105samy butelk\u0105\u201d \u2013 to te\u017c spojler, o tym troch\u0119 p\u00f3\u017aniej.<\/p>\n<p>Co zrobili\u015bmy:<\/p>\n<ol>\n<li>Sporz\u0105dzamy list\u0119 wszystkich system\u00f3w, kt\u00f3re wskazuje Google i StackOverflow. Troch\u0119 wi\u0119cej ni\u017c 30.<\/li>\n<li>Piszemy testy z obci\u0105\u017ceniem charakterystycznym dla produkcji. W tym celu nagrali\u015bmy dane, kt\u00f3re przechodz\u0105 przez system w \u015brodowisku produkcyjnym \u2014 taki sniffing danych wewn\u0119trznych systemu. W testach u\u017cywali\u015bmy dok\u0142adnie tych danych.<\/li>\n<li>Ca\u0142y zesp\u00f3\u0142, ka\u017cdy wybiera nast\u0119pny system z listy, konfiguruje, przeprowadza testy. Test nie przechodzi, nie d\u017awiga obci\u0105\u017cenia \u2013 wyrzucamy, przechodzimy do nast\u0119pnego w kolejce.<\/li>\n<li>Na 17. systemie sta\u0142o si\u0119 jasne, \u017ce wszystko jest beznadziejne. Czas przesta\u0107 \u201etrz\u0105\u015b\u0107 butelk\u0105\u201d, pora powa\u017cnie si\u0119 zastanowi\u0107.<\/li>\n<\/ol>\n<p>\nJest to opcja, gdy musimy wybra\u0107 system, kt\u00f3ry \u201eprzeskoczy\u201d przez wyniki przygotowanych wcze\u015bniej test\u00f3w. A co, je\u015bli takich test\u00f3w jeszcze nie ma i chcemy wybra\u0107 szybciej?<\/p>\n<p>Modelujmy tak\u0105 opcj\u0119 (trudno sobie wyobrazi\u0107, \u017ce programista na poziomie \u015brednim + \u017cyje w vacuum i w momencie wyboru jeszcze nie zdecydowa\u0142, jaki produkt wypr\u00f3bowa\u0107 w pierwszej kolejno\u015bci \u2013 dlatego dalsze rozwa\u017cania to raczej teoria\/filozofia\/o juniorze).<\/p>\n<p>Zdefiniowawszy wymagania, zaczniemy wybiera\u0107 rozwi\u0105zanie z pude\u0142ka. Po co wymy\u015bla\u0107 ko\u0142o na nowo: we\u017amiemy gotowy system do buforowania.<\/p>\n<p>Je\u015bli dopiero zaczynasz i b\u0119dziesz googlowa\u0107, to kolejno\u015b\u0107 b\u0119dzie mniej wi\u0119cej taka, ale og\u00f3lnie rzecz bior\u0105c, orientacje b\u0119d\u0105 takie. W pierwszej kolejno\u015bci natkniesz si\u0119 na Redis, kt\u00f3ry jest szeroko znany. Potem dowiesz si\u0119, \u017ce istnieje EhCache jako najstarszy i sprawdzony system. Dalej b\u0119dzie mowa o Tarantool \u2013 krajowym rozwi\u0105zaniu, kt\u00f3re ma unikalny aspekt. I r\u00f3wnie\u017c Ignite, poniewa\u017c obecnie jest na fali popularno\u015bci i ma wsparcie SbierTech. Na ko\u0144cu jeszcze Hazelcast, poniewa\u017c w \u015bwiecie enterprise cz\u0119sto pojawia si\u0119 w\u015br\u00f3d du\u017cych firm.<\/p>\n<p>To nie wyczerpuje listy, istnieje dziesi\u0105tki system\u00f3w. A my przyczepimy tylko jeden. We\u017amiemy wybrane 5 system\u00f3w na \u201ekonkurs pi\u0119kno\u015bci\u201d i przeprowadzimy selekcj\u0119. Kto b\u0119dzie zwyci\u0119zc\u0105?<\/p>\n<h3>Redis<\/h3>\n<p>\nCzytamy, co pisz\u0105 na oficjalnej stronie.<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/redis.io\/\">Redis<\/a><\/noindex> \u2014 projekt opensource. Oferuje pami\u0119\u0107 in-memory, mo\u017cliwo\u015b\u0107 zapisywania na dysku, automatyczne dzielenie na partycje, wysok\u0105 dost\u0119pno\u015b\u0107 i odzyskiwanie po przerwach w sieci.<\/p>\n<p>Wygl\u0105da na to, \u017ce wszystko jest \u015bwietnie, mo\u017cna bra\u0107 i wdra\u017ca\u0107 \u2013 wszystko, co potrzebujesz, robi. Ale zerknijmy z czystej ciekawo\u015bci na pozosta\u0142ych kandydat\u00f3w.<\/p>\n<h3>EhCache<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.ehcache.org\/\">EhCache<\/a><\/noindex> \u2014 \u201enajcz\u0119\u015bciej u\u017cywany cache dla Javy\u201d (t\u0142umaczone has\u0142o z oficjalnej strony). R\u00f3wnie\u017c opensource. I tutaj rozumiemy, \u017ce Redis nie jest pod jav\u0119, jest og\u00f3lny, a do wsp\u00f3\u0142pracy z nim potrzebna jest nak\u0142adka. EhCache b\u0119dzie bardziej wygodne. Co jeszcze obiecuje system? Niezawodno\u015b\u0107, sprawdzalno\u015b\u0107, pe\u0142na funkcjonalno\u015b\u0107. No i dodatkowo jest najcz\u0119\u015bciej stosowane. I buforuje terabajty danych.<\/p>\n<p>Redis zosta\u0142 zapomniany, jestem got\u00f3w wybra\u0107 EhCache.<\/p>\n<p>Ale poczucie patriotyzmu sk\u0142ania mnie do przyjrzenia si\u0119, co dobrego ma Tarantool.<\/p>\n<h3>Tarantool<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.tarantool.io\/ru\/\">Tarantool<\/a><\/noindex> \u2014 spotyka si\u0119 z okre\u015bleniem \u201ePlatforma integracji danych w czasie rzeczywistym\u201d. Brzmi to skomplikowanie, wi\u0119c szczeg\u00f3\u0142owo przegl\u0105damy stron\u0119 i znajdujemy g\u0142o\u015bne stwierdzenie: \u201eBuferuje 100% danych w pami\u0119ci operacyjnej\u201d. To powinno budzi\u0107 w\u0105tpliwo\u015bci \u2014 w ko\u0144cu danych mo\u017ce by\u0107 znaczenie wi\u0119cej ni\u017c pami\u0119ci. Wyja\u015bnienie jest takie, \u017ce tutaj rozumie si\u0119, \u017ce do zapisu danych na dysku z pami\u0119ci Tarantool nie przeprowadza serializacji. Zamiast tego \u2013 wykorzystuje niskopoziomowe cechy systemu, kiedy pami\u0119\u0107 jest po prostu mapowana na system plik\u00f3w z bardzo dobrymi wska\u017anikami I\/O. Generalnie, zrobili to w wyj\u0105tkowy i \u015bwietny spos\u00f3b.<\/p>\n<p>Przyjrzyjmy si\u0119 wdro\u017ceniom: Mail.ru, Avito, Beeline, MegaFon, Alfa-Bank, Gazprom\u2026<\/p>\n<p>Je\u015bli wci\u0105\u017c mia\u0142em jakie\u015b w\u0105tpliwo\u015bci co do Tarantoola, to przypadek wdro\u017cenia w Mastercard mnie przekonuje. Bior\u0119 Tarantoola.<\/p>\n<p>Ale jednak\u2026<\/p>\n<h3>Ignite<\/h3>\n<p>\n\u2026 jest jeszcze <noindex><a rel=\"nofollow\" href=\"https:\/\/ignite.apache.org\/\">Ignite<\/a><\/noindex>, oznaczony jako \u201eplatforma obliczeniowa in-memory\u2026 pr\u0119dko\u015b\u0107 in-memory na petabajtach danych\u201d. Tutaj r\u00f3wnie\u017c jest wiele plus\u00f3w: rozproszony cache in-memory, najszybsze przechowywanie kluczy i warto\u015bci oraz cache, poziome skalowanie, wysoka dost\u0119pno\u015b\u0107, surowa integralno\u015b\u0107. Generalnie okazuje si\u0119, \u017ce najszybszy to Ignite.<\/p>\n<p>Wdro\u017cenia: Sberbank, American Airlines, Yahoo! Japan. A potem dowiaduj\u0119 si\u0119, \u017ce Ignite nie tylko wdro\u017cono w Sberbanku, ale zesp\u00f3\u0142 SberTech wysy\u0142a swoich ludzi do zespo\u0142u Ignite, aby poprawi\u0107 produkt. To ca\u0142kowicie mnie przekonuje i jestem got\u00f3w wybra\u0107 Ignite.<\/p>\n<p>Ca\u0142kowicie nie wiadomo po co, patrz\u0119 na pi\u0105ty punkt.<\/p>\n<h3>Hazelcast<\/h3>\n<p>\nWchodz\u0119 na stron\u0119 <noindex><a rel=\"nofollow\" href=\"https:\/\/hazelcast.com\/\">Hazelcast<\/a><\/noindex>, czytam. I okazuje si\u0119, \u017ce najszybszym rozwi\u0105zaniem do rozproszonego cache'owania \u2014 jest Hazelcast. Jest znacznie szybszy od wszystkich innych rozwi\u0105za\u0144 i og\u00f3lnie jest liderem w zakresie in-memory data grid. W obliczu tego, aby wzi\u0105\u0107 co\u015b innego \u2014 nie szanowa\u0107 siebie. A ponadto wykorzystuje nadmiarowe przechowywanie danych do ci\u0105g\u0142ej pracy klastra bez utraty danych.<\/p>\n<p>Wszystko, jestem got\u00f3w wzi\u0105\u0107 Hazelcast.<\/p>\n<h2>Por\u00f3wnanie<\/h2>\n<p>\nJednak je\u015bli spojrze\u0107, to wszyscy pi\u0119ciu kandydaci s\u0105 tak opisani, \u017ce ka\u017cdy z nich \u2013 jest najlepszy. Jak wybra\u0107? Mo\u017cemy zobaczy\u0107, kt\u00f3ry z nich jest najpopularniejszy, poszuka\u0107 por\u00f3wna\u0144, a b\u00f3l g\u0142owy minie.<\/p>\n<p>Znajdujemy taki <noindex><a rel=\"nofollow\" href=\"https:\/\/db-engines.com\/en\/ranking_trend\">przegl\u0105d<\/a><\/noindex>, wybieramy nasze 5 system\u00f3w.<\/p>\n<p><img decoding=\"async\" alt=\"Jak wybierali\u015bmy system cache w Sportmasterze. Cz\u0119\u015b\u0107 1\" src=\"\/wp-content\/uploads\/2020\/03\/98a99bbce026318ac08aacfd829935bc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nTutaj s\u0105 posortowane: na g\u00f3rze Redis, na drugim miejscu \u2014 Hazelcast, zyskuj\u0105 na popularno\u015bci Tarantool i Ignite, EhCache jak by\u0142, tak pozosta\u0142. <\/p>\n<p>Ale przyjrzyjmy si\u0119 <noindex><a rel=\"nofollow\" href=\"https:\/\/db-engines.com\/en\/ranking_definition\">metodzie obliczeniowej<\/a><\/noindex>: linki do stron internetowych, og\u00f3lne zainteresowanie systemem, oferty pracy \u2014 super! To znaczy, kiedy m\u00f3j system przestanie dzia\u0142a\u0107, powiem: \u201eNie, jest niezawodny! A tutaj jest tyle ofert pracy\u2026\u201d. Takie proste por\u00f3wnanie nie jest wystarczaj\u0105ce.<\/p>\n<p>Te wszystkie systemy to nie tylko systemy przechowywania w pami\u0119ci podr\u0119cznej. Maj\u0105 one znacznie wi\u0119cej funkcji, w tym \u2013 kiedy dane nie s\u0105 przesy\u0142ane do klienta do przetworzenia, ale przeciwnie: kod, kt\u00f3ry ma by\u0107 wykonany na danych, przemieszcza si\u0119 na serwer, tam jest wykonywany, a wynik jest zwracany. Jako oddzielny system do buforowania rzadko jest to rozpatrywane.<\/p>\n<p>Dobrze, nie poddajemy si\u0119, znajdziemy bezpo\u015brednie por\u00f3wnanie system\u00f3w. We\u017amiemy dwa najlepsze warianty \u2014 Redis i Hazelcast. Interesuje nas szybko\u015b\u0107, pod tym wzgl\u0119dem je por\u00f3wnamy.<\/p>\n<h3>Hz vs Redis<\/h3>\n<p>\nZnajdujemy takie <noindex><a rel=\"nofollow\" href=\"https:\/\/hazelcast.com\/resources\/benchmark-redis-3-2-8-vs-hazelcast-3-8\/\">por\u00f3wnanie<\/a><\/noindex>:<br \/>\n<img decoding=\"async\" alt=\"Jak wybierali\u015bmy system cache w Sportmasterze. Cz\u0119\u015b\u0107 1\" src=\"\/wp-content\/uploads\/2020\/03\/c59ff32b3b61f68f0c3917c1de2aaa8f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nNiebieski \u2014 to Redis, czerwony Hazelcast. Hazelcast wygrywa wsz\u0119dzie, i to jest uzasadnione: jest wielow\u0105tkowy, wysoko zoptymalizowany, ka\u017cdy w\u0105tek pracuje z w\u0142asn\u0105 partycj\u0105, dlatego nie ma blokad. A Redis \u2014 jest jednow\u0105tkowy, nie korzysta z nowoczesnych wielordzeniowych CPU. Hazelcast wykorzystuje asynchroniczne I\/O, podczas gdy Redis-Jedis \u2014 blokuj\u0105ce gniazda. Ostatecznie, Hazelcast u\u017cywa protoko\u0142u binarnego, a Redis jest tekstowy, co oznacza, \u017ce jest mniej efektywny.<\/p>\n<p>Na wszelki wypadek zwr\u00f3cimy si\u0119 do jeszcze jednego \u017ar\u00f3d\u0142a por\u00f3wnania. Co nam poka\u017ce?<\/p>\n<h3>Redis vs Hz<\/h3>\n<p>\nJeszcze jedno <noindex><a rel=\"nofollow\" href=\"https:\/\/redislabs.com\/blog\/benchmarking-redis-enterprise-5-2-0-vs-hazelcast-3-9\/\">por\u00f3wnanie<\/a><\/noindex>:<br \/>\n<img decoding=\"async\" alt=\"Jak wybierali\u015bmy system cache w Sportmasterze. Cz\u0119\u015b\u0107 1\" src=\"\/wp-content\/uploads\/2020\/03\/61e466d367dd6f9d52c1d7c6443d1713.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nTutaj z kolei, czerwony \u2014 to Redis. To znaczy, Redis wygrywa pod wzgl\u0119dem wydajno\u015bci z Hazelcast. W pierwszym por\u00f3wnaniu wygra\u0142 Hazelcast, w drugim \u2014 Redis. <noindex><a rel=\"nofollow\" href=\"https:\/\/redislabs.com\/blog\/benchmarking-redis-enterprise-5-2-0-vs-hazelcast-3-9\/\">Tutaj<\/a><\/noindex> bardzo dok\u0142adnie wyja\u015bniono, dlaczego w poprzednim por\u00f3wnaniu wygra\u0142 Hazelcast.<\/p>\n<p>Okazuje si\u0119, \u017ce wynik pierwszego by\u0142 praktycznie sfa\u0142szowany: Redis wzi\u0119to z podstawowej wersji, a Hazelcast dostosowano do przypadku testowego. Wi\u0119c wychodzi na to, \u017ce po pierwsze, nikomu nie mo\u017cna ufa\u0107, po drugie, gdy ju\u017c wybierzemy system, musimy go jeszcze w\u0142a\u015bciwie skonfigurowa\u0107. Te ustawienia obejmuj\u0105 dziesi\u0105tki, prawie setki parametr\u00f3w.<\/p>\n<h2>Trz\u0119sienie butelki<\/h2>\n<p>\nCa\u0142y proces, kt\u00f3ry teraz przeszli\u015bmy, mog\u0119 wyja\u015bni\u0107 tak\u0105 metafor\u0105 \u201eTrz\u0119sienie butelki\u201d. To znaczy, teraz nie trzeba programowa\u0107, najwa\u017cniejsze jest umie\u0107 czyta\u0107 stackoverflow. W moim zespole jest profesjonalista, kt\u00f3ry dok\u0142adnie w taki spos\u00f3b dzia\u0142a w krytycznych momentach.<\/p>\n<p>Co on robi? Widzi uszkodzony element, dostrzega \u015blad stosu, wybiera z niego pewne s\u0142owa (kt\u00f3re to dok\u0142adnie \u2014 to jego ekspercka wiedza o programie), szuka w Google, znajduje odpowiedzi na Stack Overflow. Nie czytaj\u0105c, nie zag\u0142\u0119biaj\u0105c si\u0119 \u2014 spo\u015br\u00f3d odpowiedzi na pytanie wybiera co\u015b, co najbardziej przypomina zdanie \u201ezr\u00f3b to i to\u201d (wybranie takiej odpowiedzi to jego talent, bo nie zawsze jest to ten najlepszy odpowied\u017a, kt\u00f3ry zebra\u0142 najwi\u0119cej lajk\u00f3w), stosuje to, sprawdza: je\u015bli co\u015b si\u0119 zmieni\u0142o, to \u015bwietnie. Je\u015bli nie, cofamy si\u0119. I powtarzamy uruchomienie, sprawdzenie, poszukiwanie. W ten intuicyjny spos\u00f3b osi\u0105ga, \u017ce po jakim\u015b czasie kod dzia\u0142a. Nie wie dlaczego, nie wie co zrobi\u0142, nie potrafi wyt\u0142umaczy\u0107. Ale! Ta rzecz dzia\u0142a. I \u201epo\u017car ugaszony\u201d. Teraz rozk\u0142adamy na czynniki to, co zrobili\u015bmy. Kiedy program dzia\u0142a \u2014 to jest o wiele \u0142atwiejsze. I znacznie oszcz\u0119dza czas.<\/p>\n<p>Ten spos\u00f3b jest bardzo dobrze wyja\u015bniony na takim przyk\u0142adzie.<\/p>\n<p>Kiedy\u015b bardzo popularne by\u0142o sk\u0142adanie \u017cagl\u00f3wki w butelce. \u017bagl\u00f3wka jest du\u017ca i krucha, a szyjka butelki bardzo w\u0105ska, nie da si\u0119 jej w \u015brodku w\u0142o\u017cy\u0107. Jak j\u0105 z\u0142o\u017cy\u0107?<\/p>\n<p><img decoding=\"async\" alt=\"Jak wybierali\u015bmy system cache w Sportmasterze. Cz\u0119\u015b\u0107 1\" src=\"\/wp-content\/uploads\/2020\/03\/6c69e04080f1f0da81abf7a6a80510f2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nJest taka metoda, bardzo szybka i bardzo skuteczna.<\/p>\n<p>Statek sk\u0142ada si\u0119 z wielu drobiazg\u00f3w: patyk\u00f3w, sznurk\u00f3w, \u017cagli, kleju. Wszystko to wk\u0142adamy do butelki.<br \/>\nBierzemy butelk\u0119 obiema r\u0119kami i zaczynamy j\u0105 trz\u0105\u015b\u0107. Tak j\u0105 trz\u0119siemy, trz\u0119siemy. I zazwyczaj \u2014 wychodzi z tego kompletny ba\u0142agan, oczywi\u015bcie. Ale czasami. Czasami wychodzi statek! Dok\u0142adniej, co\u015b, co przypomina statek.<\/p>\n<p>Pokazujemy to co\u015b komu\u015b: \u201eSiergiej, widzisz!?\u201d. I rzeczywi\u015bcie, z daleka \u2014 wygl\u0105da jak statek. Ale dalej tego nie mo\u017cna puszcza\u0107.<\/p>\n<p>Jest jeszcze inny spos\u00f3b. U\u017cywaj\u0105 go bardziej zaawansowani ch\u0142opaki, tacy hakerzy.<\/p>\n<p>Da\u0142em takiemu go\u015bciowi zadanie, wszystko zrobi\u0142 i poszed\u0142. I patrzysz \u2014 wydaje si\u0119, \u017ce zrobione. Ale po pewnym czasie, kiedy trzeba poprawi\u0107 kod \u2014 zaczyna si\u0119 tam takie zamieszanie z jego powodu... Dobrze, \u017ce zd\u0105\u017cy\u0142 si\u0119 daleko oddali\u0107. To tacy ch\u0142opaki, kt\u00f3rzy na przyk\u0142adzie butelki zrobi\u0105 tak: widzicie, tam, gdzie denko \u2014 szk\u0142o si\u0119 wygina. I nie do ko\u0144ca wiadomo, czy jest przezroczyste, czy nie. Wtedy \u201ehakerzy\u201d odcinaj\u0105 to denko, wk\u0142adaj\u0105 w to statek, a denko potem przyklejaj\u0105 z powrotem, jakby tak mia\u0142o by\u0107.<\/p>\n<p>Z perspektywy postawienia zadania wydaje si\u0119, \u017ce wszystko jest w porz\u0105dku. Ale bior\u0105c pod uwag\u0119 przyk\u0142ad statk\u00f3w: po co w og\u00f3le zrobi\u0107 ten statek, komu on tak naprawd\u0119 jest potrzebny? Nie ma \u017cadnej funkcjonalno\u015bci. Zwykle takie statki to prezenty dla bardzo wysoko postawionych os\u00f3b, kt\u00f3re stawiaj\u0105 je na p\u00f3\u0142ce nad sob\u0105 jako pewien symbol, znak. A je\u015bli u takiej osoby, szefa du\u017cej firmy lub wysokiego urz\u0119dnika, jako flag\u0119 b\u0119dzie sta\u0142a taka tandeta, kt\u00f3rej szyjka jest odci\u0119ta? Lepiej, \u017ceby nigdy si\u0119 o tym nie dowiedzia\u0142. Jak wi\u0119c w\u0142a\u015bciwie robi si\u0119 te statki, kt\u00f3re mo\u017cna podarowa\u0107 wa\u017cnej osobie?<\/p>\n<p>Jedynym miejscem, kluczowym, z kt\u00f3rym nie mo\u017cna nic zrobi\u0107, jest kad\u0142ub. I kad\u0142ub statku przechodzi przez szyjk\u0119. Tymczasem statek jest sk\u0142adany poza butelk\u0105. Ale to nie jest proste z\u0142o\u017cenie statku, to prawdziwa rzemie\u015blnicza sztuka. Do cz\u0119\u015bci sk\u0142adowych dodawane s\u0105 specjalne d\u017awignie, kt\u00f3re umo\u017cliwiaj\u0105 p\u00f3\u017aniejsze ich podniesienie. Na przyk\u0142ad \u017cagle sk\u0142adaj\u0105 si\u0119, s\u0105 starannie wnoszone do \u015brodka, a nast\u0119pnie za pomoc\u0105 pincety bardzo precyzyjnie s\u0105 podci\u0105gane i unoszone. W rezultacie powstaje dzie\u0142o sztuki, kt\u00f3re mo\u017cna z czystym sumieniem i dum\u0105 podarowa\u0107.<\/p>\n<p>Je\u015bli chcemy, aby projekt by\u0142 udany \u2013 w zespole powinien by\u0107 przynajmniej jedna osoba-jubiler. Taki, kt\u00f3ry dba o jako\u015b\u0107 produktu i uwzgl\u0119dnia wszystkie aspekty, nie rezygnuj\u0105c z \u017cadnego, nawet w chwilach stresu, gdy okoliczno\u015bci wymagaj\u0105 szybkiego dzia\u0142ania kosztem wa\u017cnych rzeczy. Wszystkie udane projekty, kt\u00f3re s\u0105 stabilne i przetrwa\u0142y pr\u00f3b\u0119 czasu, s\u0105 oparte na tej zasadzie. Maj\u0105 w sobie co\u015b bardzo precyzyjnego i unikalnego, co\u015b, co wykorzystuje wszystkie dost\u0119pne mo\u017cliwo\u015bci. W przyk\u0142adzie z statkiem w butelce \u2013 podkre\u015bla si\u0119 to, \u017ce kad\u0142ub statku przechodzi przez szyjk\u0119.<\/p>\n<p>Wracaj\u0105c do zadania wyboru naszego serwera pami\u0119ci podr\u0119cznej, jak mo\u017cna by zastosowa\u0107 t\u0119 metod\u0119? Proponuj\u0119 taki spos\u00f3b wyboru spo\u015br\u00f3d wszystkich dost\u0119pnych system\u00f3w \u2013 nie potrz\u0105sa\u0107 butelk\u0105, nie wybiera\u0107, lecz spojrze\u0107, co w zasadzie w nich jest, na co zwraca\u0107 uwag\u0119 przy wyborze systemu.<\/p>\n<h2>Gdzie szuka\u0107 w\u0105skiego gard\u0142a?<\/h2>\n<p>\nSpr\u00f3bujemy nie trzyma\u0107 butelki w r\u0119ku, nie przegl\u0105da\u0107 wszystkiego po kolei, ale zobaczymy, jakie zadania mog\u0105 si\u0119 pojawi\u0107, gdyby\u015bmy chcieli zaprojektowa\u0107 taki system samodzielnie. Nie b\u0119dziemy budowa\u0107 roweru, ale pos\u0142u\u017cymy si\u0119 tym schematem, aby zorientowa\u0107 si\u0119, na jakie aspekty zwraca\u0107 uwag\u0119 w opisach produkt\u00f3w. Sporz\u0105d\u017amy taki schemat.<\/p>\n<p><img decoding=\"async\" alt=\"Jak wybierali\u015bmy system cache w Sportmasterze. Cz\u0119\u015b\u0107 1\" src=\"\/wp-content\/uploads\/2020\/03\/f2c36d07383d778e60b2f800749012ca.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nJe\u015bli system jest rozproszony, oznacza to, \u017ce b\u0119dziemy mie\u0107 kilka serwer\u00f3w (6). Za\u0142\u00f3\u017cmy, \u017ce cztery (wygodnie umie\u015bci\u0107 na obrazku, ale oczywi\u015bcie mo\u017ce ich by\u0107 dowolna liczba). Je\u015bli serwery znajduj\u0105 si\u0119 na r\u00f3\u017cnych w\u0119z\u0142ach, oznacza to, \u017ce na wszystkich dzia\u0142a jaki\u015b kod, odpowiadaj\u0105cy za to, aby te w\u0119z\u0142y stworzy\u0142y klaster i w przypadku zerwania po\u0142\u0105czenia - \u0142\u0105czy\u0142y si\u0119 i wzajemnie identyfikowa\u0142y.<\/p>\n<p>Potrzebny jest r\u00f3wnie\u017c kod-logika (2), kt\u00f3ry odpowiada za pami\u0119\u0107 podr\u0119czn\u0105. Klienci wsp\u00f3\u0142dzia\u0142aj\u0105 z tym kodem za po\u015brednictwem pewnego API. Kod kliencki (1) mo\u017ce by\u0107 realizowany w tym samym JVM lub \u0142\u0105czy\u0107 si\u0119 z nim przez sie\u0107. Logika wdro\u017cona wewn\u0119trznie to decyzje, kt\u00f3re obiekty w pami\u0119ci podr\u0119cznej pozostawi\u0107, a kt\u00f3re wyrzuci\u0107. Do przechowywania pami\u0119ci podr\u0119cznej wykorzystujemy pami\u0119\u0107 (3), ale je\u015bli zajdzie taka potrzeba, cz\u0119\u015b\u0107 danych mo\u017cemy r\u00f3wnie\u017c zapisa\u0107 na dysku (4).<\/p>\n<p>Zobaczmy, w kt\u00f3rych cz\u0119\u015bciach b\u0119dzie wyst\u0119powa\u0142 obci\u0105\u017cenie. Rzeczywi\u015bcie, obci\u0105\u017cone b\u0119d\u0105 ka\u017cda strza\u0142ka i ka\u017cdy w\u0119ze\u0142. Po pierwsze, pomi\u0119dzy kodem klienckim a API, je\u015bli jest to interakcja sieciowa, op\u00f3\u017anienie mo\u017ce by\u0107 do\u015b\u0107 zauwa\u017calne. Po drugie, w ramach samego API - przesadzaj\u0105c ze z\u0142o\u017con\u0105 logik\u0105, mo\u017cemy napotka\u0107 ograniczenia procesora. Dobrym pomys\u0142em by\u0142oby, aby logika nie zajmowa\u0142a pami\u0119ci wi\u0119cej ni\u017c to konieczne. Pozostaje jeszcze wsp\u00f3\u0142praca z systemem plik\u00f3w - w zwyk\u0142ym wariancie jest to serializacja \/ odtworzenie oraz zapis \/ odczyt.<\/p>\n<p>Nast\u0119pnie interakcja z klastrem. Prawdopodobnie b\u0119dzie si\u0119 on znajdowa\u0142 w tym samym systemie, ale mo\u017ce by\u0107 r\u00f3wnie\u017c oddzielny. Tutaj tak\u017ce nale\u017cy uwzgl\u0119dni\u0107 przesy\u0142 danych do niego, pr\u0119dko\u015b\u0107 serializacji danych oraz interakcj\u0119 mi\u0119dzy klastrem.<\/p>\n<p>Teraz, z jednej strony - mo\u017cemy wyobrazi\u0107 sobie, \"jakie z\u0119batki b\u0119d\u0105 si\u0119 kr\u0119ci\u0107\" w systemie pami\u0119ci podr\u0119cznej podczas przetwarzania zapyta\u0144 z naszego kodu, a z drugiej strony - mo\u017cemy oszacowa\u0107, jakie i ile zapyta\u0144 nasz kod wygeneruje do tego systemu. To wystarczy, aby podj\u0105\u0107 bardziej lub mniej rozs\u0105dny wyb\u00f3r - dobra\u0107 system do naszego przypadku u\u017cycia.<\/p>\n<p><b>Hazelcast<\/b><\/p>\n<p>Zobaczmy, jak zastosowa\u0107 takie roz\u0142o\u017cenie do naszej listy. Na przyk\u0142ad, Hazelcast.<\/p>\n<p>Aby przechowa\u0107 lub pobra\u0107 dane z Hazelcast, kod kliencki zwraca si\u0119 (1) do api. Hz pozwala uruchomi\u0107 serwer jako embedded, a w takim przypadku wywo\u0142anie do api \u2013 to wywo\u0142anie metody wewn\u0105trz JVM, mo\u017cna to uzna\u0107 za bezp\u0142atne.<\/p>\n<p>Aby logika dzia\u0142a\u0142a w (2), Hz opiera si\u0119 na haszu od tablicy bajt\u00f3w zserializowanego klucza \u2013 to znaczy, \u017ce serializacja klucza odb\u0119dzie si\u0119 w ka\u017cdym razie. To nieuchronny overhead dla Hz.<br \/>\nStrategie Eviction zosta\u0142y dobrze zaimplementowane, ale w wyj\u0105tkowych przypadkach mo\u017cna pod\u0142\u0105cza\u0107 swoje. O t\u0119 cz\u0119\u015b\u0107 nie trzeba si\u0119 martwi\u0107.<\/p>\n<p>Magazyn (4) mo\u017cna pod\u0142\u0105cza\u0107. \u015awietnie. Interakcja (5) dla embedded mo\u017cna uzna\u0107 za natychmiastow\u0105. Wymiana danych mi\u0119dzy w\u0119z\u0142ami w klastrze (6) \u2013 tak, istnieje. To wk\u0142ad w odporno\u015b\u0107 na awarie kosztem pr\u0119dko\u015bci. Zmniejszenie koszt\u00f3w umo\u017cliwia funkcja Hz Near-cache \u2013 dane pochodz\u0105ce z innych w\u0119z\u0142\u00f3w klastra b\u0119d\u0105 buforowane.<\/p>\n<p>Co mo\u017cna zrobi\u0107 w takich warunkach, aby zwi\u0119kszy\u0107 pr\u0119dko\u015b\u0107?<\/p>\n<p>Na przyk\u0142ad, aby unikn\u0105\u0107 serializacji klucza w (2) \u2013 nale\u017cy doda\u0107 jeszcze jeden cache nad Hazelcast, dla najbardziej gor\u0105cych danych. W Sportmasterze do tego celu wybrano Caffeine.<\/p>\n<p>Dla dostosowania na poziomie (6), w Hz zaproponowano dwa typy przechowywania: IMap i ReplicatedMap.<br \/>\n<img decoding=\"async\" alt=\"Jak wybierali\u015bmy system cache w Sportmasterze. Cz\u0119\u015b\u0107 1\" src=\"\/wp-content\/uploads\/2020\/03\/ce752c9a0f46609add8de8644a7ad17f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nWarto wspomnie\u0107, jak Hazelcast trafi\u0142 do staku technologii Sportmaster.<\/p>\n<p>W 2012 roku, gdy pracowali\u015bmy nad pierwszym prototypem przysz\u0142ej strony, to w\u0142a\u015bnie Hazelcast by\u0142 pierwszym wynikiem, kt\u00f3ry wyda\u0142a wyszukiwarka. Spotkanie rozpocz\u0119\u0142o si\u0119 'od razu' \u2013 zakupili nas tym, \u017ce zaledwie po dw\u00f3ch godzinach, gdy pod\u0142\u0105czyli\u015bmy Hz do systemu \u2013 dzia\u0142a\u0142. I dzia\u0142a\u0142 dobrze. Do ko\u0144ca dnia dopisali\u015bmy kilka test\u00f3w, cieszyli\u015bmy si\u0119. I tego zapasu energii wystarczy\u0142o, by pokona\u0107 te niespodzianki, kt\u00f3re Hz z czasem podsuwa\u0142. Teraz zesp\u00f3\u0142 Sportmaster nie ma powod\u00f3w, by rezygnowa\u0107 z Hazelcast.<\/p>\n<p>Jednak takie argumenty, jak 'pierwszy wynik w wyszukiwarce' i 'szybko zbudowali\u015bmy HelloWorld' \u2013 to oczywi\u015bcie wyj\u0105tek i szczeg\u00f3lno\u015b\u0107 momentu, w kt\u00f3rym dokonano wyboru. Prawdziwe wyzwania dla wybranego systemu zaczynaj\u0105 si\u0119 przy wprowadzeniu do produkcji, i na ten etap warto zwr\u00f3ci\u0107 uwag\u0119 przy wyborze jakiegokolwiek systemu, w tym tak\u017ce cache. W\u0142a\u015bciwie, w naszym przypadku mo\u017cna powiedzie\u0107, \u017ce wybrali\u015bmy Hazelcast przypadkowo, ale potem okaza\u0142o si\u0119, \u017ce dokonali\u015bmy w\u0142a\u015bciwego wyboru.<\/p>\n<p>W produkcji o wiele wa\u017cniejsze s\u0105: monitorowanie, obs\u0142uga awarii na poszczeg\u00f3lnych w\u0119z\u0142ach, replikacja danych, koszty skalowania. Warto zwr\u00f3ci\u0107 uwag\u0119 na problemy, kt\u00f3re mog\u0105 wyst\u0105pi\u0107 podczas utrzymania systemu \u2013 kiedy obci\u0105\u017cenie kilkadziesi\u0105t razy przekroczy planowane, gdy przypadkowo prze\u015blemy co\u015b niew\u0142a\u015bciwego i do niew\u0142a\u015bciwego miejsca, oraz gdy b\u0119dzie konieczne wprowadzenie nowej wersji kodu, zast\u0105pienie danych i uczynienie tego niezauwa\u017calnym dla klient\u00f3w.<\/p>\n<p>Hazelcast z pewno\u015bci\u0105 spe\u0142nia wszystkie te wymagania.<\/p>\n<h2>Ci\u0105g dalszy nast\u0105pi<\/h2>\n<p>\nJednak Hazelcast nie jest panaceum. W 2017 roku wybrali\u015bmy Hazelcast jako pami\u0119\u0107 podr\u0119czn\u0105 w panelu administracyjnym, opieraj\u0105c si\u0119 jedynie na dobrym wra\u017ceniu z przesz\u0142ych do\u015bwiadcze\u0144. Odegra\u0142o to kluczow\u0105 rol\u0119 w bardzo z\u0142o\u015bliwym \u017carcie, przez co znale\u017ali\u015bmy si\u0119 w trudnej sytuacji i \"bohatersko\" wychodzili\u015bmy z niej przez 60 dni. Ale o tym w nast\u0119pnej cz\u0119\u015bci.<\/p>\n<p>A tymczasem... Szcz\u0119\u015bliwego Nowego Kodu!<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/490912\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041f\u044c\u044f\u043d\u043a\u043e\u0432, \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440. \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b, \u043a\u0430\u043a \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0430\u0441\u044c \u0440\u0430\u0431\u043e\u0442\u0430 \u043d\u0430\u0434 \u0441\u0430\u0439\u0442\u043e\u043c \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440 \u0432 2012 \u0433\u043e\u0434\u0443, \u043a\u0430\u043a\u0438\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u0442\u0438\u0432\u044b \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u00ab\u043f\u0440\u043e\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u00bb \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u043a\u0430\u043a\u0438\u0435 \u0433\u0440\u0430\u0431\u043b\u0438 \u043c\u044b \u0441\u043e\u0431\u0440\u0430\u043b\u0438. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043c\u044b\u0441\u043b\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u0437\u0430 \u0434\u0440\u0443\u0433\u0438\u043c \u0441\u044e\u0436\u0435\u0442\u043e\u043c \u2013 \u0432\u044b\u0431\u043e\u0440 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f java-\u0431\u044d\u043a\u0435\u043d\u0434\u0430 \u0432 \u0430\u0434\u043c\u0438\u043d\u043a\u0435 \u0441\u0430\u0439\u0442\u0430. \u042d\u0442\u043e\u0442 \u0441\u044e\u0436\u0435\u0442 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":73950,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-73949","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041f\u044c\u044f\u043d\u043a\u043e\u0432, \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/kak-my-v-sportmastere-vybirali-sistemu-keshirovaniya-chast-1\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a \u043c\u044b \u0432 \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0427\u0430\u0441\u0442\u044c 1 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041f\u044c\u044f\u043d\u043a\u043e\u0432, \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/kak-my-v-sportmastere-vybirali-sistemu-keshirovaniya-chast-1\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-03-12T23:42:07+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-12T23:42:07+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Jak w Sportmasterze wybierali\u015bmy system pami\u0119ci podr\u0119cznej. Cz\u0119\u015b\u0107 1 | ProHoster","description":"Cze\u015b\u0107! Nazywam si\u0119 Aleksiej Pjankow, jestem programist\u0105 w firmie Sportmaster.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/kak-my-v-sportmastere-vybirali-sistemu-keshirovaniya-chast-1","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a \u043c\u044b \u0432 \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0427\u0430\u0441\u0442\u044c 1 | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041f\u044c\u044f\u043d\u043a\u043e\u0432, \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/kak-my-v-sportmastere-vybirali-sistemu-keshirovaniya-chast-1","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-03-12T23:42:07+00:00","article:modified_time":"2020-03-12T23:42:07+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"73949","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 18:23:51","updated":"2022-09-28 05:05:57","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/73949","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=73949"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/73949\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/73950"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=73949"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=73949"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=73949"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}