{"id":12629,"date":"2022-12-01T11:17:49","date_gmt":"2022-12-01T10:17:49","guid":{"rendered":"https:\/\/vived.io\/?p=12629"},"modified":"2022-12-01T11:19:29","modified_gmt":"2022-12-01T10:19:29","slug":"droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/","title":{"rendered":"Droga do AWS Lambda SnapStart: lata optymalizacji &#8222;zimnego startu&#8221; JVM  &#8211; JVM Weekly #115"},"content":{"rendered":"\n<p>No c\u00f3\u017c, my\u015bla\u0142em, \u017ce po zesz\u0142otygodniowym wydaniu &#8211; w ca\u0142o\u015bci po\u015bwi\u0119conym Springowi &#8211; dzisiaj wezm\u0119 na warsztat jakie\u015b mniejsze tematy (cho\u0107by nazbiera\u0142o nam si\u0119 par\u0119 releas\u00f3w, min. nowy Gradle, ale nie tylko). &#8222;Niestety&#8221; odbywa si\u0119 AWS re:Invent, czyli najwi\u0119ksza coroczna impreza Amazonu. Zwykle dla \u015bwiata JVM ma ona znaczenie marginalne, ale jedno z og\u0142osze\u0144 jest na tyle ciekawe, \u017ce sko\u0144czy\u0142o si\u0119 jak zwykle&#8230;<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-1-1024x563.png\" alt=\"\" class=\"wp-image-12665\" width=\"768\" height=\"422\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-1-1024x563.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-1-300x165.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-1-768x422.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-1-1536x845.png 1536w, https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-1-2048x1126.png 2048w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/figure><\/div>\n\n\n<p>Amazon pokaza\u0142 bowiem AWS Lambda SnapStart &#8211; czyli dedykowane dla Lambdy rozwi\u0105zanie problemu zimnego startu. Dlatego dzisiaj porozmawiamy sobie o Serverlessie&#8230; i o tym, dlaczego tak ci\u0119\u017cko przez lata by\u0142o go efektywnie u\u017cywa\u0107 z Jav\u0105<\/p>\n\n\n\n<h2 id=\"co-to-jest-cold-start-problem\" data-num=1>Co to jest &#8222;Cold Start Problem&#8221;?<\/h2>\n\n\n\n<p>Zak\u0142adam, \u017ce czytaj\u0105c ten tekst wiecie, czym s\u0105 funkcje Serverless. My\u015bl\u0119, \u017ce cho\u0107by taka Lambda wesz\u0142a ju\u017c do programistycznego mainstreamu. Dla porz\u0105dku jednak, m\u00f3wimy tutaj o \u015awi\u0119tym Graalu dekompozycji oprogramowania &#8211; platformie, w ramach kt\u00f3rej osobno skalujemy nie monolity, nie serwisy, ale pojedyncze funkcje. Przez to, \u017ce operujemy z artefaktami, kt\u00f3re realnie maj\u0105 pojedyncze wej\u015bcie\/wyj\u015bcie, dostajemy (uwaga: du\u017ce uproszczenie) dwie du\u017ce zalety. <\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Po pierwsze model p\u0142atno\u015bci &#8211; p\u0142acimy per u\u017cycie konkretnej funkcji, co oznacza niedost\u0119pny w innych modelach spos\u00f3b poziom auto-skalowania &#8211; nie ma ruchu, nie \u017cadnych ma koszt\u00f3w. <\/li><li>Po drugie &#8211; brak narzutu na utrzymanie. To dostawca \u015brodowiska uruchomieniowego martwi si\u0119 tym, \u017ceby na ka\u017cdego nowego klienta u\u017cywaj\u0105cego Waszej aplikacji czeka\u0142a moc obliczeniowa.<\/li><\/ul>\n\n\n\n<p>Oczywi\u015bcie, \u017ceby nie by\u0142o za s\u0142odko, skoro by\u0142y dwie zalety to czas na dwie wady. Po pierwsze, dekompozycja do atomowych wr\u0119cz element\u00f3w sk\u0142adowych powoduje, \u017ce naprawd\u0119 ci\u0119\u017cko jest tak\u0105 aplikacj\u0105 zarz\u0105dza\u0107 bez odpowiednich narz\u0119dzi. Po drugie (i na tym si\u0119 skupimy w tym tek\u015bcie), aplikacje serverless cechuj\u0105 si\u0119 tak zwanym problemem &#8222;zimnego startu&#8221;. Sami wiecie, \u017ce aplikacje napisane w Javie &#8211; zanim jeszcze b\u0119d\u0105 w stanie &#8222;przyjmowa\u0107&#8221; ruch &#8211; zwykle potrzebuj\u0105 troch\u0119 czasu na rozruch. Jest to zwi\u0105zane z  modelem dzia\u0142ania JVM i b\u0119dziemy stopniowo sobie przez poszczeg\u00f3lne problemy przechodzi\u0107. Na ten moment jednak wa\u017cne dla nas jest to, \u017ce ka\u017cdorazowe odpalanie &#8222;zimnej&#8221; maszyny wirtualnej na potrzeby uruchomienia pojedynczej funkcji jest rozwi\u0105zaniem nieakceptowalnym z punktu widzenia op\u00f3\u017anie\u0144, jakie by si\u0119 z tym wi\u0105za\u0142y. Teraz czas si\u0119 przygl\u0105dn\u0105\u0107, jak to jest wi\u0119c w og\u00f3le mo\u017cliwe, \u017ce istniej\u0105 jakie\u015b funkcje Serverless napisane w Javie.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-2.png\" alt=\"\" class=\"wp-image-12675\" width=\"540\" height=\"624\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-2.png 540w, https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-2-260x300.png 260w\" sizes=\"auto, (max-width: 540px) 100vw, 540px\" \/><figcaption>Jak Wam ma\u0142o, to w zasadzie internet w pewnym momencie zosta\u0142 wr\u0119cz zalany tekstami dotycz\u0105cymi serverlessa z ca\u0142\u0105 towarzysz\u0105c\u0105 mu przybud\u00f3wk\u0105. Wady i zalety tej architektury dobrze opisuje cho\u0107by Cloudflare w swoim <a href=\"https:\/\/www.cloudflare.com\/en-gb\/learning\/serverless\/why-use-serverless\/\">Why use serverless computing? | Pros and cons of serverless<\/a>.<\/figcaption><\/figure><\/div>\n\n\n<h2 id=\"jak-java-dotychczasowo-probowala-sobie-z-tym-poradzic\" data-num=2>Jak Java dotychczasowo pr\u00f3bowa\u0142a sobie z tym poradzi\u0107<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Natywne rozwi\u0105zania AWS Lambda<\/h3>\n\n\n\n<p>To nie jest jednak tak, \u017ce wspomniany Cold Start zupe\u0142nie eliminuje JVM ze \u015brodowiska AWS Lambda. Po pierwsze, powinni\u015bmy pami\u0119ta\u0107, \u017ce zimny start dotyczy tylko wybranych wywo\u0142a\u0144 funkcji Lambda. Funkcje Lambda mog\u0105 by\u0107 po pierwszym uruchomieniu pozostaj\u0105 rozgrzane przez jaki\u015b czas &#8211; znaczy to, \u017ce raz uruchomiony runtime jest dzielony mi\u0119dzy wykonaniami. Po jakim\u015b okresie nieaktywno\u015bci runtime jest &#8222;zabijany&#8221;, istniej\u0105 jednak sposoby na jego utrzymanie przy \u017cyciu.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/JUIsCzo.jpg\" alt=\"\" width=\"420\" height=\"380\"\/><figcaption>Niekt\u00f3re rozwi\u0105zania bywaj\u0105 do\u015b\u0107&#8230; nieszablonowe.<\/figcaption><\/figure><\/div>\n\n\n<p>Sam Amazon dzieli si\u0119 sposobami na to, aby wycisn\u0105\u0107 z javowych Lambda maksimum efektu w publikacji <a href=\"https:\/\/aws.amazon.com\/blogs\/compute\/optimizing-aws-lambda-function-performance-for-java\/\">Optimizing AWS Lambda function performance for Java<\/a>. Jako szczeg\u00f3lnie przydatne wskazywane jest odpowiednie ustawienie poziomu kompilacji na taki zapewniaj\u0105cy maksymalne mo\u017cliwe do osi\u0105gni\u0119cia efekty w kr\u00f3tkim okresie czasu dzi\u0119ki ustawieniu zmiennej \u015brodowiskowej <code>JAVA_TOOL_OPTIONS to \u201c-XX:+TieredCompilation -XX:TieredStopAtLevel=1\u201d<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">(Application) Class Data Sharing<\/h3>\n\n\n\n<p>To nie jest jednak tak, \u017ce przez lata byli\u015bmy pozostawieni na pastw\u0119 &#8222;generycznych&#8221; rozwi\u0105za\u0144, kt\u00f3re zapewnia nam Amazon (jak utrzymanie rozgrzanych \u015brodowisk uruchomieniowych) lub od zawsze by\u0142y w JVM (jak Tiered Compilation). Wr\u0119cz przeciwnie &#8211; tw\u00f3rcy JDK bardzo szybko (ju\u017c w okolicach JDK 9) zrozumieli, \u017ce nisza serverless mocno im ucieka, dlatego zacz\u0119li dba\u0107 o to, aby runtime j\u0119zyka stawa\u0142 si\u0119 jak najbardziej Cloud-Native, bo modne to i nowoczesne. Dlatego te\u017c w JDK 10 pojawi\u0142 si\u0119 tak zwany AppCDS &#8211; Application Class Data Sharing, kt\u00f3rego uznaje za pierwsz\u0105 pr\u00f3b\u0119 takiej optymalizacji.<\/p>\n\n\n\n<p>Czym jest AppCDS? Funkcjonalno\u015b\u0107 ta nadbudowuje nad istniej\u0105cym od czasu JDK 1.5 Class-Data Sharing. Nie jest bowiem tak, \u017ce to dopiero w dobie Serverlessa zacz\u0119li\u015bmy si\u0119 przejmowa\u0107 czasem uruchomienia naszych aplikacji &#8211; po prostu kiedy\u015b owoce wisia\u0142y nieco ni\u017cej. Za ka\u017cdym razem bowiem, kiedy uruchamiana jest JVM, niezb\u0119dne jest za\u0142adowanie klas wchodz\u0105cych w sk\u0142ad runtime j\u0119zyka &#8211; min. pakietu <code>java.lang<\/code>, ale nie tylko. Te pozostaj\u0105 praktycznie takie same niezale\u017cnie od procesu, dlatego zamiast za ka\u017cdym razem zajmowa\u0107 si\u0119 ich inicjalizacja, mo\u017cna zrzuci\u0107 efekt ko\u0144cowy na dysk w formie archiwum i by\u0107 w stanie odczyta\u0107 go podczas uruchomienia. Pocz\u0105tkowo dotyczy\u0142o to tylko i wy\u0142\u0105cznie w\u0142a\u015bnie klas wewn\u0119trznych Javy, ale wraz z JDK 10 mechanizm ten zosta\u0142 rozszerzony r\u00f3wnie\u017c o klasy tworzone przez tw\u00f3rc\u00f3w aplikacji. Optymalizacja ta idealnie wpisuje si\u0119 w powtarzalny proces releas\u00f3w chmurowych, cho\u0107 bardziej w wypadku &#8222;zwyk\u0142ych&#8221; serwer\u00f3w, ni\u017c funkcji Lambda. Pokazuje to jednak \u015bcie\u017ck\u0119, kt\u00f3r\u0105 b\u0119d\u0105 u\u017cywa\u0142y kolejne przyk\u0142ady &#8211; cache. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-3.png\" alt=\"\" class=\"wp-image-12678\" width=\"350\" height=\"408\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-3.png 700w, https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-3-258x300.png 258w\" sizes=\"auto, (max-width: 350px) 100vw, 350px\" \/><figcaption>Ale i do serveless te\u017c da si\u0119 jej u\u017cy\u0107, <a href=\"https:\/\/blog.jdbevan.com\/2020\/09\/30\/java-11-appcds-example-with-gradle\/\">jak pokazuje min. Jon Bevan<\/a>. Funkcje Lambda pozwalaj\u0105 naprawd\u0119 na du\u017co w AWS.<\/figcaption><\/figure><\/div>\n\n\n<p>Wi\u0119cej o CDS i AppCDS dowiedzie\u0107 mo\u017cecie si\u0119 z <a href=\"dev.java\">dev.java<\/a>, gdzie <a href=\"https:\/\/dev.java\/learn\/class-data-sharing-and-application-class-data-sharing-in-hotspot\/\">zosta\u0142y w przyst\u0119pny spos\u00f3b opisane<\/a>. Bardzo dobr\u0105 publikacj\u0119 w temacie praktycznych u\u017cy\u0107 Application Class Data-Sharing stworzy\u0142 za\u015b <a href=\"https:\/\/nipafx.dev\/java-application-class-data-sharing\/\">Nicolai Parlog<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Class Pre-Initialization<\/h3>\n\n\n\n<p>Tutaj bardziej w formie ciekawostki, ale troch\u0119 nie mog\u0142em si\u0119 powstrzyma\u0107. We wrze\u015bniu tego roku Alibaba og\u0142osi\u0142a wsp\u00f3ln\u0105 inicjatyw\u0119 z Google &#8211; <a href=\"https:\/\/www.alibabacloud.com\/blog\/a-short-exploration-of-java-class-pre-initialization_599378\">FastStartup Incubator project, czyli pr\u00f3b\u0119 u\u017cycia Class Pre-Initialization do optymalizacji zimnego startu<\/a>. Tak jak wspomnia\u0142em w poprzedniej sekcji, wi\u0119kszo\u015b\u0107 metod optymalizacyjnych zimnego startu opiera si\u0119 na jakiej\u015b formie cache. Z cache jest jednak taki problem, \u017ce aby w bezpieczny spos\u00f3b by\u0107 go w stanie u\u017cy\u0107, niezb\u0119dna jest pewno\u015b\u0107, \u017ce klasa nie ma jakich\u015b side-effekt\u00f3w. Maj\u0105c t\u0105 informacj\u0119, potencjalnie jeste\u015bmy w stanie dokonywa\u0107 bardziej agresywnych optymalizacji. Z tego powodu istniej\u0105cy mechanizm Pre-Inicjalizacji klas mo\u017ce by\u0107 u\u017cywany tylko do \u015bci\u015ble zdefiniowanej listy klas.<\/p>\n\n\n\n<p>Dlatego te\u017c obie firmy chc\u0105 da\u0107 adnotacj\u0119 <code>jdk.internal.vm.annotation.Preserve<\/code> lub\/i mo\u017cliwo\u015b\u0107 przekazania listy klas, kt\u00f3re mog\u0105 by\u0107 bezpiecznie pre-initaljzowane. Dzi\u0119ki temu obecne w Javie metody optymalizacyjne b\u0119d\u0105 po prostu mog\u0142y by\u0107 stosowane szerzej. FastStartup Incubator znajduje si\u0119 we wczesnej fazie, ale zar\u00f3wno Google, jak i Alibaba &#8211; jako, \u017ce obie firmy posiadaj\u0105 w\u0142asne chmury &#8211; maj\u0105 du\u017ce motywacje (\ud83d\udcb5) aby pcha\u0107 go do przodu.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Natywne obrazy &#8211; Project Leyden, Ahead-of-Time Compilation, GraalVM<\/h3>\n\n\n\n<p>Skoro inicjalizacja klas i classpatha zajmuje tyle czasu, to mo\u017ce najlepiej si\u0119 jej po prostu pozby\u0107 i wszystko od razu wrzuca\u0107 do binarki?<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"536\" height=\"499\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-4.png\" alt=\"\" class=\"wp-image-12689\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-4.png 536w, https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-4-300x279.png 300w\" sizes=\"auto, (max-width: 536px) 100vw, 536px\" \/><\/figure><\/div>\n\n\n<p>Id\u0105c tym tropem kolejn\u0105, cz\u0119sto u\u017cywan\u0105 dzi\u015b metod\u0105 jest wykorzystanie Custom Runtime Lambdy i GraalVM do stworzenia natywnego obrazu. Takowe cechuj\u0105 si\u0119 tym, \u017ce pe\u0142n\u0105 wydajno\u015b\u0107 osi\u0105gaj\u0105 od momentu uruchomienia, a czas rozruchu jest w nich mocno skr\u00f3cony w stosunku do standardowych aplikacji javowych. W internecie znajdziecie wiele tekst\u00f3w po\u015bwi\u0119conych temu podej\u015bciu, metoda jest dobrze opisana min. przez Arnolda Galovicsa w jego tek\u015bcie <a href=\"https:\/\/arnoldgalovics.com\/java-cold-start-aws-lambda-graalvm\/\">Tackling Java Cold Startup Times On AWS Lambda With GraalVM<\/a>. Je\u017celi kiedykolwiek interesowali\u015bcie si\u0119 optymalizacj\u0105 zimnego startu w Javie, to prawodopodbnie w\u0142a\u015bnie ta metoda Wam si\u0119 o uszy obi\u0142a.<\/p>\n\n\n\n<p>Problem z kompilacj\u0105 AoT jest taki, \u017ce o ile umo\u017cliwia ona osi\u0105gni\u0119cie pewnego bazowego poziomu wydajno\u015bci, to jednak nie jest to proces tak optymalny jak ten oparty o kompilacje Just-In-Time. Wynika to z faktu, \u017ce aplikacja ju\u017c uruchomiona jest w stanie dokonywa\u0107 optymalizacji specyficznych dla sposobu u\u017cycia &#8211; i robi to w oparciu o informacje, do kt\u00f3rych kompilator dzia\u0142aj\u0105cy na zimno po prostu nie ma dost\u0119pu. To by\u0142oby pewnie do prze\u0142kni\u0119cia w przypadku Serverless, ale GraalVM (i ca\u0142e AoT) wymaga od u\u017cytkownik\u00f3w r\u00f3wnie\u017c zmiany we w\u0142asnych przyzwyczajeniach, zw\u0142aszcza je\u015bli chodzi np. o u\u017cycie Reflection API.<\/p>\n\n\n\n<p>My\u015bl\u0119, \u017ce o AoT ju\u017c wystarczy, bo ta metoda optymalizacji pozostaje mocno poza zakresem tego wydania i umie\u015bci\u0142em j\u0105 tutaj g\u0142\u00f3wnie dla porz\u0105dku. Wi\u0119cej o powy\u017cszych mo\u017cecie przeczyta\u0107 w jednym z poprzednich wyda\u0144 JVM Weekly: <a href=\"https:\/\/vived.io\/how-committing-graalvm-to-openjdk-changes-the-rules-for-project-leyden-jvm-weekly-110\/ \">How committing GraalVM to OpenJDK changes the rules for Project Leyden<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">CRIU<\/h3>\n\n\n\n<p>Nieco kluczymy, ale powoli zbli\u017camy si\u0119 ju\u017c do meritum. Metody jak Fast Startup czy AppCDS s\u0142u\u017cy\u0142y do cache&#8217;owania poszczeg\u00f3lnych fragment\u00f3w runtime JVM-a. <a href=\"https:\/\/criu.org\/Main_Page\">Checkpoint\/Restore in Userspace (CRIU)<\/a> to funkcja Linuxa, kt\u00f3ra umo\u017cliwia wykonanie &#8222;zrzutu&#8221; na dysk ca\u0142ego dzia\u0142aj\u0105cego procesu aplikacji. Nast\u0119pnie, kolejna instancja mo\u017ce by\u0107 uruchomiona z tego punktu, w kt\u00f3rym wykonano wspomniany zrzut, co skraca czas rozruchu.<\/p>\n\n\n\n<p>Mam w\u015br\u00f3d czytelnik\u00f3w jakich\u015b retro-graczy? Je\u015bli tak, to ca\u0142o\u015b\u0107 dzia\u0142a w podobny spos\u00f3b jak funkcjonalno\u015b\u0107 Save State w emulatorach. Metody takie jak AppCDS przypominaj\u0105 klasyczne zapisywanie &#8211; wybieramy te fragmenty, kt\u00f3re pozwol\u0105 nam p\u00f3\u017aniej odtworzy\u0107 stan aplikacji, i tylko je zapisujemy. Save State nie bawi si\u0119 w takie finezje &#8211; jako, \u017ce komputery posz\u0142y do przodu i mamy wi\u0119cej przestrzeni dyskowej, to po prostu zrzucamy ca\u0142y stan pami\u0119ci na dysk i potem sobie odtwarzamy 1:1 gdy jest to potrzebne. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-5-1024x488.png\" alt=\"\" class=\"wp-image-12693\" width=\"768\" height=\"366\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-5-1024x488.png 1024w, https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-5-300x143.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-5-768x366.png 768w, https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-5-1536x732.png 1536w, https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-5-2048x976.png 2048w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><figcaption>Tak dzia\u0142a r\u00f3wnie\u017c w\u0142a\u015bnie CRIU.<\/figcaption><\/figure><\/div>\n\n\n<p>CRIU posiada swoje problemy &#8211; zar\u00f3wno z punktu widzenia bezpiecze\u0144stwa, jak i wygody u\u017cytkowania &#8211; m\u00f3wimy tutaj bowiem o generycznej funkcji systemu operacyjnego, znajduj\u0105cej si\u0119 poza JVM. Ka\u017cda aplikacja ma za\u015b nieco inn\u0105 charakterystyk\u0119 i w zale\u017cno\u015bci od tego, czy m\u00f3wimy o serwerze aplikacyjnym, aplikacji webowej czy batchowym jobie zapis na dysk powinien odbywa\u0107 si\u0119 w innym momencie, kt\u00f3ry mo\u017ce by\u0107 trudny do wychwycenia bez kontekstu maszyny wirtualnej. Jak pisze OpenLiberty w swoim tek\u015bcie <a href=\"https:\/\/openliberty.io\/blog\/2020\/02\/12\/faster-startup-Java-applications-criu.html\">Faster start-up for Java applications on Open Liberty with CRIU<\/a>:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>It would be useful to have an API so that the application can specify when it would like a snapshot to be taken; this would be a valuable addition to the Java specification.<\/p><\/blockquote>\n\n\n\n<p>No to teraz najwy\u017csza pora przej\u015b\u0107 do CRaC!<\/p>\n\n\n\n<p>PS: Je\u017celi chcecie dowiedzie\u0107 si\u0119 wi\u0119cej o CRiU, Christine Flood z RedHata nagra\u0142a dog\u0142\u0119bnego talka  <a href=\"https:\/\/www.youtube.com\/watch?v=XXbJNaFF-8A\">CRIU and Java opportunities and challenges<\/a> o kontek\u015bcie u\u017cycia tej technologii w Javie.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">CRaC<\/h3>\n\n\n\n<p>No i dochodzimy do ko\u0144cowej \u015bcie\u017cki naszej podr\u00f3\u017cy po optymalizacjach JVM-a. CRaC (Coordinated Restore at Checkpoint) to w\u0142a\u015bnie bowiem API, o kt\u00f3rym wspomniane by\u0142o w poprzedniej sekcji. Pozwala on na utworzenie &#8222;checkpointu&#8221; &#8211; czyli wspomnianego zrzutu pami\u0119ci &#8211; w dowolnym momencie pracy aplikacji zdefiniowanym przez tw\u00f3rc\u0119 oprogramowania, za pomoc\u0105 komendy:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>jcmd target\/spring-boot-0.0.1-SNAPSHOT.jar JDK.checkpoint<\/code><\/pre>\n\n\n\n<p>Pozwala r\u00f3wnie\u017c na obs\u0142u\u017cenie, jak aplikacja ma si\u0119 zachowa\u0107 w momencie tworzenia checkpointu i jego odtworzenia, pozwala wi\u0119c na zarz\u0105dzenie jej stanem.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import jdk.crac.Context;\nimport jdk.crac.Core;\nimport jdk.crac.Resource;\n\nclass ServerManager implements Resource {\n...\n   @Override\n   public void beforeCheckpoint(Context&lt;? extends Resource&gt; context) throws Exception {\n       server.stop();\n   }\n\n   @Override\n   public void afterRestore(Context&lt;? extends Resource&gt; context) throws Exception {\n       server.start();\n   }\n}\n<\/code><\/pre>\n\n\n\n<p>W kontek\u015bcie tego tekstu, wa\u017cna jest geneza CRaC. Od bardzo wczesnych etap\u00f3w zaanga\u017cowani byli w niego bowiem in\u017cynierowie Amazona z zespo\u0142u Corretto (ichniejszej implementacji JDK). <a href=\"https:\/\/mail.openjdk.org\/pipermail\/discuss\/2021-July\/005863.html\">Lista mailingowa OpenJDK ju\u017c od pewnego czasu<\/a> zawiera\u0142a wi\u0119c przecieki o tym, \u017ce Amazon pracuje nad ulepszeniem wsparcia dla Javy w aplikacjach Serverless. W jaki spos\u00f3b Lambda chce u\u017cywa\u0107 CRaC? Tutaj trzeba si\u0119 przygl\u0105dn\u0105\u0107, jak AWS Lambda dzia\u0142a pod spodem.<\/p>\n\n\n\n<h2 id=\"jak-zbudowana-jest-aws-lambda\" data-num=3>Jak zbudowana jest AWS Lambda?<\/h2>\n\n\n\n<p>Swego czasu powstawa\u0142o bardzo du\u017co projekt\u00f3w, kt\u00f3re pr\u00f3bowa\u0142y symulowa\u0107 dzia\u0142anie AWS Lambdy (i innych serverless\u00f3w) w ramach np. takiego Kubernetesa. Tak naprawd\u0119 jednak bardzo trudno zapewni\u0107 im by\u0142o do\u015bwiadczenie cho\u0107by zbli\u017cone do tego zapewnianego przez produkt Amazonu. Wynika to z tego, \u017ce zamiast wykorzystywa\u0107 generyczne kontenery, AWS postawi\u0142 na dedykowane, zoptymalizowane pod Serverless \u015brodowisko uruchomieniowe. Z takiego w\u0142a\u015bnie podej\u015bcia wynika wi\u0119kszo\u015b\u0107 proponowanych przez firm\u0119 innowacji Lambdy, tak trudnych do zreplikowania przez generyczne rozwi\u0105zania.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"440\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-7.png\" alt=\"\" class=\"wp-image-12701\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-7.png 500w, https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-7-300x264.png 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><figcaption>Bo tak na poziomie koncepcji, to powy\u017csze jest smutn\u0105 prawd\u0105. Ale diabe\u0142 tkwi w szczeg\u00f3\u0142ach \ud83d\ude08<\/figcaption><\/figure><\/div>\n\n\n<p>Runtime Lambdy sk\u0142ada si\u0119 z masy \u015bci\u015ble wyspecjalizowanych komponent\u00f3w. Przyk\u0142adowo, jako infrastruktura u\u017cywane s\u0105 EC2 Nitro. S\u0105 to maszyny bare-metal pozbawionych narzutu wirtualizacji (jak to mia\u0142oby miejsce w wypadku EC2 typu T, kt\u00f3re s\u0105 najcz\u0119\u015bciej u\u017cywane w przypadku takiego Eleastic Container Storage). Na nich uruchamiany jest projekt Firecracker &#8211;&nbsp; wyspecjalizowane, przeznaczone pod zastosowania w serverless mikro-maszyny wirtualne. Zapewniaj\u0105 one&nbsp; izolacje proces\u00f3w i s\u0105 w stanie posiada\u0107 wsp\u00f3lny kontekst uruchomieniowy. Dzi\u0119ki temu Amazon jest w stanie zapewni\u0107, \u017ce po pocz\u0105tkowym rozgrzaniu pierwszej instancji, kolejne b\u0119d\u0105 uruchamia\u0142y si\u0119 ju\u017c znacznie szybciej. Firecracker za\u015b&nbsp; zarz\u0105dza w granularny spos\u00f3b tym, kt\u00f3re fragmenty powinny by\u0107 reu\u017cywane, a kt\u00f3re musz\u0105 by\u0107 ka\u017cdorazowo tworzone od nowa.<\/p>\n\n\n\n<p>To jest oczywi\u015bcie przej\u015bcie przez temat bardzo &#8222;po \u0142ebkach&#8221;, bo to te\u017c JVM-owy przegl\u0105d, a nie publikacja dla architekt\u00f3w w\u0142asnej chmury Serverless. Je\u015bli jednak jeste\u015bcie rz\u0105dni wi\u0119kszej ilo\u015bci detali &#8211; <a href=\"https:\/\/www.bschaatsbergen.com\/behind-the-scenes-lambda\/\">Behind the scenes, Lambda<\/a> to publikacja, kt\u00f3rej szukacie.<\/p>\n\n\n\n<h2 id=\"no-dobra-to-jak-dziala-snapstart\" data-num=4>No dobra, to jak dzia\u0142a SnapStart<\/h2>\n\n\n\n<p>To skoro wszystkie pionki mamy ma ju\u017c na planszy, to wreszcie porozmawiajmy sobie o najnowszej innowacji ze strony Amazona, jak\u0105 jest AWS Lambda SnapStart.<\/p>\n\n\n\n<p>Wykonanie ka\u017cdej funkcji Lambda sk\u0142ada si\u0119 z trzech faz &#8211; Init (rz\u0105dz\u0105cej si\u0119 <a href=\"https:\/\/bitesizedserverless.com\/bite\/when-is-the-lambda-init-phase-free-and-when-is-it-billed\/\">do\u015b\u0107 specyficznymi prawami<\/a>), Invoke oraz Shutdown. Bootstrap \u015brodowiska w ramach pierwszej z nich polega na przygotowanie ca\u0142ego \u015brodowiska do stanu, w kt\u00f3rym jest w stanie przyjmowa\u0107 ruch. SnapStart w tym momencie stan pami\u0119ci lambdy zapisuje i odk\u0142ada &#8222;na p\u00f3\u017aniej&#8221;, gdy nasza funkcja nie b\u0119dzie wystarczaj\u0105co rozgrzana. Robi to za pomoc\u0105 wspomnianego ju\u017c CRIU, a w pierwszej wersji wspiera w\u0142a\u015bnie Jav\u0119 dzi\u0119ki CRaC API. Ca\u0142o\u015b\u0107 pod spodem u\u017cywa za\u015b mechanizmu <a href=\"https:\/\/github.com\/firecracker-microvm\/firecracker\/blob\/main\/docs\/snapshotting\/snapshot-support.md\">snapshottingu udost\u0119pnianego przez Firecracker<\/a>, a wspomniane API CRaC pomaga w sytuacji, gdy niezb\u0119dne jest od\u015bwie\u017cenie snapshotu &#8211; <a href=\"https:\/\/docs.aws.amazon.com\/lambda\/latest\/dg\/snapstart-runtime-hooks.html\">AWS Lambda udost\u0119pnia odpowiednie hooki<\/a>.<\/p>\n\n\n\n<p>Oczywi\u015bcie, s\u0105 tutaj pewne wyzwania o kt\u00f3rych trzeba pami\u0119ta\u0107. Standardowa losowo\u015b\u0107 w Javie generuje seeda w momencie inicjalizacji, jako \u017ce operujemy na zrzucie pami\u0119ci to wszystkie wyniki operacji pseudolosowych b\u0119d\u0105 takie same, czyni\u0105c <code>java.util.Random<\/code> raczej bezu\u017cytecznym. Jednak Amazon zadba\u0142 o to, aby taki np. <code>java.security.SecureRandom<\/code> zachowywa\u0142 si\u0119 prawid\u0142owo, ale je\u015bli jaka\u015b z u\u017cywanych przez Was bibliotek u\u017cywa klasycznego <code>Random<\/code>&#8230;<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"820\" height=\"257\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-6.png\" alt=\"\" class=\"wp-image-12699\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-6.png 820w, https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-6-300x94.png 300w, https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-6-768x241.png 768w\" sizes=\"auto, (max-width: 820px) 100vw, 820px\" \/><figcaption>Ju\u017c widz\u0119 te pytania na StackOverflow &#8211; &#8222;Dlaczego moja Lambda zawsze generuje ten sam ci\u0105g znak\u00f3w&#8221;.<\/figcaption><\/figure><\/div>\n\n\n<p>Innym ciekaw\u0105 mo\u017cliwo\u015bci\u0105, kt\u00f3r\u0105 daje SnapStart, jest mo\u017cliwo\u015b\u0107 &#8222;rozgrzania&#8221; funkcji za pomoc\u0105 kompilatora Just-in-Time na zewn\u0119trznej maszynie i dostarczenia go funkcji Lambda razem z aplikacj\u0105. Umo\u017cliwia to zapewnienie im maksymalnej wydajno\u015bci, przekraczaj\u0105cej t\u0105, kt\u00f3r\u0105 zapewni\u0107 mo\u017ce kompilacja Ahead-of-Time. Z pewno\u015bci\u0105 jednak najwi\u0119ksze wra\u017cenie robi skr\u00f3cenie Cold Startu. M\u00f3wimy tutaj bowiem o a\u017c 10-krotnym skr\u00f3ceniu czasu uruchomienia. R\u00f3\u017cnica mi\u0119dzy zimn\u0105, a rozgrzan\u0105 funkcj\u0105 severless staje si\u0119 w ten spos\u00f3b praktycznie pomijalna w wi\u0119kszo\u015bci przypadk\u00f3w.<\/p>\n\n\n\n<p>Amazon oczywi\u015bcie dostarczy\u0142 dokumentacje. Ca\u0142o\u015b\u0107 w\u0142\u0105cza si\u0119 pojedyncz\u0105 flag\u0105 w YAML&#8217;u, ale oczywi\u015bcie mo\u017cliwie jest dopasowanie procesu pod siebie, min. wspomnianymi Hookami. Dobrym punktem startu b\u0119dzie <a href=\"https:\/\/aws.amazon.com\/blogs\/compute\/reducing-java-cold-starts-on-aws-lambda-functions-with-snapstart\/\">oficjalny post wprowadzaj\u0105cy od Amazonu<\/a>.<\/p>\n\n\n\n<h2 id=\"na-zakonczenie-troche-detali-kto-na-czym-kiedy\" data-num=5>Na zako\u0144czenie troch\u0119 detali &#8211; kto, na czym, kiedy?<\/h2>\n\n\n\n<p>Je\u017celi chcecie dowiedzie\u0107 si\u0119 wi\u0119cej w temacie, chyba najlepszym obecnie miejsce wyja\u015bniaj\u0105cym zawi\u0142o\u015bci SnapStart jest <a href=\"https:\/\/airhacks.fm\/#episode_219\">Podcast Adama Biena airhack.fm<\/a>, w kt\u00f3rym rozmawia on z autorem powy\u017cszego wprowadzenia &#8211; <a href=\"https:\/\/twitter.com\/MarkSailes3\">Markiem Sailesem<\/a>, kt\u00f3ry zajmuje w Amazonie stanowisko Specialist Solutions Architect for Serverless. Rozmowa dotyka nie tylko samego SnapStart, ale tak\u017ce innych wyzwa\u0144, kt\u00f3re mog\u0105 spotka\u0107 ch\u0119tnych do spr\u00f3bowania \u015bwiata Serverless.<\/p>\n\n\n\n<p>Amazon pracowa\u0142 w sekrecie z partnerami i pierwszy z nich &#8211; Quarkus &#8211; ju\u017c <a href=\"https:\/\/quarkus.io\/blog\/quarkus-support-for-aws-lambda-snapstart\/\">pochwali\u0142 si\u0119 efektami<\/a>. Zesp\u00f3\u0142 pracuj\u0105cym nad projektem podzieli\u0142 si\u0119 nie tylko rozszerzeniem umo\u017cliwiaj\u0105cym u\u017cywanie SnapStart &#8211; kt\u00f3re pojawi\u0107 si\u0119 ma ju\u017c wersji eksperymentalnej w kolejnej edycji Quarkusa, wersji 2.15. Opr\u00f3cz tego podzielili si\u0119 oni swoimi wynikami, kt\u00f3re zdaj\u0105 si\u0119 potwierdza\u0107 wersj\u0119 Amazona o dziesi\u0119ciokrotnym przyspieszeniu. Skoro w miar\u0119 szybko startuj\u0105cy Quarkus mo\u017ce si\u0119 pochwali\u0107 takimi wzrostami, ciekawe jak b\u0119dzie to wygl\u0105da\u0142o w przypadku takiego (produkcyjnego, nie &#8222;hello world&#8221; jak w przyk\u0142adzie od AWS) Springa.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"514\" height=\"499\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image.png\" alt=\"\" class=\"wp-image-12663\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image.png 514w, https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-300x291.png 300w\" sizes=\"auto, (max-width: 514px) 100vw, 514px\" \/><figcaption>Aczkolwiek u\u017cywanie Spring w Servelessie jest&#8230; interesuj\u0105cym wyborem.<\/figcaption><\/figure><\/div>\n\n\n<p>Pewnym ograniczeniem mo\u017ce by\u0107 dla niekt\u00f3rych fakt, \u017ce ca\u0142o\u015b\u0107 wspierane jest tylko przez Corretto (dystrybucja JDK by Amazon), i to wy\u0142\u0105cznie w wersji 11. Nie powinno Was to jednak przera\u017ca\u0107. Funkcje Lambda w tym momencie i tak nie wspieraj\u0105 JDK 17, a \u017ce ca\u0142o\u015b\u0107 i tak jest uruchamiana w kontrolowanym \u015brodowisku us\u0142ug AWS, nie by\u0142oby sensu udost\u0119pnia\u0107 go na inne dystrybucje. Amazon nie dzieli si\u0119, czy w samym Corretto pojawi\u0142y si\u0119 jakie\u015b modyfikacje niezb\u0119dne do dzia\u0142ania SnapStart.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Wiem ten artyku\u0142 ma troch\u0119 zaburzone proporcje wst\u0119pu-do-tre\u015bci, bardzo chcia\u0142em unikn\u0105\u0107 problemu poni\u017cszej sowy, tylko przeprowadzi\u0142em Was przez ca\u0142o\u015b\u0107 krok po kroku.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"530\" height=\"453\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-8.png\" alt=\"\" class=\"wp-image-12704\" srcset=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-8.png 530w, https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-8-300x256.png 300w\" sizes=\"auto, (max-width: 530px) 100vw, 530px\" \/><figcaption><a href=\"https:\/\/cdn.discordapp.com\/attachments\/984632500875821066\/1047816856116920351\/ArturSkowronski_rest_of_the_owl_5714a968-445b-4271-a86e-4a89a67deae5.png\">Chocia\u017c&#8230; @Midjourney Bot &#8211; &#8222;<em>imagine rest of the owl &#8211;v 4<\/em>&#8222;<\/a> \ud83e\udd37\ud83c\udffb<\/figcaption><\/figure><\/div>\n\n\n<p>Mam nadzieje, \u017ce lepiej teraz rozumiecie, na plecach jakich gigant\u00f3w stoi SnapSeed i co tam si\u0119 po drodze musia\u0142o wydarzy\u0107, \u017ceby w 2022 Amazon m\u00f3g\u0142 si\u0119 chwali\u0107 programistom JVM now\u0105 funkcjonalno\u015bci\u0105 swojej Lambdy. A za tydzie\u0144 mam nadzieje podsumujemy sobie bie\u017c\u0105czk\u0119, bo takowej si\u0119 troch\u0119 nazbiera\u0142o &#8211; chyba, \u017ce zbli\u017caj\u0105ca si\u0119 wielkimi krokami Rampdown JDK 20 czym\u015b nas mocno zaskoczy.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/CDuKBwZ.png\" alt=\"\" width=\"445\" height=\"134\"\/><figcaption>Aczkolwiek nie obiecuje sobi\u0119 ju\u017c na tym etapie za du\u017co \ud83d\ude04<\/figcaption><\/figure><\/div>","protected":false},"excerpt":{"rendered":"<p>Niekt\u00f3re nowo\u015bci nie robi\u0105 wra\u017cenia, dop\u00f3ki nie umie\u015bci si\u0119 ich w odpowiednim historycznym kontek\u015bcie. Tak jest ze AWS Lambda SnapStart. Dlatego postanowi\u0142em przybli\u017cy\u0107 dzisiaj drog\u0119, kt\u00f3r\u0105 ca\u0142a spo\u0142eczno\u015b\u0107 przesz\u0142a, aby Amazon m\u00f3g\u0142 si\u0119 pochwali\u0107 na re:Invent nowym featurem.<\/p>\n","protected":false},"author":10,"featured_media":12707,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[23,259],"tags":[],"class_list":["post-12629","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jvm","category-jvm-pl"],"acf":{"estimated_reading_time":"12","feature_image_blog":{"ID":12709,"id":12709,"title":"progress_image_80_05a15999-df3f-48dd-b63b-451e702be368","filename":"progress_image_80_05a15999-df3f-48dd-b63b-451e702be368.webp","filesize":253960,"url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/progress_image_80_05a15999-df3f-48dd-b63b-451e702be368.webp","link":"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/progress_image_80_05a15999-df3f-48dd-b63b-451e702be368\/","alt":"","author":"10","description":"","caption":"","name":"progress_image_80_05a15999-df3f-48dd-b63b-451e702be368","status":"inherit","uploaded_to":12629,"date":"2022-12-01 10:17:14","modified":"2022-12-01 10:17:14","menu_order":0,"mime_type":"image\/webp","type":"image","subtype":"webp","icon":"https:\/\/vived.io\/wp-includes\/images\/media\/default.png","width":1024,"height":1024,"sizes":{"thumbnail":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/progress_image_80_05a15999-df3f-48dd-b63b-451e702be368-150x150.webp","thumbnail-width":150,"thumbnail-height":150,"medium":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/progress_image_80_05a15999-df3f-48dd-b63b-451e702be368-300x300.webp","medium-width":300,"medium-height":300,"medium_large":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/progress_image_80_05a15999-df3f-48dd-b63b-451e702be368-768x768.webp","medium_large-width":768,"medium_large-height":768,"large":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/progress_image_80_05a15999-df3f-48dd-b63b-451e702be368-1024x1024.webp","large-width":1024,"large-height":1024,"1536x1536":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/progress_image_80_05a15999-df3f-48dd-b63b-451e702be368.webp","1536x1536-width":1024,"1536x1536-height":1024,"2048x2048":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/progress_image_80_05a15999-df3f-48dd-b63b-451e702be368.webp","2048x2048-width":1024,"2048x2048-height":1024,"gform-image-choice-sm":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/progress_image_80_05a15999-df3f-48dd-b63b-451e702be368.webp","gform-image-choice-sm-width":300,"gform-image-choice-sm-height":300,"gform-image-choice-md":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/progress_image_80_05a15999-df3f-48dd-b63b-451e702be368.webp","gform-image-choice-md-width":400,"gform-image-choice-md-height":400,"gform-image-choice-lg":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/progress_image_80_05a15999-df3f-48dd-b63b-451e702be368.webp","gform-image-choice-lg-width":600,"gform-image-choice-lg-height":600}},"weekly_summary":true,"push_notification_image":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/JVM-Weekly-1200x628_V2-1.png","feature_image_visible":true},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Droga do AWS Lambda SnapStart: lata optymalizacji &quot;zimnego startu&quot; JVM - JVM Weekly #115 - Vived<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Droga do AWS Lambda SnapStart: lata optymalizacji &quot;zimnego startu&quot; JVM - JVM Weekly #115 - Vived\" \/>\n<meta property=\"og:description\" content=\"Niekt\u00f3re nowo\u015bci nie robi\u0105 wra\u017cenia, dop\u00f3ki nie umie\u015bci si\u0119 ich w odpowiednim historycznym kontek\u015bcie. Tak jest ze AWS Lambda SnapStart. Dlatego postanowi\u0142em przybli\u017cy\u0107 dzisiaj drog\u0119, kt\u00f3r\u0105 ca\u0142a spo\u0142eczno\u015b\u0107 przesz\u0142a, aby Amazon m\u00f3g\u0142 si\u0119 pochwali\u0107 na re:Invent nowym featurem.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2022-12-01T10:17:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-12-01T10:19:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/JVM-Weekly-1200x628_V2-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Artur Skowro\u0144ski\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/\"},\"author\":{\"name\":\"Artur Skowro\u0144ski\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\"},\"headline\":\"Droga do AWS Lambda SnapStart: lata optymalizacji &#8222;zimnego startu&#8221; JVM &#8211; JVM Weekly #115\",\"datePublished\":\"2022-12-01T10:17:49+00:00\",\"dateModified\":\"2022-12-01T10:19:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/\"},\"wordCount\":3065,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/JVM-Weekly-1200x628_V2-1.png\",\"articleSection\":[\"JVM\",\"JVM\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/\",\"url\":\"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/\",\"name\":\"Droga do AWS Lambda SnapStart: lata optymalizacji \\\"zimnego startu\\\" JVM - JVM Weekly #115 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/JVM-Weekly-1200x628_V2-1.png\",\"datePublished\":\"2022-12-01T10:17:49+00:00\",\"dateModified\":\"2022-12-01T10:19:29+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/JVM-Weekly-1200x628_V2-1.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/JVM-Weekly-1200x628_V2-1.png\",\"width\":1200,\"height\":628},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Droga do AWS Lambda SnapStart: lata optymalizacji &#8222;zimnego startu&#8221; JVM &#8211; JVM Weekly #115\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/vived.io\/pl\/#website\",\"url\":\"https:\/\/vived.io\/pl\/\",\"name\":\"Vived\",\"description\":\"platform empowering IT people and technology companies to synergic growth\",\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/vived.io\/pl\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/vived.io\/pl\/#organization\",\"name\":\"Vived\",\"url\":\"https:\/\/vived.io\/pl\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png\",\"width\":136,\"height\":45,\"caption\":\"Vived\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\",\"name\":\"Artur Skowro\u0144ski\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g\",\"caption\":\"Artur Skowro\u0144ski\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Droga do AWS Lambda SnapStart: lata optymalizacji \"zimnego startu\" JVM - JVM Weekly #115 - Vived","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/","og_locale":"pl_PL","og_type":"article","og_title":"Droga do AWS Lambda SnapStart: lata optymalizacji \"zimnego startu\" JVM - JVM Weekly #115 - Vived","og_description":"Niekt\u00f3re nowo\u015bci nie robi\u0105 wra\u017cenia, dop\u00f3ki nie umie\u015bci si\u0119 ich w odpowiednim historycznym kontek\u015bcie. Tak jest ze AWS Lambda SnapStart. Dlatego postanowi\u0142em przybli\u017cy\u0107 dzisiaj drog\u0119, kt\u00f3r\u0105 ca\u0142a spo\u0142eczno\u015b\u0107 przesz\u0142a, aby Amazon m\u00f3g\u0142 si\u0119 pochwali\u0107 na re:Invent nowym featurem.","og_url":"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/","og_site_name":"Vived","article_published_time":"2022-12-01T10:17:49+00:00","article_modified_time":"2022-12-01T10:19:29+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/JVM-Weekly-1200x628_V2-1.png","type":"image\/png"}],"author":"Artur Skowro\u0144ski","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/"},"author":{"name":"Artur Skowro\u0144ski","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3"},"headline":"Droga do AWS Lambda SnapStart: lata optymalizacji &#8222;zimnego startu&#8221; JVM &#8211; JVM Weekly #115","datePublished":"2022-12-01T10:17:49+00:00","dateModified":"2022-12-01T10:19:29+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/"},"wordCount":3065,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/JVM-Weekly-1200x628_V2-1.png","articleSection":["JVM","JVM"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/","url":"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/","name":"Droga do AWS Lambda SnapStart: lata optymalizacji \"zimnego startu\" JVM - JVM Weekly #115 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/JVM-Weekly-1200x628_V2-1.png","datePublished":"2022-12-01T10:17:49+00:00","dateModified":"2022-12-01T10:19:29+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/JVM-Weekly-1200x628_V2-1.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/JVM-Weekly-1200x628_V2-1.png","width":1200,"height":628},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/droga-do-aws-lambda-snapstart-lata-optymalizacji-zimnego-startu-jvm-jvm-weekly-115\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"Droga do AWS Lambda SnapStart: lata optymalizacji &#8222;zimnego startu&#8221; JVM &#8211; JVM Weekly #115"}]},{"@type":"WebSite","@id":"https:\/\/vived.io\/pl\/#website","url":"https:\/\/vived.io\/pl\/","name":"Vived","description":"platform empowering IT people and technology companies to synergic growth","publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vived.io\/pl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/vived.io\/pl\/#organization","name":"Vived","url":"https:\/\/vived.io\/pl\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/","url":"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png","width":136,"height":45,"caption":"Vived"},"image":{"@id":"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3","name":"Artur Skowro\u0144ski","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g","caption":"Artur Skowro\u0144ski"}}]}},"blocks_vived":[{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>No c\u00f3\u017c, my\u015bla\u0142em, \u017ce po zesz\u0142otygodniowym wydaniu - w ca\u0142o\u015bci po\u015bwi\u0119conym Springowi - dzisiaj wezm\u0119 na warsztat jakie\u015b mniejsze tematy (cho\u0107by nazbiera\u0142o nam si\u0119 par\u0119 releas\u00f3w, min. nowy Gradle, ale nie tylko). \"Niestety\" odbywa si\u0119 AWS re:Invent, czyli najwi\u0119ksza coroczna impreza Amazonu. Zwykle dla \u015bwiata JVM ma ona znaczenie marginalne, ale jedno z og\u0142osze\u0144 jest na tyle ciekawe, \u017ce sko\u0144czy\u0142o si\u0119 jak zwykle...<\/p>\n","innerContent":["\n<p>No c\u00f3\u017c, my\u015bla\u0142em, \u017ce po zesz\u0142otygodniowym wydaniu - w ca\u0142o\u015bci po\u015bwi\u0119conym Springowi - dzisiaj wezm\u0119 na warsztat jakie\u015b mniejsze tematy (cho\u0107by nazbiera\u0142o nam si\u0119 par\u0119 releas\u00f3w, min. nowy Gradle, ale nie tylko). \"Niestety\" odbywa si\u0119 AWS re:Invent, czyli najwi\u0119ksza coroczna impreza Amazonu. Zwykle dla \u015bwiata JVM ma ona znaczenie marginalne, ale jedno z og\u0142osze\u0144 jest na tyle ciekawe, \u017ce sko\u0144czy\u0142o si\u0119 jak zwykle...<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":12665,"width":768,"height":422,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-1-1024x563.png\" alt=\"\" class=\"wp-image-12665\" width=\"768\" height=\"422\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-1-1024x563.png\" alt=\"\" class=\"wp-image-12665\" width=\"768\" height=\"422\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Amazon pokaza\u0142 bowiem AWS Lambda SnapStart - czyli dedykowane dla Lambdy rozwi\u0105zanie problemu zimnego startu. Dlatego dzisiaj porozmawiamy sobie o Serverlessie... i o tym, dlaczego tak ci\u0119\u017cko przez lata by\u0142o go efektywnie u\u017cywa\u0107 z Jav\u0105<\/p>\n","innerContent":["\n<p>Amazon pokaza\u0142 bowiem AWS Lambda SnapStart - czyli dedykowane dla Lambdy rozwi\u0105zanie problemu zimnego startu. Dlatego dzisiaj porozmawiamy sobie o Serverlessie... i o tym, dlaczego tak ci\u0119\u017cko przez lata by\u0142o go efektywnie u\u017cywa\u0107 z Jav\u0105<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>Co to jest \"Cold Start Problem\"?<\/h2>\n","innerContent":["\n<h2>Co to jest \"Cold Start Problem\"?<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Zak\u0142adam, \u017ce czytaj\u0105c ten tekst wiecie, czym s\u0105 funkcje Serverless. My\u015bl\u0119, \u017ce cho\u0107by taka Lambda wesz\u0142a ju\u017c do programistycznego mainstreamu. Dla porz\u0105dku jednak, m\u00f3wimy tutaj o \u015awi\u0119tym Graalu dekompozycji oprogramowania - platformie, w ramach kt\u00f3rej osobno skalujemy nie monolity, nie serwisy, ale pojedyncze funkcje. Przez to, \u017ce operujemy z artefaktami, kt\u00f3re realnie maj\u0105 pojedyncze wej\u015bcie\/wyj\u015bcie, dostajemy (uwaga: du\u017ce uproszczenie) dwie du\u017ce zalety. <\/p>\n","innerContent":["\n<p>Zak\u0142adam, \u017ce czytaj\u0105c ten tekst wiecie, czym s\u0105 funkcje Serverless. My\u015bl\u0119, \u017ce cho\u0107by taka Lambda wesz\u0142a ju\u017c do programistycznego mainstreamu. Dla porz\u0105dku jednak, m\u00f3wimy tutaj o \u015awi\u0119tym Graalu dekompozycji oprogramowania - platformie, w ramach kt\u00f3rej osobno skalujemy nie monolity, nie serwisy, ale pojedyncze funkcje. Przez to, \u017ce operujemy z artefaktami, kt\u00f3re realnie maj\u0105 pojedyncze wej\u015bcie\/wyj\u015bcie, dostajemy (uwaga: du\u017ce uproszczenie) dwie du\u017ce zalety. <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/list","attrs":[],"innerBlocks":[],"innerHTML":"\n<ul><li>Po pierwsze model p\u0142atno\u015bci - p\u0142acimy per u\u017cycie konkretnej funkcji, co oznacza niedost\u0119pny w innych modelach spos\u00f3b poziom auto-skalowania - nie ma ruchu, nie \u017cadnych ma koszt\u00f3w. <\/li><li>Po drugie - brak narzutu na utrzymanie. To dostawca \u015brodowiska uruchomieniowego martwi si\u0119 tym, \u017ceby na ka\u017cdego nowego klienta u\u017cywaj\u0105cego Waszej aplikacji czeka\u0142a moc obliczeniowa.<\/li><\/ul>\n","innerContent":["\n<ul><li>Po pierwsze model p\u0142atno\u015bci - p\u0142acimy per u\u017cycie konkretnej funkcji, co oznacza niedost\u0119pny w innych modelach spos\u00f3b poziom auto-skalowania - nie ma ruchu, nie \u017cadnych ma koszt\u00f3w. <\/li><li>Po drugie - brak narzutu na utrzymanie. To dostawca \u015brodowiska uruchomieniowego martwi si\u0119 tym, \u017ceby na ka\u017cdego nowego klienta u\u017cywaj\u0105cego Waszej aplikacji czeka\u0142a moc obliczeniowa.<\/li><\/ul>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Oczywi\u015bcie, \u017ceby nie by\u0142o za s\u0142odko, skoro by\u0142y dwie zalety to czas na dwie wady. Po pierwsze, dekompozycja do atomowych wr\u0119cz element\u00f3w sk\u0142adowych powoduje, \u017ce naprawd\u0119 ci\u0119\u017cko jest tak\u0105 aplikacj\u0105 zarz\u0105dza\u0107 bez odpowiednich narz\u0119dzi. Po drugie (i na tym si\u0119 skupimy w tym tek\u015bcie), aplikacje serverless cechuj\u0105 si\u0119 tak zwanym problemem \"zimnego startu\". Sami wiecie, \u017ce aplikacje napisane w Javie - zanim jeszcze b\u0119d\u0105 w stanie \"przyjmowa\u0107\" ruch - zwykle potrzebuj\u0105 troch\u0119 czasu na rozruch. Jest to zwi\u0105zane z  modelem dzia\u0142ania JVM i b\u0119dziemy stopniowo sobie przez poszczeg\u00f3lne problemy przechodzi\u0107. Na ten moment jednak wa\u017cne dla nas jest to, \u017ce ka\u017cdorazowe odpalanie \"zimnej\" maszyny wirtualnej na potrzeby uruchomienia pojedynczej funkcji jest rozwi\u0105zaniem nieakceptowalnym z punktu widzenia op\u00f3\u017anie\u0144, jakie by si\u0119 z tym wi\u0105za\u0142y. Teraz czas si\u0119 przygl\u0105dn\u0105\u0107, jak to jest wi\u0119c w og\u00f3le mo\u017cliwe, \u017ce istniej\u0105 jakie\u015b funkcje Serverless napisane w Javie.<\/p>\n","innerContent":["\n<p>Oczywi\u015bcie, \u017ceby nie by\u0142o za s\u0142odko, skoro by\u0142y dwie zalety to czas na dwie wady. Po pierwsze, dekompozycja do atomowych wr\u0119cz element\u00f3w sk\u0142adowych powoduje, \u017ce naprawd\u0119 ci\u0119\u017cko jest tak\u0105 aplikacj\u0105 zarz\u0105dza\u0107 bez odpowiednich narz\u0119dzi. Po drugie (i na tym si\u0119 skupimy w tym tek\u015bcie), aplikacje serverless cechuj\u0105 si\u0119 tak zwanym problemem \"zimnego startu\". Sami wiecie, \u017ce aplikacje napisane w Javie - zanim jeszcze b\u0119d\u0105 w stanie \"przyjmowa\u0107\" ruch - zwykle potrzebuj\u0105 troch\u0119 czasu na rozruch. Jest to zwi\u0105zane z  modelem dzia\u0142ania JVM i b\u0119dziemy stopniowo sobie przez poszczeg\u00f3lne problemy przechodzi\u0107. Na ten moment jednak wa\u017cne dla nas jest to, \u017ce ka\u017cdorazowe odpalanie \"zimnej\" maszyny wirtualnej na potrzeby uruchomienia pojedynczej funkcji jest rozwi\u0105zaniem nieakceptowalnym z punktu widzenia op\u00f3\u017anie\u0144, jakie by si\u0119 z tym wi\u0105za\u0142y. Teraz czas si\u0119 przygl\u0105dn\u0105\u0107, jak to jest wi\u0119c w og\u00f3le mo\u017cliwe, \u017ce istniej\u0105 jakie\u015b funkcje Serverless napisane w Javie.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":12675,"width":540,"height":624,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-2.png\" alt=\"\" class=\"wp-image-12675\" width=\"540\" height=\"624\"\/><figcaption>Jak Wam ma\u0142o, to w zasadzie internet w pewnym momencie zosta\u0142 wr\u0119cz zalany tekstami dotycz\u0105cymi serverlessa z ca\u0142\u0105 towarzysz\u0105c\u0105 mu przybud\u00f3wk\u0105. Wady i zalety tej architektury dobrze opisuje cho\u0107by Cloudflare w swoim <a href=\"https:\/\/www.cloudflare.com\/en-gb\/learning\/serverless\/why-use-serverless\/\">Why use serverless computing? | Pros and cons of serverless<\/a>.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-2.png\" alt=\"\" class=\"wp-image-12675\" width=\"540\" height=\"624\"\/><figcaption>Jak Wam ma\u0142o, to w zasadzie internet w pewnym momencie zosta\u0142 wr\u0119cz zalany tekstami dotycz\u0105cymi serverlessa z ca\u0142\u0105 towarzysz\u0105c\u0105 mu przybud\u00f3wk\u0105. Wady i zalety tej architektury dobrze opisuje cho\u0107by Cloudflare w swoim <a href=\"https:\/\/www.cloudflare.com\/en-gb\/learning\/serverless\/why-use-serverless\/\">Why use serverless computing? | Pros and cons of serverless<\/a>.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>Jak Java dotychczasowo pr\u00f3bowa\u0142a sobie z tym poradzi\u0107<\/h2>\n","innerContent":["\n<h2>Jak Java dotychczasowo pr\u00f3bowa\u0142a sobie z tym poradzi\u0107<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>Natywne rozwi\u0105zania AWS Lambda<\/h3>\n","innerContent":["\n<h3>Natywne rozwi\u0105zania AWS Lambda<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>To nie jest jednak tak, \u017ce wspomniany Cold Start zupe\u0142nie eliminuje JVM ze \u015brodowiska AWS Lambda. Po pierwsze, powinni\u015bmy pami\u0119ta\u0107, \u017ce zimny start dotyczy tylko wybranych wywo\u0142a\u0144 funkcji Lambda. Funkcje Lambda mog\u0105 by\u0107 po pierwszym uruchomieniu pozostaj\u0105 rozgrzane przez jaki\u015b czas - znaczy to, \u017ce raz uruchomiony runtime jest dzielony mi\u0119dzy wykonaniami. Po jakim\u015b okresie nieaktywno\u015bci runtime jest \"zabijany\", istniej\u0105 jednak sposoby na jego utrzymanie przy \u017cyciu.<\/p>\n","innerContent":["\n<p>To nie jest jednak tak, \u017ce wspomniany Cold Start zupe\u0142nie eliminuje JVM ze \u015brodowiska AWS Lambda. Po pierwsze, powinni\u015bmy pami\u0119ta\u0107, \u017ce zimny start dotyczy tylko wybranych wywo\u0142a\u0144 funkcji Lambda. Funkcje Lambda mog\u0105 by\u0107 po pierwszym uruchomieniu pozostaj\u0105 rozgrzane przez jaki\u015b czas - znaczy to, \u017ce raz uruchomiony runtime jest dzielony mi\u0119dzy wykonaniami. Po jakim\u015b okresie nieaktywno\u015bci runtime jest \"zabijany\", istniej\u0105 jednak sposoby na jego utrzymanie przy \u017cyciu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","width":420,"height":380},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/JUIsCzo.jpg\" alt=\"\" width=\"420\" height=\"380\"\/><figcaption>Niekt\u00f3re rozwi\u0105zania bywaj\u0105 do\u015b\u0107... nieszablonowe.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/JUIsCzo.jpg\" alt=\"\" width=\"420\" height=\"380\"\/><figcaption>Niekt\u00f3re rozwi\u0105zania bywaj\u0105 do\u015b\u0107... nieszablonowe.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Sam Amazon dzieli si\u0119 sposobami na to, aby wycisn\u0105\u0107 z javowych Lambda maksimum efektu w publikacji <a href=\"https:\/\/aws.amazon.com\/blogs\/compute\/optimizing-aws-lambda-function-performance-for-java\/\">Optimizing AWS Lambda function performance for Java<\/a>. Jako szczeg\u00f3lnie przydatne wskazywane jest odpowiednie ustawienie poziomu kompilacji na taki zapewniaj\u0105cy maksymalne mo\u017cliwe do osi\u0105gni\u0119cia efekty w kr\u00f3tkim okresie czasu dzi\u0119ki ustawieniu zmiennej \u015brodowiskowej <code>JAVA_TOOL_OPTIONS to \u201c-XX:+TieredCompilation -XX:TieredStopAtLevel=1\u201d<\/code><\/p>\n","innerContent":["\n<p>Sam Amazon dzieli si\u0119 sposobami na to, aby wycisn\u0105\u0107 z javowych Lambda maksimum efektu w publikacji <a href=\"https:\/\/aws.amazon.com\/blogs\/compute\/optimizing-aws-lambda-function-performance-for-java\/\">Optimizing AWS Lambda function performance for Java<\/a>. Jako szczeg\u00f3lnie przydatne wskazywane jest odpowiednie ustawienie poziomu kompilacji na taki zapewniaj\u0105cy maksymalne mo\u017cliwe do osi\u0105gni\u0119cia efekty w kr\u00f3tkim okresie czasu dzi\u0119ki ustawieniu zmiennej \u015brodowiskowej <code>JAVA_TOOL_OPTIONS to \u201c-XX:+TieredCompilation -XX:TieredStopAtLevel=1\u201d<\/code><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>(Application) Class Data Sharing<\/h3>\n","innerContent":["\n<h3>(Application) Class Data Sharing<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>To nie jest jednak tak, \u017ce przez lata byli\u015bmy pozostawieni na pastw\u0119 \"generycznych\" rozwi\u0105za\u0144, kt\u00f3re zapewnia nam Amazon (jak utrzymanie rozgrzanych \u015brodowisk uruchomieniowych) lub od zawsze by\u0142y w JVM (jak Tiered Compilation). Wr\u0119cz przeciwnie - tw\u00f3rcy JDK bardzo szybko (ju\u017c w okolicach JDK 9) zrozumieli, \u017ce nisza serverless mocno im ucieka, dlatego zacz\u0119li dba\u0107 o to, aby runtime j\u0119zyka stawa\u0142 si\u0119 jak najbardziej Cloud-Native, bo modne to i nowoczesne. Dlatego te\u017c w JDK 10 pojawi\u0142 si\u0119 tak zwany AppCDS - Application Class Data Sharing, kt\u00f3rego uznaje za pierwsz\u0105 pr\u00f3b\u0119 takiej optymalizacji.<\/p>\n","innerContent":["\n<p>To nie jest jednak tak, \u017ce przez lata byli\u015bmy pozostawieni na pastw\u0119 \"generycznych\" rozwi\u0105za\u0144, kt\u00f3re zapewnia nam Amazon (jak utrzymanie rozgrzanych \u015brodowisk uruchomieniowych) lub od zawsze by\u0142y w JVM (jak Tiered Compilation). Wr\u0119cz przeciwnie - tw\u00f3rcy JDK bardzo szybko (ju\u017c w okolicach JDK 9) zrozumieli, \u017ce nisza serverless mocno im ucieka, dlatego zacz\u0119li dba\u0107 o to, aby runtime j\u0119zyka stawa\u0142 si\u0119 jak najbardziej Cloud-Native, bo modne to i nowoczesne. Dlatego te\u017c w JDK 10 pojawi\u0142 si\u0119 tak zwany AppCDS - Application Class Data Sharing, kt\u00f3rego uznaje za pierwsz\u0105 pr\u00f3b\u0119 takiej optymalizacji.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Czym jest AppCDS? Funkcjonalno\u015b\u0107 ta nadbudowuje nad istniej\u0105cym od czasu JDK 1.5 Class-Data Sharing. Nie jest bowiem tak, \u017ce to dopiero w dobie Serverlessa zacz\u0119li\u015bmy si\u0119 przejmowa\u0107 czasem uruchomienia naszych aplikacji - po prostu kiedy\u015b owoce wisia\u0142y nieco ni\u017cej. Za ka\u017cdym razem bowiem, kiedy uruchamiana jest JVM, niezb\u0119dne jest za\u0142adowanie klas wchodz\u0105cych w sk\u0142ad runtime j\u0119zyka - min. pakietu <code>java.lang<\/code>, ale nie tylko. Te pozostaj\u0105 praktycznie takie same niezale\u017cnie od procesu, dlatego zamiast za ka\u017cdym razem zajmowa\u0107 si\u0119 ich inicjalizacja, mo\u017cna zrzuci\u0107 efekt ko\u0144cowy na dysk w formie archiwum i by\u0107 w stanie odczyta\u0107 go podczas uruchomienia. Pocz\u0105tkowo dotyczy\u0142o to tylko i wy\u0142\u0105cznie w\u0142a\u015bnie klas wewn\u0119trznych Javy, ale wraz z JDK 10 mechanizm ten zosta\u0142 rozszerzony r\u00f3wnie\u017c o klasy tworzone przez tw\u00f3rc\u00f3w aplikacji. Optymalizacja ta idealnie wpisuje si\u0119 w powtarzalny proces releas\u00f3w chmurowych, cho\u0107 bardziej w wypadku \"zwyk\u0142ych\" serwer\u00f3w, ni\u017c funkcji Lambda. Pokazuje to jednak \u015bcie\u017ck\u0119, kt\u00f3r\u0105 b\u0119d\u0105 u\u017cywa\u0142y kolejne przyk\u0142ady - cache. <\/p>\n","innerContent":["\n<p>Czym jest AppCDS? Funkcjonalno\u015b\u0107 ta nadbudowuje nad istniej\u0105cym od czasu JDK 1.5 Class-Data Sharing. Nie jest bowiem tak, \u017ce to dopiero w dobie Serverlessa zacz\u0119li\u015bmy si\u0119 przejmowa\u0107 czasem uruchomienia naszych aplikacji - po prostu kiedy\u015b owoce wisia\u0142y nieco ni\u017cej. Za ka\u017cdym razem bowiem, kiedy uruchamiana jest JVM, niezb\u0119dne jest za\u0142adowanie klas wchodz\u0105cych w sk\u0142ad runtime j\u0119zyka - min. pakietu <code>java.lang<\/code>, ale nie tylko. Te pozostaj\u0105 praktycznie takie same niezale\u017cnie od procesu, dlatego zamiast za ka\u017cdym razem zajmowa\u0107 si\u0119 ich inicjalizacja, mo\u017cna zrzuci\u0107 efekt ko\u0144cowy na dysk w formie archiwum i by\u0107 w stanie odczyta\u0107 go podczas uruchomienia. Pocz\u0105tkowo dotyczy\u0142o to tylko i wy\u0142\u0105cznie w\u0142a\u015bnie klas wewn\u0119trznych Javy, ale wraz z JDK 10 mechanizm ten zosta\u0142 rozszerzony r\u00f3wnie\u017c o klasy tworzone przez tw\u00f3rc\u00f3w aplikacji. Optymalizacja ta idealnie wpisuje si\u0119 w powtarzalny proces releas\u00f3w chmurowych, cho\u0107 bardziej w wypadku \"zwyk\u0142ych\" serwer\u00f3w, ni\u017c funkcji Lambda. Pokazuje to jednak \u015bcie\u017ck\u0119, kt\u00f3r\u0105 b\u0119d\u0105 u\u017cywa\u0142y kolejne przyk\u0142ady - cache. <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":12678,"width":350,"height":408,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-3.png\" alt=\"\" class=\"wp-image-12678\" width=\"350\" height=\"408\"\/><figcaption>Ale i do serveless te\u017c da si\u0119 jej u\u017cy\u0107, <a href=\"https:\/\/blog.jdbevan.com\/2020\/09\/30\/java-11-appcds-example-with-gradle\/\">jak pokazuje min. Jon Bevan<\/a>. Funkcje Lambda pozwalaj\u0105 naprawd\u0119 na du\u017co w AWS.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-3.png\" alt=\"\" class=\"wp-image-12678\" width=\"350\" height=\"408\"\/><figcaption>Ale i do serveless te\u017c da si\u0119 jej u\u017cy\u0107, <a href=\"https:\/\/blog.jdbevan.com\/2020\/09\/30\/java-11-appcds-example-with-gradle\/\">jak pokazuje min. Jon Bevan<\/a>. Funkcje Lambda pozwalaj\u0105 naprawd\u0119 na du\u017co w AWS.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wi\u0119cej o CDS i AppCDS dowiedzie\u0107 mo\u017cecie si\u0119 z <a href=\"dev.java\">dev.java<\/a>, gdzie <a href=\"https:\/\/dev.java\/learn\/class-data-sharing-and-application-class-data-sharing-in-hotspot\/\">zosta\u0142y w przyst\u0119pny spos\u00f3b opisane<\/a>. Bardzo dobr\u0105 publikacj\u0119 w temacie praktycznych u\u017cy\u0107 Application Class Data-Sharing stworzy\u0142 za\u015b <a href=\"https:\/\/nipafx.dev\/java-application-class-data-sharing\/\">Nicolai Parlog<\/a><\/p>\n","innerContent":["\n<p>Wi\u0119cej o CDS i AppCDS dowiedzie\u0107 mo\u017cecie si\u0119 z <a href=\"dev.java\">dev.java<\/a>, gdzie <a href=\"https:\/\/dev.java\/learn\/class-data-sharing-and-application-class-data-sharing-in-hotspot\/\">zosta\u0142y w przyst\u0119pny spos\u00f3b opisane<\/a>. Bardzo dobr\u0105 publikacj\u0119 w temacie praktycznych u\u017cy\u0107 Application Class Data-Sharing stworzy\u0142 za\u015b <a href=\"https:\/\/nipafx.dev\/java-application-class-data-sharing\/\">Nicolai Parlog<\/a><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>Class Pre-Initialization<\/h3>\n","innerContent":["\n<h3>Class Pre-Initialization<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Tutaj bardziej w formie ciekawostki, ale troch\u0119 nie mog\u0142em si\u0119 powstrzyma\u0107. We wrze\u015bniu tego roku Alibaba og\u0142osi\u0142a wsp\u00f3ln\u0105 inicjatyw\u0119 z Google - <a href=\"https:\/\/www.alibabacloud.com\/blog\/a-short-exploration-of-java-class-pre-initialization_599378\">FastStartup Incubator project, czyli pr\u00f3b\u0119 u\u017cycia Class Pre-Initialization do optymalizacji zimnego startu<\/a>. Tak jak wspomnia\u0142em w poprzedniej sekcji, wi\u0119kszo\u015b\u0107 metod optymalizacyjnych zimnego startu opiera si\u0119 na jakiej\u015b formie cache. Z cache jest jednak taki problem, \u017ce aby w bezpieczny spos\u00f3b by\u0107 go w stanie u\u017cy\u0107, niezb\u0119dna jest pewno\u015b\u0107, \u017ce klasa nie ma jakich\u015b side-effekt\u00f3w. Maj\u0105c t\u0105 informacj\u0119, potencjalnie jeste\u015bmy w stanie dokonywa\u0107 bardziej agresywnych optymalizacji. Z tego powodu istniej\u0105cy mechanizm Pre-Inicjalizacji klas mo\u017ce by\u0107 u\u017cywany tylko do \u015bci\u015ble zdefiniowanej listy klas.<\/p>\n","innerContent":["\n<p>Tutaj bardziej w formie ciekawostki, ale troch\u0119 nie mog\u0142em si\u0119 powstrzyma\u0107. We wrze\u015bniu tego roku Alibaba og\u0142osi\u0142a wsp\u00f3ln\u0105 inicjatyw\u0119 z Google - <a href=\"https:\/\/www.alibabacloud.com\/blog\/a-short-exploration-of-java-class-pre-initialization_599378\">FastStartup Incubator project, czyli pr\u00f3b\u0119 u\u017cycia Class Pre-Initialization do optymalizacji zimnego startu<\/a>. Tak jak wspomnia\u0142em w poprzedniej sekcji, wi\u0119kszo\u015b\u0107 metod optymalizacyjnych zimnego startu opiera si\u0119 na jakiej\u015b formie cache. Z cache jest jednak taki problem, \u017ce aby w bezpieczny spos\u00f3b by\u0107 go w stanie u\u017cy\u0107, niezb\u0119dna jest pewno\u015b\u0107, \u017ce klasa nie ma jakich\u015b side-effekt\u00f3w. Maj\u0105c t\u0105 informacj\u0119, potencjalnie jeste\u015bmy w stanie dokonywa\u0107 bardziej agresywnych optymalizacji. Z tego powodu istniej\u0105cy mechanizm Pre-Inicjalizacji klas mo\u017ce by\u0107 u\u017cywany tylko do \u015bci\u015ble zdefiniowanej listy klas.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Dlatego te\u017c obie firmy chc\u0105 da\u0107 adnotacj\u0119 <code>jdk.internal.vm.annotation.Preserve<\/code> lub\/i mo\u017cliwo\u015b\u0107 przekazania listy klas, kt\u00f3re mog\u0105 by\u0107 bezpiecznie pre-initaljzowane. Dzi\u0119ki temu obecne w Javie metody optymalizacyjne b\u0119d\u0105 po prostu mog\u0142y by\u0107 stosowane szerzej. FastStartup Incubator znajduje si\u0119 we wczesnej fazie, ale zar\u00f3wno Google, jak i Alibaba - jako, \u017ce obie firmy posiadaj\u0105 w\u0142asne chmury - maj\u0105 du\u017ce motywacje (\ud83d\udcb5) aby pcha\u0107 go do przodu.<\/p>\n","innerContent":["\n<p>Dlatego te\u017c obie firmy chc\u0105 da\u0107 adnotacj\u0119 <code>jdk.internal.vm.annotation.Preserve<\/code> lub\/i mo\u017cliwo\u015b\u0107 przekazania listy klas, kt\u00f3re mog\u0105 by\u0107 bezpiecznie pre-initaljzowane. Dzi\u0119ki temu obecne w Javie metody optymalizacyjne b\u0119d\u0105 po prostu mog\u0142y by\u0107 stosowane szerzej. FastStartup Incubator znajduje si\u0119 we wczesnej fazie, ale zar\u00f3wno Google, jak i Alibaba - jako, \u017ce obie firmy posiadaj\u0105 w\u0142asne chmury - maj\u0105 du\u017ce motywacje (\ud83d\udcb5) aby pcha\u0107 go do przodu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>Natywne obrazy - Project Leyden, Ahead-of-Time Compilation, GraalVM<\/h3>\n","innerContent":["\n<h3>Natywne obrazy - Project Leyden, Ahead-of-Time Compilation, GraalVM<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Skoro inicjalizacja klas i classpatha zajmuje tyle czasu, to mo\u017ce najlepiej si\u0119 jej po prostu pozby\u0107 i wszystko od razu wrzuca\u0107 do binarki?<\/p>\n","innerContent":["\n<p>Skoro inicjalizacja klas i classpatha zajmuje tyle czasu, to mo\u017ce najlepiej si\u0119 jej po prostu pozby\u0107 i wszystko od razu wrzuca\u0107 do binarki?<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":12689,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-4.png\" alt=\"\" class=\"wp-image-12689\"\/><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-4.png\" alt=\"\" class=\"wp-image-12689\"\/><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Id\u0105c tym tropem kolejn\u0105, cz\u0119sto u\u017cywan\u0105 dzi\u015b metod\u0105 jest wykorzystanie Custom Runtime Lambdy i GraalVM do stworzenia natywnego obrazu. Takowe cechuj\u0105 si\u0119 tym, \u017ce pe\u0142n\u0105 wydajno\u015b\u0107 osi\u0105gaj\u0105 od momentu uruchomienia, a czas rozruchu jest w nich mocno skr\u00f3cony w stosunku do standardowych aplikacji javowych. W internecie znajdziecie wiele tekst\u00f3w po\u015bwi\u0119conych temu podej\u015bciu, metoda jest dobrze opisana min. przez Arnolda Galovicsa w jego tek\u015bcie <a href=\"https:\/\/arnoldgalovics.com\/java-cold-start-aws-lambda-graalvm\/\">Tackling Java Cold Startup Times On AWS Lambda With GraalVM<\/a>. Je\u017celi kiedykolwiek interesowali\u015bcie si\u0119 optymalizacj\u0105 zimnego startu w Javie, to prawodopodbnie w\u0142a\u015bnie ta metoda Wam si\u0119 o uszy obi\u0142a.<\/p>\n","innerContent":["\n<p>Id\u0105c tym tropem kolejn\u0105, cz\u0119sto u\u017cywan\u0105 dzi\u015b metod\u0105 jest wykorzystanie Custom Runtime Lambdy i GraalVM do stworzenia natywnego obrazu. Takowe cechuj\u0105 si\u0119 tym, \u017ce pe\u0142n\u0105 wydajno\u015b\u0107 osi\u0105gaj\u0105 od momentu uruchomienia, a czas rozruchu jest w nich mocno skr\u00f3cony w stosunku do standardowych aplikacji javowych. W internecie znajdziecie wiele tekst\u00f3w po\u015bwi\u0119conych temu podej\u015bciu, metoda jest dobrze opisana min. przez Arnolda Galovicsa w jego tek\u015bcie <a href=\"https:\/\/arnoldgalovics.com\/java-cold-start-aws-lambda-graalvm\/\">Tackling Java Cold Startup Times On AWS Lambda With GraalVM<\/a>. Je\u017celi kiedykolwiek interesowali\u015bcie si\u0119 optymalizacj\u0105 zimnego startu w Javie, to prawodopodbnie w\u0142a\u015bnie ta metoda Wam si\u0119 o uszy obi\u0142a.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Problem z kompilacj\u0105 AoT jest taki, \u017ce o ile umo\u017cliwia ona osi\u0105gni\u0119cie pewnego bazowego poziomu wydajno\u015bci, to jednak nie jest to proces tak optymalny jak ten oparty o kompilacje Just-In-Time. Wynika to z faktu, \u017ce aplikacja ju\u017c uruchomiona jest w stanie dokonywa\u0107 optymalizacji specyficznych dla sposobu u\u017cycia - i robi to w oparciu o informacje, do kt\u00f3rych kompilator dzia\u0142aj\u0105cy na zimno po prostu nie ma dost\u0119pu. To by\u0142oby pewnie do prze\u0142kni\u0119cia w przypadku Serverless, ale GraalVM (i ca\u0142e AoT) wymaga od u\u017cytkownik\u00f3w r\u00f3wnie\u017c zmiany we w\u0142asnych przyzwyczajeniach, zw\u0142aszcza je\u015bli chodzi np. o u\u017cycie Reflection API.<\/p>\n","innerContent":["\n<p>Problem z kompilacj\u0105 AoT jest taki, \u017ce o ile umo\u017cliwia ona osi\u0105gni\u0119cie pewnego bazowego poziomu wydajno\u015bci, to jednak nie jest to proces tak optymalny jak ten oparty o kompilacje Just-In-Time. Wynika to z faktu, \u017ce aplikacja ju\u017c uruchomiona jest w stanie dokonywa\u0107 optymalizacji specyficznych dla sposobu u\u017cycia - i robi to w oparciu o informacje, do kt\u00f3rych kompilator dzia\u0142aj\u0105cy na zimno po prostu nie ma dost\u0119pu. To by\u0142oby pewnie do prze\u0142kni\u0119cia w przypadku Serverless, ale GraalVM (i ca\u0142e AoT) wymaga od u\u017cytkownik\u00f3w r\u00f3wnie\u017c zmiany we w\u0142asnych przyzwyczajeniach, zw\u0142aszcza je\u015bli chodzi np. o u\u017cycie Reflection API.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>My\u015bl\u0119, \u017ce o AoT ju\u017c wystarczy, bo ta metoda optymalizacji pozostaje mocno poza zakresem tego wydania i umie\u015bci\u0142em j\u0105 tutaj g\u0142\u00f3wnie dla porz\u0105dku. Wi\u0119cej o powy\u017cszych mo\u017cecie przeczyta\u0107 w jednym z poprzednich wyda\u0144 JVM Weekly: <a href=\"https:\/\/vived.io\/how-committing-graalvm-to-openjdk-changes-the-rules-for-project-leyden-jvm-weekly-110\/ \">How committing GraalVM to OpenJDK changes the rules for Project Leyden<\/a><\/p>\n","innerContent":["\n<p>My\u015bl\u0119, \u017ce o AoT ju\u017c wystarczy, bo ta metoda optymalizacji pozostaje mocno poza zakresem tego wydania i umie\u015bci\u0142em j\u0105 tutaj g\u0142\u00f3wnie dla porz\u0105dku. Wi\u0119cej o powy\u017cszych mo\u017cecie przeczyta\u0107 w jednym z poprzednich wyda\u0144 JVM Weekly: <a href=\"https:\/\/vived.io\/how-committing-graalvm-to-openjdk-changes-the-rules-for-project-leyden-jvm-weekly-110\/ \">How committing GraalVM to OpenJDK changes the rules for Project Leyden<\/a><\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>CRIU<\/h3>\n","innerContent":["\n<h3>CRIU<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Nieco kluczymy, ale powoli zbli\u017camy si\u0119 ju\u017c do meritum. Metody jak Fast Startup czy AppCDS s\u0142u\u017cy\u0142y do cache'owania poszczeg\u00f3lnych fragment\u00f3w runtime JVM-a. <a href=\"https:\/\/criu.org\/Main_Page\">Checkpoint\/Restore in Userspace (CRIU)<\/a> to funkcja Linuxa, kt\u00f3ra umo\u017cliwia wykonanie \"zrzutu\" na dysk ca\u0142ego dzia\u0142aj\u0105cego procesu aplikacji. Nast\u0119pnie, kolejna instancja mo\u017ce by\u0107 uruchomiona z tego punktu, w kt\u00f3rym wykonano wspomniany zrzut, co skraca czas rozruchu.<\/p>\n","innerContent":["\n<p>Nieco kluczymy, ale powoli zbli\u017camy si\u0119 ju\u017c do meritum. Metody jak Fast Startup czy AppCDS s\u0142u\u017cy\u0142y do cache'owania poszczeg\u00f3lnych fragment\u00f3w runtime JVM-a. <a href=\"https:\/\/criu.org\/Main_Page\">Checkpoint\/Restore in Userspace (CRIU)<\/a> to funkcja Linuxa, kt\u00f3ra umo\u017cliwia wykonanie \"zrzutu\" na dysk ca\u0142ego dzia\u0142aj\u0105cego procesu aplikacji. Nast\u0119pnie, kolejna instancja mo\u017ce by\u0107 uruchomiona z tego punktu, w kt\u00f3rym wykonano wspomniany zrzut, co skraca czas rozruchu.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Mam w\u015br\u00f3d czytelnik\u00f3w jakich\u015b retro-graczy? Je\u015bli tak, to ca\u0142o\u015b\u0107 dzia\u0142a w podobny spos\u00f3b jak funkcjonalno\u015b\u0107 Save State w emulatorach. Metody takie jak AppCDS przypominaj\u0105 klasyczne zapisywanie - wybieramy te fragmenty, kt\u00f3re pozwol\u0105 nam p\u00f3\u017aniej odtworzy\u0107 stan aplikacji, i tylko je zapisujemy. Save State nie bawi si\u0119 w takie finezje - jako, \u017ce komputery posz\u0142y do przodu i mamy wi\u0119cej przestrzeni dyskowej, to po prostu zrzucamy ca\u0142y stan pami\u0119ci na dysk i potem sobie odtwarzamy 1:1 gdy jest to potrzebne. <\/p>\n","innerContent":["\n<p>Mam w\u015br\u00f3d czytelnik\u00f3w jakich\u015b retro-graczy? Je\u015bli tak, to ca\u0142o\u015b\u0107 dzia\u0142a w podobny spos\u00f3b jak funkcjonalno\u015b\u0107 Save State w emulatorach. Metody takie jak AppCDS przypominaj\u0105 klasyczne zapisywanie - wybieramy te fragmenty, kt\u00f3re pozwol\u0105 nam p\u00f3\u017aniej odtworzy\u0107 stan aplikacji, i tylko je zapisujemy. Save State nie bawi si\u0119 w takie finezje - jako, \u017ce komputery posz\u0142y do przodu i mamy wi\u0119cej przestrzeni dyskowej, to po prostu zrzucamy ca\u0142y stan pami\u0119ci na dysk i potem sobie odtwarzamy 1:1 gdy jest to potrzebne. <\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":12693,"width":768,"height":366,"sizeSlug":"large","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-5-1024x488.png\" alt=\"\" class=\"wp-image-12693\" width=\"768\" height=\"366\"\/><figcaption>Tak dzia\u0142a r\u00f3wnie\u017c w\u0142a\u015bnie CRIU.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-5-1024x488.png\" alt=\"\" class=\"wp-image-12693\" width=\"768\" height=\"366\"\/><figcaption>Tak dzia\u0142a r\u00f3wnie\u017c w\u0142a\u015bnie CRIU.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>CRIU posiada swoje problemy - zar\u00f3wno z punktu widzenia bezpiecze\u0144stwa, jak i wygody u\u017cytkowania - m\u00f3wimy tutaj bowiem o generycznej funkcji systemu operacyjnego, znajduj\u0105cej si\u0119 poza JVM. Ka\u017cda aplikacja ma za\u015b nieco inn\u0105 charakterystyk\u0119 i w zale\u017cno\u015bci od tego, czy m\u00f3wimy o serwerze aplikacyjnym, aplikacji webowej czy batchowym jobie zapis na dysk powinien odbywa\u0107 si\u0119 w innym momencie, kt\u00f3ry mo\u017ce by\u0107 trudny do wychwycenia bez kontekstu maszyny wirtualnej. Jak pisze OpenLiberty w swoim tek\u015bcie <a href=\"https:\/\/openliberty.io\/blog\/2020\/02\/12\/faster-startup-Java-applications-criu.html\">Faster start-up for Java applications on Open Liberty with CRIU<\/a>:<\/p>\n","innerContent":["\n<p>CRIU posiada swoje problemy - zar\u00f3wno z punktu widzenia bezpiecze\u0144stwa, jak i wygody u\u017cytkowania - m\u00f3wimy tutaj bowiem o generycznej funkcji systemu operacyjnego, znajduj\u0105cej si\u0119 poza JVM. Ka\u017cda aplikacja ma za\u015b nieco inn\u0105 charakterystyk\u0119 i w zale\u017cno\u015bci od tego, czy m\u00f3wimy o serwerze aplikacyjnym, aplikacji webowej czy batchowym jobie zapis na dysk powinien odbywa\u0107 si\u0119 w innym momencie, kt\u00f3ry mo\u017ce by\u0107 trudny do wychwycenia bez kontekstu maszyny wirtualnej. Jak pisze OpenLiberty w swoim tek\u015bcie <a href=\"https:\/\/openliberty.io\/blog\/2020\/02\/12\/faster-startup-Java-applications-criu.html\">Faster start-up for Java applications on Open Liberty with CRIU<\/a>:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/quote","attrs":[],"innerBlocks":[],"innerHTML":"\n<blockquote class=\"wp-block-quote\"><p>It would be useful to have an API so that the application can specify when it would like a snapshot to be taken; this would be a valuable addition to the Java specification.<\/p><\/blockquote>\n","innerContent":["\n<blockquote class=\"wp-block-quote\"><p>It would be useful to have an API so that the application can specify when it would like a snapshot to be taken; this would be a valuable addition to the Java specification.<\/p><\/blockquote>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>No to teraz najwy\u017csza pora przej\u015b\u0107 do CRaC!<\/p>\n","innerContent":["\n<p>No to teraz najwy\u017csza pora przej\u015b\u0107 do CRaC!<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>PS: Je\u017celi chcecie dowiedzie\u0107 si\u0119 wi\u0119cej o CRiU, Christine Flood z RedHata nagra\u0142a dog\u0142\u0119bnego talka  <a href=\"https:\/\/www.youtube.com\/watch?v=XXbJNaFF-8A\">CRIU and Java opportunities and challenges<\/a> o kontek\u015bcie u\u017cycia tej technologii w Javie.<\/p>\n","innerContent":["\n<p>PS: Je\u017celi chcecie dowiedzie\u0107 si\u0119 wi\u0119cej o CRiU, Christine Flood z RedHata nagra\u0142a dog\u0142\u0119bnego talka  <a href=\"https:\/\/www.youtube.com\/watch?v=XXbJNaFF-8A\">CRIU and Java opportunities and challenges<\/a> o kontek\u015bcie u\u017cycia tej technologii w Javie.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":{"level":3},"innerBlocks":[],"innerHTML":"\n<h3>CRaC<\/h3>\n","innerContent":["\n<h3>CRaC<\/h3>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>No i dochodzimy do ko\u0144cowej \u015bcie\u017cki naszej podr\u00f3\u017cy po optymalizacjach JVM-a. CRaC (Coordinated Restore at Checkpoint) to w\u0142a\u015bnie bowiem API, o kt\u00f3rym wspomniane by\u0142o w poprzedniej sekcji. Pozwala on na utworzenie \"checkpointu\" - czyli wspomnianego zrzutu pami\u0119ci - w dowolnym momencie pracy aplikacji zdefiniowanym przez tw\u00f3rc\u0119 oprogramowania, za pomoc\u0105 komendy:<\/p>\n","innerContent":["\n<p>No i dochodzimy do ko\u0144cowej \u015bcie\u017cki naszej podr\u00f3\u017cy po optymalizacjach JVM-a. CRaC (Coordinated Restore at Checkpoint) to w\u0142a\u015bnie bowiem API, o kt\u00f3rym wspomniane by\u0142o w poprzedniej sekcji. Pozwala on na utworzenie \"checkpointu\" - czyli wspomnianego zrzutu pami\u0119ci - w dowolnym momencie pracy aplikacji zdefiniowanym przez tw\u00f3rc\u0119 oprogramowania, za pomoc\u0105 komendy:<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>jcmd target\/spring-boot-0.0.1-SNAPSHOT.jar JDK.checkpoint<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>jcmd target\/spring-boot-0.0.1-SNAPSHOT.jar JDK.checkpoint<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Pozwala r\u00f3wnie\u017c na obs\u0142u\u017cenie, jak aplikacja ma si\u0119 zachowa\u0107 w momencie tworzenia checkpointu i jego odtworzenia, pozwala wi\u0119c na zarz\u0105dzenie jej stanem.<\/p>\n","innerContent":["\n<p>Pozwala r\u00f3wnie\u017c na obs\u0142u\u017cenie, jak aplikacja ma si\u0119 zachowa\u0107 w momencie tworzenia checkpointu i jego odtworzenia, pozwala wi\u0119c na zarz\u0105dzenie jej stanem.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/code","attrs":[],"innerBlocks":[],"innerHTML":"\n<pre class=\"wp-block-code\"><code>import jdk.crac.Context;\nimport jdk.crac.Core;\nimport jdk.crac.Resource;\n\nclass ServerManager implements Resource {\n...\n   @Override\n   public void beforeCheckpoint(Context&lt;? extends Resource&gt; context) throws Exception {\n       server.stop();\n   }\n\n   @Override\n   public void afterRestore(Context&lt;? extends Resource&gt; context) throws Exception {\n       server.start();\n   }\n}\n<\/code><\/pre>\n","innerContent":["\n<pre class=\"wp-block-code\"><code>import jdk.crac.Context;\nimport jdk.crac.Core;\nimport jdk.crac.Resource;\n\nclass ServerManager implements Resource {\n...\n   @Override\n   public void beforeCheckpoint(Context&lt;? extends Resource&gt; context) throws Exception {\n       server.stop();\n   }\n\n   @Override\n   public void afterRestore(Context&lt;? extends Resource&gt; context) throws Exception {\n       server.start();\n   }\n}\n<\/code><\/pre>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>W kontek\u015bcie tego tekstu, wa\u017cna jest geneza CRaC. Od bardzo wczesnych etap\u00f3w zaanga\u017cowani byli w niego bowiem in\u017cynierowie Amazona z zespo\u0142u Corretto (ichniejszej implementacji JDK). <a href=\"https:\/\/mail.openjdk.org\/pipermail\/discuss\/2021-July\/005863.html\">Lista mailingowa OpenJDK ju\u017c od pewnego czasu<\/a> zawiera\u0142a wi\u0119c przecieki o tym, \u017ce Amazon pracuje nad ulepszeniem wsparcia dla Javy w aplikacjach Serverless. W jaki spos\u00f3b Lambda chce u\u017cywa\u0107 CRaC? Tutaj trzeba si\u0119 przygl\u0105dn\u0105\u0107, jak AWS Lambda dzia\u0142a pod spodem.<\/p>\n","innerContent":["\n<p>W kontek\u015bcie tego tekstu, wa\u017cna jest geneza CRaC. Od bardzo wczesnych etap\u00f3w zaanga\u017cowani byli w niego bowiem in\u017cynierowie Amazona z zespo\u0142u Corretto (ichniejszej implementacji JDK). <a href=\"https:\/\/mail.openjdk.org\/pipermail\/discuss\/2021-July\/005863.html\">Lista mailingowa OpenJDK ju\u017c od pewnego czasu<\/a> zawiera\u0142a wi\u0119c przecieki o tym, \u017ce Amazon pracuje nad ulepszeniem wsparcia dla Javy w aplikacjach Serverless. W jaki spos\u00f3b Lambda chce u\u017cywa\u0107 CRaC? Tutaj trzeba si\u0119 przygl\u0105dn\u0105\u0107, jak AWS Lambda dzia\u0142a pod spodem.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>Jak zbudowana jest AWS Lambda?<\/h2>\n","innerContent":["\n<h2>Jak zbudowana jest AWS Lambda?<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Swego czasu powstawa\u0142o bardzo du\u017co projekt\u00f3w, kt\u00f3re pr\u00f3bowa\u0142y symulowa\u0107 dzia\u0142anie AWS Lambdy (i innych serverless\u00f3w) w ramach np. takiego Kubernetesa. Tak naprawd\u0119 jednak bardzo trudno zapewni\u0107 im by\u0142o do\u015bwiadczenie cho\u0107by zbli\u017cone do tego zapewnianego przez produkt Amazonu. Wynika to z tego, \u017ce zamiast wykorzystywa\u0107 generyczne kontenery, AWS postawi\u0142 na dedykowane, zoptymalizowane pod Serverless \u015brodowisko uruchomieniowe. Z takiego w\u0142a\u015bnie podej\u015bcia wynika wi\u0119kszo\u015b\u0107 proponowanych przez firm\u0119 innowacji Lambdy, tak trudnych do zreplikowania przez generyczne rozwi\u0105zania.<\/p>\n","innerContent":["\n<p>Swego czasu powstawa\u0142o bardzo du\u017co projekt\u00f3w, kt\u00f3re pr\u00f3bowa\u0142y symulowa\u0107 dzia\u0142anie AWS Lambdy (i innych serverless\u00f3w) w ramach np. takiego Kubernetesa. Tak naprawd\u0119 jednak bardzo trudno zapewni\u0107 im by\u0142o do\u015bwiadczenie cho\u0107by zbli\u017cone do tego zapewnianego przez produkt Amazonu. Wynika to z tego, \u017ce zamiast wykorzystywa\u0107 generyczne kontenery, AWS postawi\u0142 na dedykowane, zoptymalizowane pod Serverless \u015brodowisko uruchomieniowe. Z takiego w\u0142a\u015bnie podej\u015bcia wynika wi\u0119kszo\u015b\u0107 proponowanych przez firm\u0119 innowacji Lambdy, tak trudnych do zreplikowania przez generyczne rozwi\u0105zania.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":12701,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-7.png\" alt=\"\" class=\"wp-image-12701\"\/><figcaption>Bo tak na poziomie koncepcji, to powy\u017csze jest smutn\u0105 prawd\u0105. Ale diabe\u0142 tkwi w szczeg\u00f3\u0142ach \ud83d\ude08<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-7.png\" alt=\"\" class=\"wp-image-12701\"\/><figcaption>Bo tak na poziomie koncepcji, to powy\u017csze jest smutn\u0105 prawd\u0105. Ale diabe\u0142 tkwi w szczeg\u00f3\u0142ach \ud83d\ude08<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Runtime Lambdy sk\u0142ada si\u0119 z masy \u015bci\u015ble wyspecjalizowanych komponent\u00f3w. Przyk\u0142adowo, jako infrastruktura u\u017cywane s\u0105 EC2 Nitro. S\u0105 to maszyny bare-metal pozbawionych narzutu wirtualizacji (jak to mia\u0142oby miejsce w wypadku EC2 typu T, kt\u00f3re s\u0105 najcz\u0119\u015bciej u\u017cywane w przypadku takiego Eleastic Container Storage). Na nich uruchamiany jest projekt Firecracker -&nbsp; wyspecjalizowane, przeznaczone pod zastosowania w serverless mikro-maszyny wirtualne. Zapewniaj\u0105 one&nbsp; izolacje proces\u00f3w i s\u0105 w stanie posiada\u0107 wsp\u00f3lny kontekst uruchomieniowy. Dzi\u0119ki temu Amazon jest w stanie zapewni\u0107, \u017ce po pocz\u0105tkowym rozgrzaniu pierwszej instancji, kolejne b\u0119d\u0105 uruchamia\u0142y si\u0119 ju\u017c znacznie szybciej. Firecracker za\u015b&nbsp; zarz\u0105dza w granularny spos\u00f3b tym, kt\u00f3re fragmenty powinny by\u0107 reu\u017cywane, a kt\u00f3re musz\u0105 by\u0107 ka\u017cdorazowo tworzone od nowa.<\/p>\n","innerContent":["\n<p>Runtime Lambdy sk\u0142ada si\u0119 z masy \u015bci\u015ble wyspecjalizowanych komponent\u00f3w. Przyk\u0142adowo, jako infrastruktura u\u017cywane s\u0105 EC2 Nitro. S\u0105 to maszyny bare-metal pozbawionych narzutu wirtualizacji (jak to mia\u0142oby miejsce w wypadku EC2 typu T, kt\u00f3re s\u0105 najcz\u0119\u015bciej u\u017cywane w przypadku takiego Eleastic Container Storage). Na nich uruchamiany jest projekt Firecracker -&nbsp; wyspecjalizowane, przeznaczone pod zastosowania w serverless mikro-maszyny wirtualne. Zapewniaj\u0105 one&nbsp; izolacje proces\u00f3w i s\u0105 w stanie posiada\u0107 wsp\u00f3lny kontekst uruchomieniowy. Dzi\u0119ki temu Amazon jest w stanie zapewni\u0107, \u017ce po pocz\u0105tkowym rozgrzaniu pierwszej instancji, kolejne b\u0119d\u0105 uruchamia\u0142y si\u0119 ju\u017c znacznie szybciej. Firecracker za\u015b&nbsp; zarz\u0105dza w granularny spos\u00f3b tym, kt\u00f3re fragmenty powinny by\u0107 reu\u017cywane, a kt\u00f3re musz\u0105 by\u0107 ka\u017cdorazowo tworzone od nowa.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>To jest oczywi\u015bcie przej\u015bcie przez temat bardzo \"po \u0142ebkach\", bo to te\u017c JVM-owy przegl\u0105d, a nie publikacja dla architekt\u00f3w w\u0142asnej chmury Serverless. Je\u015bli jednak jeste\u015bcie rz\u0105dni wi\u0119kszej ilo\u015bci detali - <a href=\"https:\/\/www.bschaatsbergen.com\/behind-the-scenes-lambda\/\">Behind the scenes, Lambda<\/a> to publikacja, kt\u00f3rej szukacie.<\/p>\n","innerContent":["\n<p>To jest oczywi\u015bcie przej\u015bcie przez temat bardzo \"po \u0142ebkach\", bo to te\u017c JVM-owy przegl\u0105d, a nie publikacja dla architekt\u00f3w w\u0142asnej chmury Serverless. Je\u015bli jednak jeste\u015bcie rz\u0105dni wi\u0119kszej ilo\u015bci detali - <a href=\"https:\/\/www.bschaatsbergen.com\/behind-the-scenes-lambda\/\">Behind the scenes, Lambda<\/a> to publikacja, kt\u00f3rej szukacie.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>No dobra, to jak dzia\u0142a SnapStart<\/h2>\n","innerContent":["\n<h2>No dobra, to jak dzia\u0142a SnapStart<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>To skoro wszystkie pionki mamy ma ju\u017c na planszy, to wreszcie porozmawiajmy sobie o najnowszej innowacji ze strony Amazona, jak\u0105 jest AWS Lambda SnapStart.<\/p>\n","innerContent":["\n<p>To skoro wszystkie pionki mamy ma ju\u017c na planszy, to wreszcie porozmawiajmy sobie o najnowszej innowacji ze strony Amazona, jak\u0105 jest AWS Lambda SnapStart.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wykonanie ka\u017cdej funkcji Lambda sk\u0142ada si\u0119 z trzech faz - Init (rz\u0105dz\u0105cej si\u0119 <a href=\"https:\/\/bitesizedserverless.com\/bite\/when-is-the-lambda-init-phase-free-and-when-is-it-billed\/\">do\u015b\u0107 specyficznymi prawami<\/a>), Invoke oraz Shutdown. Bootstrap \u015brodowiska w ramach pierwszej z nich polega na przygotowanie ca\u0142ego \u015brodowiska do stanu, w kt\u00f3rym jest w stanie przyjmowa\u0107 ruch. SnapStart w tym momencie stan pami\u0119ci lambdy zapisuje i odk\u0142ada \"na p\u00f3\u017aniej\", gdy nasza funkcja nie b\u0119dzie wystarczaj\u0105co rozgrzana. Robi to za pomoc\u0105 wspomnianego ju\u017c CRIU, a w pierwszej wersji wspiera w\u0142a\u015bnie Jav\u0119 dzi\u0119ki CRaC API. Ca\u0142o\u015b\u0107 pod spodem u\u017cywa za\u015b mechanizmu <a href=\"https:\/\/github.com\/firecracker-microvm\/firecracker\/blob\/main\/docs\/snapshotting\/snapshot-support.md\">snapshottingu udost\u0119pnianego przez Firecracker<\/a>, a wspomniane API CRaC pomaga w sytuacji, gdy niezb\u0119dne jest od\u015bwie\u017cenie snapshotu - <a href=\"https:\/\/docs.aws.amazon.com\/lambda\/latest\/dg\/snapstart-runtime-hooks.html\">AWS Lambda udost\u0119pnia odpowiednie hooki<\/a>.<\/p>\n","innerContent":["\n<p>Wykonanie ka\u017cdej funkcji Lambda sk\u0142ada si\u0119 z trzech faz - Init (rz\u0105dz\u0105cej si\u0119 <a href=\"https:\/\/bitesizedserverless.com\/bite\/when-is-the-lambda-init-phase-free-and-when-is-it-billed\/\">do\u015b\u0107 specyficznymi prawami<\/a>), Invoke oraz Shutdown. Bootstrap \u015brodowiska w ramach pierwszej z nich polega na przygotowanie ca\u0142ego \u015brodowiska do stanu, w kt\u00f3rym jest w stanie przyjmowa\u0107 ruch. SnapStart w tym momencie stan pami\u0119ci lambdy zapisuje i odk\u0142ada \"na p\u00f3\u017aniej\", gdy nasza funkcja nie b\u0119dzie wystarczaj\u0105co rozgrzana. Robi to za pomoc\u0105 wspomnianego ju\u017c CRIU, a w pierwszej wersji wspiera w\u0142a\u015bnie Jav\u0119 dzi\u0119ki CRaC API. Ca\u0142o\u015b\u0107 pod spodem u\u017cywa za\u015b mechanizmu <a href=\"https:\/\/github.com\/firecracker-microvm\/firecracker\/blob\/main\/docs\/snapshotting\/snapshot-support.md\">snapshottingu udost\u0119pnianego przez Firecracker<\/a>, a wspomniane API CRaC pomaga w sytuacji, gdy niezb\u0119dne jest od\u015bwie\u017cenie snapshotu - <a href=\"https:\/\/docs.aws.amazon.com\/lambda\/latest\/dg\/snapstart-runtime-hooks.html\">AWS Lambda udost\u0119pnia odpowiednie hooki<\/a>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Oczywi\u015bcie, s\u0105 tutaj pewne wyzwania o kt\u00f3rych trzeba pami\u0119ta\u0107. Standardowa losowo\u015b\u0107 w Javie generuje seeda w momencie inicjalizacji, jako \u017ce operujemy na zrzucie pami\u0119ci to wszystkie wyniki operacji pseudolosowych b\u0119d\u0105 takie same, czyni\u0105c <code>java.util.Random<\/code> raczej bezu\u017cytecznym. Jednak Amazon zadba\u0142 o to, aby taki np. <code>java.security.SecureRandom<\/code> zachowywa\u0142 si\u0119 prawid\u0142owo, ale je\u015bli jaka\u015b z u\u017cywanych przez Was bibliotek u\u017cywa klasycznego <code>Random<\/code>...<\/p>\n","innerContent":["\n<p>Oczywi\u015bcie, s\u0105 tutaj pewne wyzwania o kt\u00f3rych trzeba pami\u0119ta\u0107. Standardowa losowo\u015b\u0107 w Javie generuje seeda w momencie inicjalizacji, jako \u017ce operujemy na zrzucie pami\u0119ci to wszystkie wyniki operacji pseudolosowych b\u0119d\u0105 takie same, czyni\u0105c <code>java.util.Random<\/code> raczej bezu\u017cytecznym. Jednak Amazon zadba\u0142 o to, aby taki np. <code>java.security.SecureRandom<\/code> zachowywa\u0142 si\u0119 prawid\u0142owo, ale je\u015bli jaka\u015b z u\u017cywanych przez Was bibliotek u\u017cywa klasycznego <code>Random<\/code>...<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":12699,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-6.png\" alt=\"\" class=\"wp-image-12699\"\/><figcaption>Ju\u017c widz\u0119 te pytania na StackOverflow - \"Dlaczego moja Lambda zawsze generuje ten sam ci\u0105g znak\u00f3w\".<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-6.png\" alt=\"\" class=\"wp-image-12699\"\/><figcaption>Ju\u017c widz\u0119 te pytania na StackOverflow - \"Dlaczego moja Lambda zawsze generuje ten sam ci\u0105g znak\u00f3w\".<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Innym ciekaw\u0105 mo\u017cliwo\u015bci\u0105, kt\u00f3r\u0105 daje SnapStart, jest mo\u017cliwo\u015b\u0107 \"rozgrzania\" funkcji za pomoc\u0105 kompilatora Just-in-Time na zewn\u0119trznej maszynie i dostarczenia go funkcji Lambda razem z aplikacj\u0105. Umo\u017cliwia to zapewnienie im maksymalnej wydajno\u015bci, przekraczaj\u0105cej t\u0105, kt\u00f3r\u0105 zapewni\u0107 mo\u017ce kompilacja Ahead-of-Time. Z pewno\u015bci\u0105 jednak najwi\u0119ksze wra\u017cenie robi skr\u00f3cenie Cold Startu. M\u00f3wimy tutaj bowiem o a\u017c 10-krotnym skr\u00f3ceniu czasu uruchomienia. R\u00f3\u017cnica mi\u0119dzy zimn\u0105, a rozgrzan\u0105 funkcj\u0105 severless staje si\u0119 w ten spos\u00f3b praktycznie pomijalna w wi\u0119kszo\u015bci przypadk\u00f3w.<\/p>\n","innerContent":["\n<p>Innym ciekaw\u0105 mo\u017cliwo\u015bci\u0105, kt\u00f3r\u0105 daje SnapStart, jest mo\u017cliwo\u015b\u0107 \"rozgrzania\" funkcji za pomoc\u0105 kompilatora Just-in-Time na zewn\u0119trznej maszynie i dostarczenia go funkcji Lambda razem z aplikacj\u0105. Umo\u017cliwia to zapewnienie im maksymalnej wydajno\u015bci, przekraczaj\u0105cej t\u0105, kt\u00f3r\u0105 zapewni\u0107 mo\u017ce kompilacja Ahead-of-Time. Z pewno\u015bci\u0105 jednak najwi\u0119ksze wra\u017cenie robi skr\u00f3cenie Cold Startu. M\u00f3wimy tutaj bowiem o a\u017c 10-krotnym skr\u00f3ceniu czasu uruchomienia. R\u00f3\u017cnica mi\u0119dzy zimn\u0105, a rozgrzan\u0105 funkcj\u0105 severless staje si\u0119 w ten spos\u00f3b praktycznie pomijalna w wi\u0119kszo\u015bci przypadk\u00f3w.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Amazon oczywi\u015bcie dostarczy\u0142 dokumentacje. Ca\u0142o\u015b\u0107 w\u0142\u0105cza si\u0119 pojedyncz\u0105 flag\u0105 w YAML'u, ale oczywi\u015bcie mo\u017cliwie jest dopasowanie procesu pod siebie, min. wspomnianymi Hookami. Dobrym punktem startu b\u0119dzie <a href=\"https:\/\/aws.amazon.com\/blogs\/compute\/reducing-java-cold-starts-on-aws-lambda-functions-with-snapstart\/\">oficjalny post wprowadzaj\u0105cy od Amazonu<\/a>.<\/p>\n","innerContent":["\n<p>Amazon oczywi\u015bcie dostarczy\u0142 dokumentacje. Ca\u0142o\u015b\u0107 w\u0142\u0105cza si\u0119 pojedyncz\u0105 flag\u0105 w YAML'u, ale oczywi\u015bcie mo\u017cliwie jest dopasowanie procesu pod siebie, min. wspomnianymi Hookami. Dobrym punktem startu b\u0119dzie <a href=\"https:\/\/aws.amazon.com\/blogs\/compute\/reducing-java-cold-starts-on-aws-lambda-functions-with-snapstart\/\">oficjalny post wprowadzaj\u0105cy od Amazonu<\/a>.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/heading","attrs":[],"innerBlocks":[],"innerHTML":"\n<h2>Na zako\u0144czenie troch\u0119 detali - kto, na czym, kiedy?<\/h2>\n","innerContent":["\n<h2>Na zako\u0144czenie troch\u0119 detali - kto, na czym, kiedy?<\/h2>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Je\u017celi chcecie dowiedzie\u0107 si\u0119 wi\u0119cej w temacie, chyba najlepszym obecnie miejsce wyja\u015bniaj\u0105cym zawi\u0142o\u015bci SnapStart jest <a href=\"https:\/\/airhacks.fm\/#episode_219\">Podcast Adama Biena airhack.fm<\/a>, w kt\u00f3rym rozmawia on z autorem powy\u017cszego wprowadzenia - <a href=\"https:\/\/twitter.com\/MarkSailes3\">Markiem Sailesem<\/a>, kt\u00f3ry zajmuje w Amazonie stanowisko Specialist Solutions Architect for Serverless. Rozmowa dotyka nie tylko samego SnapStart, ale tak\u017ce innych wyzwa\u0144, kt\u00f3re mog\u0105 spotka\u0107 ch\u0119tnych do spr\u00f3bowania \u015bwiata Serverless.<\/p>\n","innerContent":["\n<p>Je\u017celi chcecie dowiedzie\u0107 si\u0119 wi\u0119cej w temacie, chyba najlepszym obecnie miejsce wyja\u015bniaj\u0105cym zawi\u0142o\u015bci SnapStart jest <a href=\"https:\/\/airhacks.fm\/#episode_219\">Podcast Adama Biena airhack.fm<\/a>, w kt\u00f3rym rozmawia on z autorem powy\u017cszego wprowadzenia - <a href=\"https:\/\/twitter.com\/MarkSailes3\">Markiem Sailesem<\/a>, kt\u00f3ry zajmuje w Amazonie stanowisko Specialist Solutions Architect for Serverless. Rozmowa dotyka nie tylko samego SnapStart, ale tak\u017ce innych wyzwa\u0144, kt\u00f3re mog\u0105 spotka\u0107 ch\u0119tnych do spr\u00f3bowania \u015bwiata Serverless.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Amazon pracowa\u0142 w sekrecie z partnerami i pierwszy z nich - Quarkus - ju\u017c <a href=\"https:\/\/quarkus.io\/blog\/quarkus-support-for-aws-lambda-snapstart\/\">pochwali\u0142 si\u0119 efektami<\/a>. Zesp\u00f3\u0142 pracuj\u0105cym nad projektem podzieli\u0142 si\u0119 nie tylko rozszerzeniem umo\u017cliwiaj\u0105cym u\u017cywanie SnapStart - kt\u00f3re pojawi\u0107 si\u0119 ma ju\u017c wersji eksperymentalnej w kolejnej edycji Quarkusa, wersji 2.15. Opr\u00f3cz tego podzielili si\u0119 oni swoimi wynikami, kt\u00f3re zdaj\u0105 si\u0119 potwierdza\u0107 wersj\u0119 Amazona o dziesi\u0119ciokrotnym przyspieszeniu. Skoro w miar\u0119 szybko startuj\u0105cy Quarkus mo\u017ce si\u0119 pochwali\u0107 takimi wzrostami, ciekawe jak b\u0119dzie to wygl\u0105da\u0142o w przypadku takiego (produkcyjnego, nie \"hello world\" jak w przyk\u0142adzie od AWS) Springa.<\/p>\n","innerContent":["\n<p>Amazon pracowa\u0142 w sekrecie z partnerami i pierwszy z nich - Quarkus - ju\u017c <a href=\"https:\/\/quarkus.io\/blog\/quarkus-support-for-aws-lambda-snapstart\/\">pochwali\u0142 si\u0119 efektami<\/a>. Zesp\u00f3\u0142 pracuj\u0105cym nad projektem podzieli\u0142 si\u0119 nie tylko rozszerzeniem umo\u017cliwiaj\u0105cym u\u017cywanie SnapStart - kt\u00f3re pojawi\u0107 si\u0119 ma ju\u017c wersji eksperymentalnej w kolejnej edycji Quarkusa, wersji 2.15. Opr\u00f3cz tego podzielili si\u0119 oni swoimi wynikami, kt\u00f3re zdaj\u0105 si\u0119 potwierdza\u0107 wersj\u0119 Amazona o dziesi\u0119ciokrotnym przyspieszeniu. Skoro w miar\u0119 szybko startuj\u0105cy Quarkus mo\u017ce si\u0119 pochwali\u0107 takimi wzrostami, ciekawe jak b\u0119dzie to wygl\u0105da\u0142o w przypadku takiego (produkcyjnego, nie \"hello world\" jak w przyk\u0142adzie od AWS) Springa.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":12663,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image.png\" alt=\"\" class=\"wp-image-12663\"\/><figcaption>Aczkolwiek u\u017cywanie Spring w Servelessie jest... interesuj\u0105cym wyborem.<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image.png\" alt=\"\" class=\"wp-image-12663\"\/><figcaption>Aczkolwiek u\u017cywanie Spring w Servelessie jest... interesuj\u0105cym wyborem.<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Pewnym ograniczeniem mo\u017ce by\u0107 dla niekt\u00f3rych fakt, \u017ce ca\u0142o\u015b\u0107 wspierane jest tylko przez Corretto (dystrybucja JDK by Amazon), i to wy\u0142\u0105cznie w wersji 11. Nie powinno Was to jednak przera\u017ca\u0107. Funkcje Lambda w tym momencie i tak nie wspieraj\u0105 JDK 17, a \u017ce ca\u0142o\u015b\u0107 i tak jest uruchamiana w kontrolowanym \u015brodowisku us\u0142ug AWS, nie by\u0142oby sensu udost\u0119pnia\u0107 go na inne dystrybucje. Amazon nie dzieli si\u0119, czy w samym Corretto pojawi\u0142y si\u0119 jakie\u015b modyfikacje niezb\u0119dne do dzia\u0142ania SnapStart.<\/p>\n","innerContent":["\n<p>Pewnym ograniczeniem mo\u017ce by\u0107 dla niekt\u00f3rych fakt, \u017ce ca\u0142o\u015b\u0107 wspierane jest tylko przez Corretto (dystrybucja JDK by Amazon), i to wy\u0142\u0105cznie w wersji 11. Nie powinno Was to jednak przera\u017ca\u0107. Funkcje Lambda w tym momencie i tak nie wspieraj\u0105 JDK 17, a \u017ce ca\u0142o\u015b\u0107 i tak jest uruchamiana w kontrolowanym \u015brodowisku us\u0142ug AWS, nie by\u0142oby sensu udost\u0119pnia\u0107 go na inne dystrybucje. Amazon nie dzieli si\u0119, czy w samym Corretto pojawi\u0142y si\u0119 jakie\u015b modyfikacje niezb\u0119dne do dzia\u0142ania SnapStart.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/separator","attrs":[],"innerBlocks":[],"innerHTML":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","innerContent":["\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Wiem ten artyku\u0142 ma troch\u0119 zaburzone proporcje wst\u0119pu-do-tre\u015bci, bardzo chcia\u0142em unikn\u0105\u0107 problemu poni\u017cszej sowy, tylko przeprowadzi\u0142em Was przez ca\u0142o\u015b\u0107 krok po kroku.<\/p>\n","innerContent":["\n<p>Wiem ten artyku\u0142 ma troch\u0119 zaburzone proporcje wst\u0119pu-do-tre\u015bci, bardzo chcia\u0142em unikn\u0105\u0107 problemu poni\u017cszej sowy, tylko przeprowadzi\u0142em Was przez ca\u0142o\u015b\u0107 krok po kroku.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","id":12704,"sizeSlug":"full","linkDestination":"none"},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-8.png\" alt=\"\" class=\"wp-image-12704\"\/><figcaption><a href=\"https:\/\/cdn.discordapp.com\/attachments\/984632500875821066\/1047816856116920351\/ArturSkowronski_rest_of_the_owl_5714a968-445b-4271-a86e-4a89a67deae5.png\">Chocia\u017c... @Midjourney Bot - \"<em>imagine rest of the owl --v 4<\/em>\"<\/a> \ud83e\udd37\ud83c\udffb<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter size-full\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/image-8.png\" alt=\"\" class=\"wp-image-12704\"\/><figcaption><a href=\"https:\/\/cdn.discordapp.com\/attachments\/984632500875821066\/1047816856116920351\/ArturSkowronski_rest_of_the_owl_5714a968-445b-4271-a86e-4a89a67deae5.png\">Chocia\u017c... @Midjourney Bot - \"<em>imagine rest of the owl --v 4<\/em>\"<\/a> \ud83e\udd37\ud83c\udffb<\/figcaption><\/figure>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/paragraph","attrs":[],"innerBlocks":[],"innerHTML":"\n<p>Mam nadzieje, \u017ce lepiej teraz rozumiecie, na plecach jakich gigant\u00f3w stoi SnapSeed i co tam si\u0119 po drodze musia\u0142o wydarzy\u0107, \u017ceby w 2022 Amazon m\u00f3g\u0142 si\u0119 chwali\u0107 programistom JVM now\u0105 funkcjonalno\u015bci\u0105 swojej Lambdy. A za tydzie\u0144 mam nadzieje podsumujemy sobie bie\u017c\u0105czk\u0119, bo takowej si\u0119 troch\u0119 nazbiera\u0142o - chyba, \u017ce zbli\u017caj\u0105ca si\u0119 wielkimi krokami Rampdown JDK 20 czym\u015b nas mocno zaskoczy.<\/p>\n","innerContent":["\n<p>Mam nadzieje, \u017ce lepiej teraz rozumiecie, na plecach jakich gigant\u00f3w stoi SnapSeed i co tam si\u0119 po drodze musia\u0142o wydarzy\u0107, \u017ceby w 2022 Amazon m\u00f3g\u0142 si\u0119 chwali\u0107 programistom JVM now\u0105 funkcjonalno\u015bci\u0105 swojej Lambdy. A za tydzie\u0144 mam nadzieje podsumujemy sobie bie\u017c\u0105czk\u0119, bo takowej si\u0119 troch\u0119 nazbiera\u0142o - chyba, \u017ce zbli\u017caj\u0105ca si\u0119 wielkimi krokami Rampdown JDK 20 czym\u015b nas mocno zaskoczy.<\/p>\n"]},{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"\n\n","innerContent":["\n\n"]},{"blockName":"core\/image","attrs":{"align":"center","width":445,"height":134},"innerBlocks":[],"innerHTML":"\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/CDuKBwZ.png\" alt=\"\" width=\"445\" height=\"134\"\/><figcaption>Aczkolwiek nie obiecuje sobi\u0119 ju\u017c na tym etapie za du\u017co \ud83d\ude04<\/figcaption><\/figure>\n","innerContent":["\n<figure class=\"wp-block-image aligncenter is-resized\"><img src=\"https:\/\/vived.io\/wp-content\/uploads\/2022\/12\/CDuKBwZ.png\" alt=\"\" width=\"445\" height=\"134\"\/><figcaption>Aczkolwiek nie obiecuje sobi\u0119 ju\u017c na tym etapie za du\u017co \ud83d\ude04<\/figcaption><\/figure>\n"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/12629","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/comments?post=12629"}],"version-history":[{"count":60,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/12629\/revisions"}],"predecessor-version":[{"id":12713,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/12629\/revisions\/12713"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media\/12707"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=12629"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=12629"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=12629"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}