さまざまなツールを駆使して起動時間を65秒から28秒に短縮
続いて登壇した松本氏は、「Spring Bootでマイクロサービスを作って苦労したお話」と題して、自社でのSpring Bootを使ったマイクロサービス開発の事例について発表した。
もともと「マイクロサービスアーキテクチャ的なサービス開発」を手がけてきた松本氏だが、「現在もSpring Bootをベースに、その上にデータを扱うためのデータフレームワークやKPIを作成するためのフレームワークを乗せ、さらにその上に各サービスを実装するという構成で、約43個のマイクロサービスを運用しています」と言う。
松本氏は、これらのサービスを開発していてもっとも辛かったのが、「待たされる」ことだったと明かす。待たされる原因は大きく2つ。「アプリケーションの起動が遅い」と「アプリケーションのテストが遅い」だ。
「開発中に動作確認を行いたいのに、待たされる。手順としてはビルド→デプロイの流れでパイプラインが動くのですが、デプロイだけでもおよそ65秒かかります。これは、作業効率の面でも精神面でも大きなストレスです」
そこで松本氏がまず実行した解決策が、spring-context-indexerの導入だった。これで起動時間48秒を43秒まで5秒短縮したが、まだまだ十分ではない。そこで、さらにApplication Class-Data Sharing(JEP 310)を導入した。これはJava 10から提供されている機能で、VM上の内部表現を先にダウンロードして、Javaのプロセス起動時にそれを読み込むことでスピードを上げる仕組みになっている。
「いろいろ問題があって使いにくいところもありましたが、最終的に起動時間43秒が28秒に短縮されました。一方ビルド時間は逆に15秒→3分へと増えましたが、起動時間だけで見れば、対策前の65秒から差し引きで37秒の大幅な短縮です。これで起動が遅いという問題は、ひとまず解決できました」
Spring Bootでの成功体験をもとに、さらに新しいチャレンジを目指す
次に取り組んだのが、もう一つの課題である「テストが遅い」だ。これまでは、ビルドが終わってデプロイ前のテストに11分かかっていたと言う。
「もちろんテストは非常に大事なのですが、これだけ長い時間かかるとさすがに待っていられないので、他の作業をしてしまいます。その結果かえって時間がかかったり、気分的にも緊張感をそがれてしまいます。そこで改善策を講じたところ、テスト時間を2分にまで縮めることができました」
ここで行った対策は2点のみ。1つは、よくある起動時のオプションのチューニングだ。これだけで11分が9分に短縮した。これをさらに縮めたのが、Maven Surefire PluginのreuseForksをtrueに変更したこと。これによって、9分を一挙に2分にまで縮めることができた。
起動時間とテストのトータルでは、最終的に従来の12分が半分の6分に短縮されたことになり、今回の試みは十分に成功したと言えるだろう。もちろん反省点も数多くあったと松本氏は指摘する。
「実際に取りかかる前によく考えておくべき、詳細なポイントがいくつもありました。そうした反省点を踏まえて、今後はSpring Bootをより効果的に使いこなしていきたいと考えています。Spring Bootはフルスタックのフレームワークなので、アプリケーションを素早く作ってすぐにリリースするのには最適だと思います」
今回のSpring Bootの導入を始め、これからも変えられるところからどんどん変えていく取り組みにチャレンジしたいと松本氏は展望を語る。
「少し昔なら、安定性や確実性を担保するために、国内の先行事例を探して枯れた技術を使って作るのが賢明とされてきました。しかし今は、いろいろなことにどんどんチャレンジして、比較的短い期間で改善していく文化に変わりつつあります」
そうしたトレンドの中でエンジニアも、一人ひとりが新しいことに興味を持ち、実際に体験し、それが仕事の価値として評価されるのを目指すことが重要だと訴え、松本氏はセッションを締めくくった。
お問い合わせ
株式会社ブロードリーフ
- コーポレートサイト
- 問い合わせメールアドレス: j.event@broadleaf.co.jp