{"id":13989,"date":"2019-02-23T11:24:57","date_gmt":"2019-02-23T10:24:57","guid":{"rendered":"https:\/\/www.sysbus.eu\/?p=13989"},"modified":"2019-02-20T11:26:57","modified_gmt":"2019-02-20T10:26:57","slug":"tipp-schnellere-kaltstarts-fuer-aws-lambda","status":"publish","type":"post","link":"https:\/\/www.sysbus.eu\/?p=13989","title":{"rendered":"Tipp: Schnellere Kaltstarts f\u00fcr AWS Lambda"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Bei der Nutzung von AWS Lambda k\u00f6nnen, auch in Zusammenspiel mit Amazon API Gateway Kaltstart-Zeiten, sogenannte \u201eCold Starts\u201c eine wichtige Rolle spielen. Dabei handelt es sich um Wartezeiten f\u00fcr den ersten Aufruf einer Lambda-Funktion, wenn AWS Lambda die Infrastruktur hochfahren, die Runtime-Umgebung provisionieren und den Code starten muss.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"750\" height=\"450\" src=\"https:\/\/www.sysbus.eu\/wp-content\/uploads\/2019\/02\/Sysbus-Tipp_Cold-Starts.png\" alt=\"\" class=\"wp-image-13990\" srcset=\"https:\/\/www.sysbus.eu\/wp-content\/uploads\/2019\/02\/Sysbus-Tipp_Cold-Starts.png 750w, https:\/\/www.sysbus.eu\/wp-content\/uploads\/2019\/02\/Sysbus-Tipp_Cold-Starts-300x180.png 300w\" sizes=\"auto, (max-width: 750px) 100vw, 750px\" \/><figcaption>Grafik: AWS<\/figcaption><\/figure>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\">Mehrere Faktoren k\u00f6nnen dabei die Geschwindigkeit f\u00fcr den ersten Funktionsstart beeinflussen:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Speicher-\nund CPU-Zuweisung: AWS Lambda weist dem Speicher, den Sie Ihren Funktionen\nzuweisen, eine proportionale Anzahl von CPU-Anteilen zu. Wenn Ihr Code\nCPU-gebunden ist, erh\u00f6hen Sie diesen Wert, um die Leistung zu verbessern.<\/li><li>Paketgr\u00f6\u00dfe\ndes Codes: Jedes Mal, wenn eine Lambda-Funktion zum ersten Mal startet, muss\ndas entsprechende Codepaket heruntergeladen und entpackt werden. Die Gr\u00f6\u00dfe der\nentsprechenden ZIP-Datei ist relevant. Beim Import von Abh\u00e4ngigkeiten sollten\nSie deshalb vorsichtig sein und zum Beispiel das Maven Shade Plugin nutzen, um\nunn\u00f6tige transitive Abh\u00e4ngigkeiten zu entfernen.<\/li><li>Code\nLebenszyklus: Wenn Sie Ihre Funktion zum ersten Mal starten, erstellt AWS\nLambda eine Instanz Ihrer Laufzeitumgebung sowie Ihres laufenden Codes. Diese\nwird f\u00fcr zuk\u00fcnftige Aufrufe wiederverwendet. Bei jedem neuen Aufruf Ihrer\nLambda-Funktion wird die Handler-Funktion beziehungsweise die Handler-Methode\ndirekt angesprochen, ohne den Programmcode neu zu laden. Das bedeutet, dass\nObjekte, die beim ersten Aufruf initialisiert wurden bei jedem weiteren Aufruf\nwiederverwendet werden k\u00f6nnen. Sie k\u00f6nnen also globale Variablen, Class\nObjects, etc. verwenden, um Metadaten, Objekte und Verbindungen \u00fcber mehrere\nLambda-Funktionsaufrufe hinweg zu speichern, und diese \u00fcber einen l\u00e4ngeren\nZeitraum hinweg wiederverwenden. Diese Methode eignet sich auch, um den\nRAM-Speicher Ihrer Lambda-Umgebung als Cache zu verwenden.<\/li><li>Apropos\nCaching: Vermeiden Sie das Zwischenspeichern vertraulicher Daten, das k\u00f6nnte zu\nSicherheitsproblemen f\u00fchren, wenn etwa vergessen wird, zwischengespeicherte,\nvertrauliche Daten zwischen einzelnen Aufrufen zu bereinigen.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Verschiedene\nProgrammiersprachen und ihre Frameworks haben unterschiedliche Eigenschaften\nund Leistungsmerkmale. Bei Java sind zum Beispiel Spring und Spring Boot extrem\nleistungsstark, wenn es um die Injektion von Abh\u00e4ngigkeiten und die\nautomatische Verbindung von Anwendungen geht. Der Nachteil der gro\u00dfen\nFlexibilit\u00e4t sind schlechtere Zeiten beim Cold Start. Jersey f\u00fchrt nur eine\nbegrenzte Reflexion durch, um die jeweiligen Provider und Ressourcen\nanzubinden. Spark, bei dem alles \u201estatisch verkn\u00fcpft\u201c ist, ist in der Java-Welt\nbei weitem das schnellste Framework.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Generell\nzeigen Skript-Sprachen wie Python oder JavaScript (Node.js) k\u00fcrzere\nCold-Start-Zeiten. Man erkauft sich diesen Vorteil aber durch eine insgesamt\nniedrigere Effizienz bei starker Nutzung, etwa bei API-Implementationen mit\nhohem Durchsatz \u00fcber einen l\u00e4ngeren Zeitraum hinweg \u2013 hier ist Java wiederum\ndurch die Vorteile des Hotspot-Compilers besser. Programmiersprachen wie Go und\nRust haben hier potenziell gro\u00dfe Vorteile, da sie als kompilierte Sprachen mit\nstatischen Binaries sehr kurze Cold-Start-Zeiten unterst\u00fctzen und gleichzeitig\nsehr performant sein k\u00f6nnen.\n\nWelche Sprache beziehungsweise welches Framework\nist also am ehesten geeignet? Sofern Sie keine strengen Anforderungen an die\nLatenz haben, w\u00e4hlen Sie einfach das Framework, mit dem Sie am besten vertraut\nsind. Eine Cold-Start-Optimierung ist in der Regel nur dann notwendig, wenn die\nLatenzzeit Ihrer Anwendung sehr wichtig ist und die Lambda-Funktion nur selten\naufgerufen wird oder gelegentliche Peaks in der Laufzeit sich sehr st\u00f6rend auf\ndie Nutzererfahrung auswirken \u2013 Hier kann man jedoch mit ein paar Optimierungs-Ma\u00dfnahmen\nin der Regel schnell Abhilfe schaffen, ohne gleich das Framework oder die\nProgrammiersprache wechseln zu m\u00fcssen.\n\n\n\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bei der Nutzung von AWS Lambda k\u00f6nnen, auch in Zusammenspiel mit Amazon API Gateway Kaltstart-Zeiten, sogenannte \u201eCold Starts\u201c eine wichtige<\/p>\n","protected":false},"author":3,"featured_media":13990,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[22,6],"tags":[4185,4135,12097,551,12096,11683,5067],"class_list":["post-13989","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cloud","category-tipps","tag-api","tag-aws","tag-cold-start","tag-java","tag-kaltstart","tag-lambda","tag-runtime"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.sysbus.eu\/index.php?rest_route=\/wp\/v2\/posts\/13989","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sysbus.eu\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sysbus.eu\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sysbus.eu\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sysbus.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=13989"}],"version-history":[{"count":1,"href":"https:\/\/www.sysbus.eu\/index.php?rest_route=\/wp\/v2\/posts\/13989\/revisions"}],"predecessor-version":[{"id":13991,"href":"https:\/\/www.sysbus.eu\/index.php?rest_route=\/wp\/v2\/posts\/13989\/revisions\/13991"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.sysbus.eu\/index.php?rest_route=\/wp\/v2\/media\/13990"}],"wp:attachment":[{"href":"https:\/\/www.sysbus.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=13989"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sysbus.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=13989"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sysbus.eu\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=13989"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}