Developers Summit 2019でお話した資料です。
資料から読み取れない部分を一部Qiitaで補足しています。 https://qiita.com/h-r-k-matsumoto/items/4b639ed1f87fd6f67a4e
株式会社ブロードリーフ松本 宏紀2019.02.14Spring Bootでマイクロサービス作って苦労したお話#devsumiE 14-E-2
View Slide
Copyright © Broadleaf Co., Ltd. All Rights Reserved. 1自己紹介松本 宏紀株式会社ブロードリーフ 基盤開発部 (札幌)• システム・アーキテクト• ソフトウェア・エンジニア• オフショアラボチームリーダー• デブサミ2018夏:[Cassandra x Kubernetesによる大規模データ基盤の仕組みと苦労]
Copyright © Broadleaf Co., Ltd. All Rights Reserved. 2Spring Boot 好きです。本日のテーマ
Copyright © Broadleaf Co., Ltd. All Rights Reserved. 3猫も杓子もSpring Boot。JavaといえばSpring Boot。そんなにSpring Bootがいいですか?マイクロサービス・アーキテクチャでも?本日のテーマ
Copyright © Broadleaf Co., Ltd. All Rights Reserved. 4マイクロサービスアーキテクチャっぽいサービス開発。ServiceServiceServiceServiceServiceServiceServiceService背景Spring BootSpring DataJDBC Cassandra Elasticsearch RedisSpring for Apache Kafka等々…DATA-FRMEWORKマルチテナントにおける各データストアアクセスの提供、及びデータ・ディクショナリ提供API-FRAMEWORKRESTful APIの提供するためのフレームワーク。認証、認可(role,license)…などの共通化。SERVICE各サービスの実装。>=43
Copyright © Broadleaf Co., Ltd. All Rights Reserved. 5問題アプリケーションの起動が遅い。アプリケーションのテストが遅い。開発運用遅い。人が待たされる。開発
Copyright © Broadleaf Co., Ltd. All Rights Reserved. 6起動が遅い開発中、速く動作確認したいけど、中途半端に待たされる。BUILD TEST DEPLOYmaxUnavailable = replicas/22分待つことになる。入れ替えの順序性が必要な場合だと待たされるのがつらい。65秒15秒 11分podがOOMとかで落ちちゃった際の修復時間に直結して遅くなる。Gitlab RunnerのPIPELINEが詰まる。ci-worker1BUSYpipeline request起動が遅い。開発開発開発運用
Copyright © Broadleaf Co., Ltd. All Rights Reserved. 7起動が遅いa)起動時に最適化:CPU割当増やす。b) コストで最適化:このまま。運用状態での最適化。c) やれることやろう!d) golangに段階的に移行しよう!理由1:CPU割当が潤沢ではない。(limit:600ms)理由2:膨大なクラス数のロード。(14,000~)
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リリース!
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を導入する。
Copyright © Broadleaf Co., Ltd. All Rights Reserved. 10起動が遅い起動時間:43秒→28秒 ( ビルド時間:15秒→3分 )docker image構築時に、下記のように生成・有効化。Dockerfile.templateFROM maven:3.5.4-jdk-11-slimベースのimage as maven-buildermvn clean package -UFROM adoptopenjdk/openjdk11:alpineベースのimage as cds-builderRUN mv $APP_JAR_FILE /app/frameworkRUN 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ベースのimageCOPY --from=cds-builder /app /appCMD ["/app/startup.sh"]コンパイル&テスト&packagingjlinkで縮小されたベースイメージで、Class Data Sharing有効化。jlinkで縮小化されたイメージをベースに、実行時イメージ作成。Application Class-Data Sharing(JEP310)を導入する。
Copyright © Broadleaf Co., Ltd. All Rights Reserved. 11テストが遅い忘れた頃にやってくるテスト通知。失敗すると辛い。テスト大事。でも待たされるのがつらい。開発BUILD TEST DEPLOY65秒15秒 11分
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 mismatchThe 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 canadd -Xlog:class+path=info to the application's command-line, and the JVM will print out detailed diagnostic informationabout what classpath is expected, and what classpath is actually used.引用:https://openjdk.java.net/jeps/310
Copyright © Broadleaf Co., Ltd. All Rights Reserved. 13結果起動が遅い。テストが遅い。65秒→28秒11分→2分12分→6分ある程度改善。開発運用開発BUILD TEST DEPLOY65秒→28秒15秒→3分 11分→2分
Copyright © Broadleaf Co., Ltd. All Rights Reserved. 14反省ローカル環境で動かすの結構大変。profileでしっかりmock、API call切り替えれるようにした方が良い。後は、docker-composeなり、kubernetesのenvironmentで設定。Metaspaceの領域も意識しておかないと、メモリの消費が激しくなる。Dynamic Configuration最初から意識しておかないと、運用がしんどい。Spring Cloud Kubernetesにものすごく期待。どこまで抽象化するか?アプリケーションフレームワークまで完全抽象化(フレームワーク化)すると、• 多くの人は、どうやって動いているのか謎状態• 最低でも3つくらいのバージョン平行運用とか発生する。先に良く考えておくこと。
Copyright © Broadleaf Co., Ltd. All Rights Reserved. 15反省API Application Apache KafkaApache CassandraElasticsearchCloudSQLConsumerConsumerConsumerRedisConsumer引用:デブサミ2018夏発表資料より責務を細分化。育ってきたら、もっとシンプルに。より疎結合に。でも育てる時は早くリリース→フィードバックを得られる形が良い。
Copyright © Broadleaf Co., Ltd. All Rights Reserved. 16反省Spring BootEclipse MicroProfileMicronaut• 理解している人が多い。• フルスタックフレームワーク。クラウド環境、データストア多数対応。• ドキュメントが豊富。• 重量級。• Spring Fu等、Micronaut的なフレームワークも開発中。• マイクロサービスアーキテクチャに最適化。• Eclipse Foundationのプロジェクト。• 仕様と実装の分離。色々と…Jakarta EE標準化仕様サブセットとして統一化されていくかも?• やっぱり重量級。• DI、AOPをコンパイル時に解決。起動がものすごく速い。• native-image化できる。起動速度が30msとかのレベル感。• Apache Kafka、Apache Cassandraをサポート。• 比較的軽量。マイクロサービスにも合う形で進化途中。Spring Boot以外の選択肢を考慮すべき。速いは正義。
Copyright © Broadleaf Co., Ltd. All Rights Reserved. 17今後ServiceServiceServiceServiceServiceServiceServiceServiceやれる所から変えていく。フィードバックしていく。チーム間・サービス間でより良い競争をしたい。
Copyright © Broadleaf Co., Ltd. All Rights Reserved. 18SHARE YOUR FUN!SHARE YOUR FUN!
Copyright © Broadleaf Co., Ltd. All Rights Reserved. 19SHARE YOUR FUN!体験チーム 仕事の価値自分が今いる環境の中で、自分たちで物事を変えていく。新しいことに興味を持つ。失敗しても、許される。それを、体験する。変えていけるのは自分たちだけ。
Copyright © Broadleaf Co., Ltd. All Rights Reserved. 20SHARE YOUR FUN!変化を楽しく受け入れるby Developer Summit Summer 2018