Spring Bootでマイクロサービス作って苦労したお話 / DeveloperSummit2019-SpringBoot

Spring Bootでマイクロサービス作って苦労したお話 / DeveloperSummit2019-SpringBoot

Developers Summit 2019でお話した資料です。

資料から読み取れない部分を一部Qiitaで補足しています。
https://qiita.com/h-r-k-matsumoto/items/4b639ed1f87fd6f67a4e

C3b1ef9f91b51492b297d300e5bc677a?s=128

Broadleaf Co., Ltd.

February 14, 2019
Tweet

Transcript

  1. 2.

    Copyright © Broadleaf Co., Ltd. All Rights Reserved. 1 自己紹介

    松本 宏紀 株式会社ブロードリーフ 基盤開発部 (札幌) • システム・アーキテクト • ソフトウェア・エンジニア • オフショアラボチームリーダー • デブサミ2018夏: [Cassandra x Kubernetesによる大規模データ基盤の仕組みと苦労]
  2. 3.

    Copyright © Broadleaf Co., Ltd. All Rights Reserved. 2 Spring

    Boot 好きです。 本日のテーマ
  3. 4.

    Copyright © Broadleaf Co., Ltd. All Rights Reserved. 3 猫も杓子もSpring

    Boot。 JavaといえばSpring Boot。 そんなにSpring Bootがいいですか? マイクロサービス・アーキテクチャでも? 本日のテーマ
  4. 5.

    Copyright © Broadleaf Co., Ltd. All Rights Reserved. 4 マイクロサービスアーキテクチャっぽいサービス開発。

    Service Service Service Service Service Service Service Service 背景 Spring Boot Spring Data JDBC Cassandra Elasticsearch Redis Spring for Apache Kafka等々… DATA-FRMEWORK マルチテナントにおける各データストアアクセスの提供、 及びデータ・ディクショナリ提供 API-FRAMEWORK RESTful APIの提供するためのフレームワーク。 認証、認可(role,license)…などの共通化。 SERVICE 各サービスの実装。 >=43
  5. 6.

    Copyright © Broadleaf Co., Ltd. All Rights Reserved. 5 問題

    アプリケーションの起動が遅い。 アプリケーションのテストが遅い。 開発 運用 遅い。人が待たされる。 開発
  6. 7.

    Copyright © Broadleaf Co., Ltd. All Rights Reserved. 6 起動が遅い

    開発中、速く動作確認したいけど、中途半端に待たされる。 BUILD TEST DEPLOY maxUnavailable = replicas/2 2分待つことになる。 入れ替えの順序性が必要な場合だと待たされるのがつらい。 65秒 15秒 11分 podがOOMとかで落ちちゃった際の修復時間に直結して遅くなる。 Gitlab RunnerのPIPELINEが詰まる。 ci-worker1 BUSY pipeline request 起動が遅い。 開発 開発 開発 運用
  7. 8.

    Copyright © Broadleaf Co., Ltd. All Rights Reserved. 7 起動が遅い

    a)起動時に最適化:CPU割当増やす。 b) コストで最適化:このまま。運用状態での最適化。 c) やれることやろう! d) golangに段階的に移行しよう! 理由1:CPU割当が潤沢ではない。(limit:600ms) 理由2:膨大なクラス数のロード。(14,000~)
  8. 9.

    Copyright © Broadleaf Co., Ltd. All Rights Reserved. 8 起動が遅い

    起動時間:65秒→48秒 • Java8+Spring Boot 1.5→Java11+Spring Boot 2.1 • fatJarライブラリの整理 (lombokとかのscope=providedも含まれていた) やれることやる!きっかけはJava11リリース!
  9. 10.

    Copyright © Broadleaf Co., Ltd. All Rights Reserved. 9 起動が遅い

    起動時間:48秒→43秒 kubernetesのcpu.limitを600msにしている場合の結果です。 興味本位で、cpu.limitを200msにしてみると、下記のような結果。 内部で大量のjar、及びクラスのロードが必要な場合、効果ある。 ただし、全ライブラリspring-context-indexerが有効でなければならない。 cpu.limit:200msの場合 indexerの有効: 約100秒 indexerの無効: 約140秒 spring-context-indexerを導入する。
  10. 11.

    Copyright © Broadleaf Co., Ltd. All Rights Reserved. 10 起動が遅い

    起動時間:43秒→28秒 ( ビルド時間:15秒→3分 ) docker image構築時に、下記のように生成・有効化。 Dockerfile.template FROM maven:3.5.4-jdk-11-slimベースのimage as maven-builder mvn clean package -U FROM adoptopenjdk/openjdk11:alpineベースのimage as cds-builder RUN mv $APP_JAR_FILE /app/framework RUN java -XX:MaxMetaspaceSize=256M -XX:MetaspaceSize=256M ¥ -Xshare:off -XX:DumpLoadedClassList=/app/cds/api.classlist ¥ -cp "${CLASSPATH}" ${MAIN-CLASS} RUN java -XX:MaxMetaspaceSize=256M -XX:MetaspaceSize=256M ¥ -Xshare:dump -XX:SharedArchiveFile=/app/cds/api.jsa ¥ -XX:SharedClassListFile=/app/cds/api.classlist -cp "${CLASSPATH}" FROM adoptopenjdk/openjdk11:alpineベースのimage COPY --from=cds-builder /app /app CMD ["/app/startup.sh"] コンパイル&テスト&packaging jlinkで縮小されたベースイメージで、 Class Data Sharing有効化。 jlinkで縮小化されたイメージをベースに、 実行時イメージ作成。 Application Class-Data Sharing(JEP310)を導入する。
  11. 12.

    Copyright © Broadleaf Co., Ltd. All Rights Reserved. 11 テストが遅い

    忘れた頃にやってくるテスト通知。失敗すると辛い。 テスト大事。でも待たされるのがつらい。 開発 BUILD TEST DEPLOY 65秒 15秒 11分
  12. 13.

    Copyright © Broadleaf Co., Ltd. All Rights Reserved. 12 テストが遅い

    起動時間:11分→2分 • Java起動時オプションのチューニング • -XX:TieredStopAtLevel=1 • -XX:+TieredCompilation 階層型コンパイル。2分ちょっと短縮(11分→9分)。 • Maven Surefire PluginのreuseForksをtrueに変更。9分→2分! ※元々は、spring-bootのissue#10366の問題を回避するために reuseForksをfalseにしていた。 本当は、この前段階でApplication Class Data Sharingしたかったが断念。 Classpath mismatch The classpath used with -Xshare:dump must be the same as, or be a prefix of, the classpath used with -Xshare:on. Otherwise, the JVM will print an error message about the mismatched classpath and refuse to start. To analyze the mismatch, you can add -Xlog:class+path=info to the application's command-line, and the JVM will print out detailed diagnostic information about what classpath is expected, and what classpath is actually used. 引用:https://openjdk.java.net/jeps/310
  13. 14.

    Copyright © Broadleaf Co., Ltd. All Rights Reserved. 13 結果

    起動が遅い。 テストが遅い。 65秒→28秒 11分→2分 12分→6分 ある程度改善。 開発 運用 開発 BUILD TEST DEPLOY 65秒→28秒 15秒→3分 11分→2分
  14. 15.

    Copyright © Broadleaf Co., Ltd. All Rights Reserved. 14 反省

    ローカル環境で動かすの結構大変。 profileでしっかりmock、API call切り替えれるようにした方が良い。 後は、docker-composeなり、kubernetesのenvironmentで設定。 Metaspaceの領域も意識しておかないと、メモリの消費が激しくなる。 Dynamic Configuration最初から意識しておかないと、運用がしんどい。 Spring Cloud Kubernetesにものすごく期待。 どこまで抽象化するか? アプリケーションフレームワークまで完全抽象化(フレームワーク化)すると、 • 多くの人は、どうやって動いているのか謎状態 • 最低でも3つくらいのバージョン平行運用 とか発生する。 先に良く考えておくこと。
  15. 16.

    Copyright © Broadleaf Co., Ltd. All Rights Reserved. 15 反省

    API Application Apache Kafka Apache Cassandra Elasticsearch CloudSQL Consumer Consumer Consumer Redis Consumer 引用:デブサミ2018夏発表資料 より責務を細分化。 育ってきたら、もっとシンプルに。より疎結合に。 でも育てる時は早くリリース→フィードバックを得られる形が良い。
  16. 17.

    Copyright © Broadleaf Co., Ltd. All Rights Reserved. 16 反省

    Spring Boot Eclipse MicroProfile Micronaut • 理解している人が多い。 • フルスタックフレームワーク。クラウド環境、データストア多数対応。 • ドキュメントが豊富。 • 重量級。 • Spring Fu等、Micronaut的なフレームワークも開発中。 • マイクロサービスアーキテクチャに最適化。 • Eclipse Foundationのプロジェクト。 • 仕様と実装の分離。 色々と…Jakarta EE標準化仕様サブセットとして統一化されていくかも? • やっぱり重量級。 • DI、AOPをコンパイル時に解決。起動がものすごく速い。 • native-image化できる。起動速度が30msとかのレベル感。 • Apache Kafka、Apache Cassandraをサポート。 • 比較的軽量。 マイクロサービスにも合う形で進化途中。 Spring Boot以外の選択肢を考慮すべき。速いは正義。
  17. 18.

    Copyright © Broadleaf Co., Ltd. All Rights Reserved. 17 今後

    Service Service Service Service Service Service Service Service やれる所から変えていく。フィードバックしていく。 チーム間・サービス間でより良い競争をしたい。
  18. 20.

    Copyright © Broadleaf Co., Ltd. All Rights Reserved. 19 SHARE

    YOUR FUN! 体験 チーム 仕事の価値 自分が今いる環境の中で、自分たちで物事を変えていく。 新しいことに興味を持つ。失敗しても、許される。 それを、体験する。変えていけるのは自分たちだけ。
  19. 21.

    Copyright © Broadleaf Co., Ltd. All Rights Reserved. 20 SHARE

    YOUR FUN! 変化を 楽しく 受け入れる by Developer Summit Summer 2018