Je艣li przeczyta艂e艣(a艣) punkt si贸dmy z mojego poradnika 12 Rzeczy o Serverless, Kt贸re Musisz Wiedzie膰 Przed Rozpocz臋ciem Projektu W Chmurze AWS to na pewno masz ju偶 rozeznanie w czym problem. Jednak dla jasno艣ci przybli偶臋 go jeszcze raz.
Sk膮d bierze si臋 cold start / zimny start
Jak wiemy funkcja AWS Lambda jest uruchamia w nast臋pstwie zdarzenia (偶膮danie http, upload pliku, nadej艣cie wiadomo艣ci, harmonogram itp.). Zanim to zdarzenie nast膮pi funkcja nie istnieje w stanie aktywnym, jest tylko kodem 藕r贸d艂owym (b膮d藕 binarnym) oraz konfiguracj膮, kt贸r膮 wgrali艣my do us艂ugi. Zdarzenie wywo艂uj膮ce inicjalizuje proces, kt贸rego celem jest pozyskanie i skonfigurowanie niezb臋dnych zasob贸w w celu uruchomienia Twojego kodu.
Uog贸lniaj膮c, AWS musi przydzieli膰 nowy kontener i wgra膰 tam kod 藕r贸d艂owy lub skompilowan膮 wersje binarn膮 Twojej funkcji wraz z bibliotekami, a nast臋pnie zainicjalizowa膰 wywo艂anie tego kodu (przekaza膰 zdarzenie jako parametr do funkcji). To wszystko trwa.
Bez wzgl臋du na to jaki j臋zyk programowania wybierzesz ta procedura zawsze jest taka sama.
Ile trawa cold start?
Tak prezentuj膮 si臋 aktualne czasy cold startu dla r贸偶nych j臋zyk贸w, (rok i dwa lata temu by艂y zupe艂nie inne; wida膰, 偶e AWS ci膮gle nad nimi pracuje). Ciemniejsze fragmenty s艂upk贸w pokazuj膮 typowe czasy start贸w - statystycznie 67% funkcji 艂aduje si臋 w tym czasie. Przyk艂adowo dla JavaScript to b臋dzie przedzia艂 mi臋dzy 150 a 250 milisekund.
Co jeszcze wp艂ywa na cold start?
- Wielko艣膰 przydzielonej pami臋ci dla funkcji lambda
- Wielko艣膰 naszego kodu (w tym bibliotek, kt贸rych u偶ywamy)
- To czy lambda jest deployowana w VPC (aby np. mie膰 dost臋p do RDS)
Niestety, cold start zawsze wyst臋puje, wynika to z budowy tej us艂ugi. Natomiast czasem mo偶e by膰 pomijalnie niski, ale to ju偶 kwestia indywidualnej oceny w kontek艣cie konkretnego rozwi膮zania, kt贸re budujemy.
Cold start a skalowalno艣膰
Co wa偶ne, problem cold startu wyst臋puje dla ka偶dej instancji funkcji. Innymi s艂owy gdy pierwsze zdarzenie uruchomi艂o pierwsz膮 instancj臋 funkcji i ona wci膮偶 si臋 wykonuje, to drugie zdarzenie b臋dzie musia艂o uruchomi膰 drug膮 instancj臋. AWS musi uruchomi膰 kolejny kontener z kopi膮 Twojej funkcji. Po raz kolejny trzeba przej艣膰 przez ca艂e 艂adowanie i zn贸w mamy cold start.
Natomiast trzecie zdarzenie, kt贸re nast膮pi po wykonaniu si臋 przynajmniej jednej z funkcji, mo偶e wykorzysta膰 ju偶 uruchomiony kontener z nasz膮 funkcj膮. Nazywamy j膮 rozgrzan膮 funkcj膮, poniewa偶 nie ma zimnego startu 馃槂
Projektuj膮c skalowalne systemy koniecznie trzeba mie膰 艣wiadomo艣膰 tego mechanizmu.
Nie zawsze musisz si臋 przejmowa膰 cold startem
Wbrew pozorom cold start nie zawsze stanowi problem. W przypadku wielu rozwi膮za艅, pracuj膮cych batchowo, asynchronicznie bez kontaktu z klientem zewn臋trznym nie stanowi r贸偶nicy czy funkcja uruchamia si臋 200ms czy 2000ms (nie p艂acimy za to). Problem jest tylko wtedy, gdy po drugiej stronie czeka na odpowied藕 cz艂owiek, kt贸ry mo偶e si臋 zirytowa膰 d艂ugim czasem oczekiwania.
Jak walczy膰 z cold startem?
Mo偶na na wiele sposob贸w. Jednym z najprostszych i darmowych jest programowanie w j臋zykach skryptowych, kt贸re maj膮 mniejsze wymagania, co do 艂adowania swoich 艣rodowisk uruchomieniowych w stosunku do j臋zyk贸w kompilowanych obs艂ugiwanych przez Lambd臋. W chwili obecnej mo偶na ju偶 艣mia艂o napisa膰, 偶e nale偶y pisa膰 w JavaScript (node.js), z racji szybko艣ci startu oraz popularno艣ci tego j臋zyka - przewa偶aj膮ca ilo艣膰 rozwi膮za艅, ksi膮偶ek, kurs贸w i przyk艂ad贸w jest w艂a艣nie w Node.js.
Oczywi艣cie je艣li Ty lub Tw贸j zesp贸艂 znacie Pythona czy Go to mog膮 one by膰 dla Was lepsze ni偶 nauka JavaScript, ale je艣li jeste艣 ze 艣wiata Java lub .Net to nie miej z艂udze艅 - nauka JavaScript na pewno wyjdzie Ci na dobre 馃槣
Innym popularnym podej艣ciem, kt贸re sprawdza si臋 u wielu os贸b, jest stosowanie asynchronicznego API w miejsce synchronicznego. Na przyk艂ad gdy u偶ytkownik naszej aplikacji webowej chce wygenerowa膰 raport w PDF to zamiast synchronicznie czeka膰 na zako艅czenie generowania pliku, mo偶na zwr贸ci膰 mu token z ID raportu i strona WWW b臋dzie si臋 odpytywa艂a backend czy ju偶 wygenerowa艂 raport dla u偶ytkownika. Mo偶na te偶 wykorzysta膰 websocket i wypchn膮膰 powiadomienie do klienta gdy raport b臋dzie gotowy. Opowiada艂em o tym na swojej prezentacji na konferencji Greenfield w 艁odzi - nagranie tutaj.