Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AWS Lambda SnapStart で Java の起動高速化できるって本当ですか? #javado

AWS Lambda SnapStart で Java の起動高速化できるって本当ですか? #javado

JavaDoでしょう#21
https://javado.connpass.com/event/270973/

AWS Lambda SnapStart で Java の起動が高速化されるようになった、という話とデモ。

Kihara, Takuya

January 28, 2023
Tweet

More Decks by Kihara, Takuya

Other Decks in Technology

Transcript

  1. JavaDoでしょう#21 / #javado 2 木原 卓也 Kihara, Takuya / tacck

    生活協同組合コープさっぽろ ゆるWeb勉強会@札幌 AWS Community Builder デジタル推進本部システム部 主催 Amplify Japan User Group 運営メンバー Q2 2021, 2022 / Category: Front-end Web and Mobile 好きなフィギュアスケートの技 スプレッド・イーグル
  2. AWS Lambda SnapStart • re:Invent 2022 で発表 (2022年11月29日) • Lambda

    のランタイムで Java 11 を選んだ場合に、 コールドスタートを劇的に早くする仕組み。 6 JavaDoでしょう#21 / #javado
  3. AWS Lambda Lifecycle • ライフサイクルは三つの状態に大別 • INIT : 初期化関係 (マイクロコンテナ起動、ラインタイム起動、関数初期化)

    • INVOKE: 関数実行 • SHUTDOWN: マイクロコンテナの終了 7 JavaDoでしょう#21 / #javado https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtime-environment.html#runtimes-lifecycle
  4. Lambda 起動における状態 • 関数の実行には二つの状態があり、実行されるライフサイクルの起点 が異なる。 • Cold Start • INIT

    から実行(コンテナが新規に作成される) • Warm Start • INVOKE から実行(起動済みコンテナの流用) 8 JavaDoでしょう#21 / #javado https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtime-environment.html#runtimes-lifecycle Warm Start Cold Start
  5. なぜ Java の起動は遅いと言われるか • ライフサイクルは三つの状態に大別 • INIT : 初期化関係 (マイクロコンテナ起動、ラインタイム起動、関数初期化)

    • INVOKE: 関数実行 • SHUTDOWN: マイクロコンテナの終了 • 関数初期化時に “JVMの起動” が必要 →ここに一定の時間が必要 • INIT 処理後のスナップショットを撮って、 それを使えば早くなるんじゃね? → Lambda SnapStart 9 JavaDoでしょう#21 / #javado
  6. 比較 • 円周率を求める関数を使って、起動の重い処理を表現。 11 JavaDoでしょう#21 / #javado Lambda の設定 円周率関数を呼ぶ場所

    Lambda の状態 起動 従来の Lambda 起動 INVOKE Cold Start 重い Warm Start 重い INIT Cold Start 重い Warm Start 軽い SnapStart で Lambda 起動 INVOKE Cold Start 重い Warm Start 重い INIT Cold Start 軽い Warm Start 軽い
  7. 本当です! • Cold Start が重いから Lambda で Java はちょっと、、、 となっていたが、今後は選択肢として十分に選べる。

    • 利用できるランタイムは、 Java 11 のみ。 (Java 8 は対象外) • 利用料は無料!! • INIT処理がスナップショット化されるので、 例えば実行ごとにユニークIDを生成したい、という場合 ユニークID生成処理は INVOKE に入れましょう。 13 JavaDoでしょう#21 / #javado