Slide 1

Slide 1 text

コンテナ・サーバーレス環境に 対応しよう 2023年11月30日 Shigeki Shoji

Slide 2

Slide 2 text

庄司重樹 受賞歴 AWS 2023 Japan Top Engineers 資格 AWS認定12冠 (All Certifications) Professional Scrum Product Owner I Professional Scrum Master I Professional Scrum Developer I 翻訳レビュー Sam Newman著「モノリスからマイクロサービスへ」 2020. O’Reilly. コミュニティ AWS Community Builders program、関ジャバ、JJUG、Scala関西、もめんと会他 2

Slide 3

Slide 3 text

イベントの 宣伝 梅田で「もめんと会」します。よろしくお願いしま す! https://momentocommunity.connpass.com/event/3 02306/ 3

Slide 4

Slide 4 text

アジェンダ • 進化的アーキテクチャ • Javaの課題 • サイズを小さく • 起動時間を短く • まとめ 4

Slide 5

Slide 5 text

進化的 アーキテ クチャ 漸進的 誘導的 多元的 “Monoliths are not dinosaurs” - @WERNER https://www.allthingsdistributed.com/2023/05 /monoliths-are-not-dinosaurs.html 5

Slide 6

Slide 6 text

なぜJava? • 漸進的な小さな変更のために、動いているモ ジュールを再利用したい • 言語を変えて漸進的な小さな変更を実現する のは難しいかもしれない。どちらかというと 破壊的変更につながる場合が多そう 6

Slide 7

Slide 7 text

Javaは進化 を続けて いる JVMは人類の叡智の結晶だ 7

Slide 8

Slide 8 text

Quiz コンテナ・サーバーレスのアプリケーションで重要なことは? 1. イメージサイズの小ささ 2. 依存ライブラリのロードの俊敏さ 3. 起動の俊敏さ 8

Slide 9

Slide 9 text

俊敏なス ケール要 求 • 以前はサーバの増設、キャパシティを増やす のに数ヶ月かかることも多かった • 仮想化の進化、クラウドの登場により、今で は1秒以内でサーバのスケールが要求されるこ とも 9

Slide 10

Slide 10 text

高速な起 動を阻む もの達 • イメージのロードにかかる時間 • クラスファイルの解釈、Just In Timeコンパイ ラがコンパイルする時間 • 必要なリソースへの接続等の初期化 10

Slide 11

Slide 11 text

イメージ のロード にかかる 時間の短 縮 • コンテナの場合 distroless などの小さく不要 なものを含まないベースイメージを選択しよ う • jlinkを使って小さく不要なものを含まない Javaランタイムを準備しよう https://learn.microsoft.com/ja- jp/java/openjdk/java-jlink-runtimes 11

Slide 12

Slide 12 text

jlink • Java 9 以降で使用可能 • 必要なモジュールだけのJREを作れる 12

Slide 13

Slide 13 text

Nativeイ メージに する • メリット • イメージサイズを大幅に小さくできる • 起動の高速化が期待できる • デメリット • リフレクションが使えない場合がある等、 使える言語機能に制約があり、コードの修 正が必要になるかもしれない • JITによる最適化が期待できない 13

Slide 14

Slide 14 text

CRaCを使 う • メリット • プロビジョニングする同時実行数の見積も りが不要 • SnapStart にかかる課金がない • デメリット • AWS LambdaではArmをサポートしていな い • 初期化時に外部リソース等を保持している 場合、Runtime hooksの実装が必要になる かもしれない • Java 11 以降 (Java 11、Java 17、Java 21) のマネージドランタイムのみサポート • Provisioned Concurrency との併用ができ ない等 14

Slide 15

Slide 15 text

CRaC があるとき〜 15 https://github.com/takesection-sandbox/aws-lambda-scala

Slide 16

Slide 16 text

CRaC がないとき〜 16

Slide 17

Slide 17 text

トレンド InfoQ Java Trends Report - November 2023で は、CRaC がイノベータに https://www.infoq.com/articles/java-trends- report-2023/ 17

Slide 18

Slide 18 text

起動した インスタ ンスを保 持する • メリット • Javaランタイムに限らず、また Intel でも Arm でもどちらにも適用可能 • デメリット • 5分単位での課金 • 必要なインスタンス数を見積もる必要があ る 18

Slide 19

Slide 19 text

コネク ション プール • RDBなどのリソースに毎回接続すると、認証 等にかかるオーバーヘッドがある。これを回 避するためにあらかじめ一定量の接続を保持 して、必要に応じてこれを払い出すパターン がある。 • 複数スレッドが異なるトランザクションを実 行する、伝統的なサーバアプリケーションで は有用だったが、サーバーレスのように1イ ンスタンス1トランザクションという処理だ と基本的に不要。さらにスケールした場合に 使われない接続が大量に発生することになる が、これはRDB側にとって害となる。 • ただし、接続が切れた時に自動的に再接続す る機能は嬉しいかもしれない。 19

Slide 20

Slide 20 text

コンポー ネントス キャンに 注意 • Spring Framework等にあるコンポーネントス キャンは依存ライブラリから必要なクラスを 見つけるときzipにアーカイブされたファイル 一覧を読み取り、インジェクションを実行す る。一般的にこの処理は遅く、起動時間に影 響する。 • クラス数の少ないパッケージをコンポーネン トスキャンの対象に選ぶ。 https://github.com/takesection- sandbox/scan-classpath 20

Slide 21

Slide 21 text

まとめ • イメージサイズを小さくしよう • 初期化処理はほどほどに • CRaC、初期化済みインスタンスの活用、 Native化のメリット、デメリットを検討して 採用しよう 21

Slide 22

Slide 22 text

22 ご清聴ありがとうございました