紙一重の積み重ね

アラフォーのエンジニアがなれる最高の自分を目指して、学んだことをこつこつ情報発信するブログです。

【デブサミ2020レポート】開発に集中するためのJava on Serverless #devsumiC

f:id:yokoyantech:20200214115603j:plain

はじめに

2020年2月14日に開催されたDevelopers Summit2020に参加してきました。

event.shoeisha.jp

テーマ

【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サーバ
  • サーバレスにすると
    • 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
      • 関数・メソッド起動
  • 対策
    • 不要ライブラリを削除
    • プレーンJavaで書く(zipファイルの縮小)

機能横断的要件に対応する

  • プレーンJavaだけで機能横断的に要件満たせるのか?
    • いわゆる非機能要件
  • by Spring Boot
    • ログや認証認可など
    • 結果、FAT jar になる
  • FAT jarをLambdaに乗せると、Cold Startの頻度が上がる
  • Jarを痩せ細らせたい
    • Skinny jar
      • アプリケーションロジックのみ
  • AWS の場合
    • 他サービスを組み合わせる
      • 認証認可
        • Cogito
      • ログ
        • CloudWatch
  • 最初から機能値化するべきではない
    • ビジネスが成功するかわからないのなら、必要最低限からスタートするべし

(それでも)Frameworkを使いたい!!

  • まずは最小構成で考えてみる
    • AWS SDK+Open JDK
  • アイディア
    • Daggerを使う
      • Compile Time DI
      • ビルド時にDI
      • つまり、Cold Startが起きない

SpringBoot on Lambda

  • Thin jarにする
    • 丁度いいところでまとめたjar
    • ロジック+Spring boot - アプリケーションサーバ
      • aws-serverless-java-container
        • OSS
        • Githubで公開中
    • デプロイ方法
      • 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
      • サポート外
        • 動的なクラスロード

Lambdaを暖機しよう

  • アクセスの急増(スパイク)
    • スパイク時にCold Startが起きる
  • ProVisioned Concurrency
    • 最近発表された
    • Warm Start でバーストする
      • 900まで利用可能
  • 実験
    • 200Requests
    • すべてwarm start

感想とまとめ

Javaを具体例としたお話でしたが、Ruby使いの私が聞いても十分役に立つお話でした。これまでもproduction環境でLambdaを使っていますが、Lambdaも進化している話が聞けてよかったです。