はじめに
2020年2月14日に開催されたDevelopers Summit2020に参加してきました。
テーマ
【14-C-2】開発に集中するためのJava on Serverless
カテゴリ
アプリケーション開発
登壇者
- 下川 賢介さん[アマゾン ウェブ サービス ジャパン]
- @_kensh
発表資料
講演メモ
Serverlessってなんですか?
- みんな使ってます??
- 参加者の半分くらい挙手
- 2002年にAmazon.comを改修した
- 役割の違い
- モノリス
- 全部担当
- マイクロサービス
- 単一機能を担当
- それを組み合わせていく
- 独立している
- 分散している
- モノリス
- アーキテクチャ例
- 独立・分散したAPIを組み合わせる
- モノリスのデリバリー
- 開発チームが1つ
- なにか1つの修正を加えると、同じデリバリーパイプラインを通る
- パイプラインが太い
- 時間がかかる
- 半日かけてビルドすることも。。。
- マイクロサービスのデリバリー
- 開発チームがサービス毎に分離される
- パイプラインがサービス毎に分かれる
- 早い
- モノリスのスケール
- スケール単位はVM
- マイクロサービスのスケール
- 1つのVMの中にコンテナがいる
- スケールはプロセス単位
- 効率がいい
Javaでマイクロサービス
- Javaでマイクロサービスというと、SpringBoot?
- 起動に時間がかかる?
- JVMの課題
- コンテナやサーバレスは、素早くスケールさせたい
- AWS Lambda+Javaという選択肢はどうか?
- サーバレスにするとマイクロサービスを作りやすい
- API Gateway+Lambda
- ロジックを書くのはLambda側
- サービスで考慮すること
- 運用
- 運用者の気持ち
- インフラ管理したくない
- コストさげたい
- スケールさせたい
- 高可用性、securityを満たしたい
- 全部難易度は高い
- Lambdaとは
- Java8からLambda式があるがこれではないw
- インフラ管理不要
- 使った分だけの支払い
- 処理時間で支払い
- デプロイしただけではコストはかからない
- 自動スケール
- 高可用性かつ安全
- Function単位でコンテナが立ち上がる
- 開発に集中できる!!
- みんながやりたいのはビジネスへの貢献
- これまでのJava環境
- Nginx+jetty://
- WEBサーバ+APサーバ
- Nginx+jetty://
- サーバレスにすると
- API Gateway+Lambda
- Lambdaのマネジメントコンソール
- Java11も使える
- Java以外も使えるよ
Java on Serverless を深く知る
- Cold Start
- 初回起動のLambdaインスタンスはCold Startする
- 初期設定で時間がかかる
- 2回目からはWarm Startになる
- 3 request, 2 concurrency
- 検証
- 200 requests, 50 concurrency
- 130RequestがWarmStart
- それ以外がCold Start
- このレイテンシを許容できるか?
- Javaだけの問題なのか?
- vs Nodejs Lambda
- Javaの1/2パフォーマンス(nodeが早い)
- Lambdaのライフサイクル
- Cold Start
- コンテナ生成
- デプロイ(zip)
- パッケージロード
- パッケージ展開
- ランタイム起動
- VM
- 初期化
- Static Field
- Warm Start
- 関数・メソッド起動
- Cold Start
- 対策
- 不要ライブラリを削除
- プレーンJavaで書く(zipファイルの縮小)
機能横断的要件に対応する
- プレーンJavaだけで機能横断的に要件満たせるのか?
- いわゆる非機能要件
- by Spring Boot
- ログや認証認可など
- 結果、FAT jar になる
- FAT jarをLambdaに乗せると、Cold Startの頻度が上がる
- Jarを痩せ細らせたい
- Skinny jar
- アプリケーションロジックのみ
- Skinny jar
- AWS の場合
- 他サービスを組み合わせる
- 認証認可
- Cogito
- ログ
- CloudWatch
- 認証認可
- 他サービスを組み合わせる
- 最初から機能値化するべきではない
- ビジネスが成功するかわからないのなら、必要最低限からスタートするべし
(それでも)Frameworkを使いたい!!
- まずは最小構成で考えてみる
- AWS SDK+Open JDK
- アイディア
- Daggerを使う
- Compile Time DI
- ビルド時にDI
- つまり、Cold Startが起きない
- Daggerを使う
SpringBoot on Lambda
- Thin jarにする
- 丁度いいところでまとめたjar
- ロジック+Spring boot - アプリケーションサーバ
- aws-serverless-java-container
- OSS
- Githubで公開中
- aws-serverless-java-container
- デプロイ方法
- git clone
- mvn package
- sam package
- sam deploy
- 内部構造
- EventをHttpServletRequestに自動変換
- HttpServletResponseをvalueに自動変換
- 実験
- 200Requests, 50
- Warm Startが149
- Skinny jarよりも遅くなっている
MICRONAUT
- GraalVM対応
- Oracleが開発している新田なJVM
- JDK8や11の代用として利用可能
- Java以外の言語も扱える
- ネイティブコードをバイナリとして生成できる
- JavaのCold Startを軽減が見込まれる
- AWS 公式サポート外
- Twitterが本番環境で採用
- 仕組み
- HotSpot VM
- JVM CI
- Substrate VM
- この上でRubyやRが動く
- デプロイ方法
- git clone
- gradle compile
- docker build
- docker上にGraalVMが乗る
- sam package
- sam deploy
- 実験
- 200Requests
- WarmStartが134
- GraalVM + spring bootは困難
- GraalVM側に制約がある
- Reflection
- Dynamic Proxy
- サポート外
- 動的なクラスロード
- GraalVM側に制約がある
Lambdaを暖機しよう
- アクセスの急増(スパイク)
- スパイク時にCold Startが起きる
- ProVisioned Concurrency
- 最近発表された
- Warm Start でバーストする
- 900まで利用可能
- 実験
- 200Requests
- すべてwarm start
感想とまとめ
Javaを具体例としたお話でしたが、Ruby使いの私が聞いても十分役に立つお話でした。これまでもproduction環境でLambdaを使っていますが、Lambdaも進化している話が聞けてよかったです。