レッドハットでソリューションアーキテクトを務める伊藤智博氏とMicrosoftでクラウドアドボケイトを務める寺田佳央氏が第3回にわたってクラウドネイティブを語る本連載。最終回はJavaとクラウドネイティブの関係について。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
Web系テクノロジー企業の間で取り組みが広まっている「クラウドネイティブ」について、レッドハットのソリューションアーキテクトを務める伊藤智博氏とMicrosoftでクラウドアドボケイトを務める寺田佳央氏が語る本連載。第3回は、Javaとクラウドネイティブの関係、これから開発者や運用管理者に求められるスキルセットを語った。
――クラウドネイティブの取り組みを見ているとGoなどJava以外の言語を選択しているケースも多いように感じます。
伊藤氏 はい、ご認識の通りJavaはクラウドネイティブではあまり使われていません。Javaは誕生から25年以上にわたって進化してきました。そのほとんどの期間は「システムのダウンタイムを発生させない」という顧客の要件に合わせて進化してきました。そのため、変化が遅れていたJavaの起動速度や処理性能が多言語と比べて劣っているとの印象を持たれがちです。
しかし、近年のアップデートでJavaには軽量に動くために必要な仕組みが整ってきました。詳細は割愛しますが、事前にコンパイルできるコンパイラの「AOT(Ahead Of Time、事前)コンパイラ」やネイティブイメージで実行する「GraalVM」などが登場しました。重厚長大なプラットフォームでクラウドネイティブを実現するのは難しいと思われるかもしれませんが、こうした技術を利用すれば、Javaとクラウドネイティブの相性は良くなります。
また、Javaは皆さんもご存じの通りどのようなプラットフォームでも動作します。新たなメモリやCPUなどハードウェアが登場、進化しても対応が進み、実行できるようになることもメリットの一つでしょう。最近ではMicrosoftとRed HatによるArm対応が挙げられます。これによってArmアーキテクチャを基盤とした環境でもアプリケーションが実行できるようになっています。
他にもJavaにもともと備わっているJIT(Just In Time)コンパイラや「JDK Flight Recorder」といった性能や運用を支援する機能の他に、Eclipse MicroProfileプロジェクトが提供する非機能要件の機能群(例えばEclipse MicroProfile Metrics/Healthなど)を仕様として定義していることもポイントです。それらの仕様を実装したフレームワークの「Quarkus」もあるため、Quarkusを使って要件を満たすアプリケーションを容易に実現できるでしょう。
寺田氏 私はJavaを利用する企業を国内外問わず見ていますが、すでに「Java on Azure」の利用者が一定数以上いることから、クラウドネイティブの文脈でもJavaの利用は進んでいると考えていて、伊藤さんの印象とは異なります。今後ますますJavaに対する投資を加速し、Java利用者を大切に考えていく所存です。
連載第2回で紹介した「Azure App Service」も、Spring Bootで開発されたアプリケーションの本番環境として利用いただいているお客さまがいます。また「Red Hat JBoss EAP」を利用することもできます。
Eclipse MicroProfileで実装したクラウドネイティブなアプリケーションは、Mavenを使用してQuarkusのアプリを Azure App Serviceにデプロイする(関連リンク)こともできます。コンテナのオーケストレーションツールとしては、Azure Kubernetes ServiceやAzure Red Hat OpenShiftを利用可能で、本番環境で利用するお客さまがいます。さらにSpring Boot利用者に便利なAzure Spring Cloudというサービスなども提供しています。
伊藤さんの認識の通り、2021年時点でJavaの高速起動や軽量化において課題があることは私も理解しています。ですが、ライブラリやツールが豊富に用意されているため、好んで利用いただくお客さまもいるように思います。
今後もJavaが選択され続けるためには伊藤さんの指摘にもあるように、Javaの各種フレームワークや周辺プラットフォームの継続的な開発や成長が不可欠です。Javaコミュニティーの力や関連企業がとても強い力を持っているため今後もしばらくは安心して使えるプラットフォームになると信じています。
Javaの好きなところは、ずばり「Java VM」(Java仮想マシン)の存在です。Javaは20年以上をかけて常にパフォーマンスとの戦いをしてきました。そして現在は、Java VMがいったん起動すると非常にハイパフォーマンスで動作するため、常時稼働するようなサーバサイドのアプリケーションの実行環境として最適です。他の言語ランタイムでパフォーマンスが出なかったためにJavaに戻ってきたという企業もあるくらいです。そしてガベージコレクションに関してもいまだに改善が続けられている他、クラウドネイティブなアプリケーションの安定した動作に欠かせないアップデートも含まれています。
――クラウドネイティブをゴールとする領域でJavaを利用する場合、設計や実装面で考慮すべき点はありますか?
伊藤氏 連載第1回でもお伝えしたように、以前はシステムを開発しようとすると物理サーバを準備したり、ミドルウェアの構築が必要だったりするなどシステムを構築するハードルが高かったです。現在はクラウドを使用して誰でも簡単に必要に応じてサーバが手に入りますし、ミドルウェアもPaaSとして提供されているためこのハードルも下がりました。それにより、誰でもシステムを開発できます。
以前はシステムの開発、運用に対する知見を持っている人たちが中心となってシステムを構築していたため、アプリの機能だけではなく、システムの運用監視など非機能要件をきちんと設計、実装できていました。しかし、現在は詳しい知見を持っていない人でもシステムを構築することが容易になっています。その結果、要件の機能だけを実装して、非機能要件をきちんと設計、実装できていないケースが非常に多いと感じています。
そこで私はQuarkusの利用をお勧めしています。これはEclipse MicroProfileの実装の1つです。Eclipse MicroProfileは非機能要件に関する仕様を定義しているため、Quarkusを使えば非機能要件を簡単に実現できます。例えば、Javaアプリケーションを数ミリ秒という単位で起動できるようにする機能です。これらの機能はGraalVMを使用したネイティブイメージ化を通じて実現しています。
Quarkusを利用することでこのような非機能要件を簡単に実現できるため、開発者はビジネス要求の実現に注力できるメリットがあります。普段の開発ではアプリケーションコードを変更したら、確認のためアプリケーションの再起動が必要となり、その間は待つしかないという課題がありました。Quarkusにはアプリケーションコードの変更を動的に反映する開発者モードがあります。開発者モードを利用することでアプリケーションの再起動が不要となり、時間の無駄も省けます。これらの機能を提供するQuarkusはビジネス要求を実現する時間を大幅に短縮できる存在だといえます。
寺田氏 まず、設計や実装における考慮点ですが、「Design for Failure」に従うことが重要だと考えます。Design for Failureとは、障害が発生することを前提としてシステムを設計することを意味しています。必要に応じて「カオスエンジニアリング」を導入して意図的に障害を引き起こし、障害が発生しても稼働するシステム作りを心掛けることを推奨します。
例えば20個のロジックから構成されるサービスがあったとします。旧来は20個のビジネスロジックを単一のモノリスなアプリケーションとして作成し、同じJava VMでサービスを稼働させていました。もし20個の内1つのサービスが高負荷状態になり、CPUやメモリを大量に消費した場合、残りの19個のビジネスロジックに対しても影響が及んでいました。同じJava VMを利用しているためです。これは1つのロジックが引き金となり連鎖的にシステム障害を引き起こす例ですが、こうした事例はクラウド環境でも発生する可能性があります。
20個のサービスが互いに連携するようなシステムであった場合、ある1つのサービスが高負荷状況になったりダウンしたりした場合、そのサービスを呼び出す側のサービスは、サービスを呼び出せないため待ち状態になります。すると呼び出し側のリソースも待ち行列が増えてしまい結果として呼び出し側もおかしな状態になる可能性があります。こうした状況を防ぐために、「サーキットブレーカー」や「バルクヘッド」と呼ばれるパターンが存在しています。20個あるサービスの内、1つのサービスがおかしな状況になった場合、そのサービスだけを切り離して残り19個のサービスは正常稼働させることにより、障害発生による影響を局所化できるようになります。設計、実装時に、このような仕組みを要件として入れておくことで全体的なシステムダウンを防ぐことができるようになります。
それ以外には、Observabilityを確保するため、パフォーマンス測定やメトリクスの取得、死活監視用エンドポイントなどを実装しましょう。これらの実装を支援するのがSpring BootやQuarkusです。Quarkusの詳細は伊藤さんが詳しく説明しているので割愛しますが、Quarkusの開発は2021年現在も積極的に行われています。両フレームワークともに、Reactive Programingにも対応しているため、非同期でノンブロッキングやサービスを簡単に構築することもできます。
――今後クラウドネイティブの取り組みが企業に求められていく中で、開発者や運用管理者が身に付けておくべきスキルセットはあるでしょうか。
伊藤氏 フレームワークを使ってビジネスの機能要件を実装することはもちろんですが、非機能要件をきちんとシステムの要件に落とし込んで設計できるITアーキテクトの能力を身に付けた方がよいでしょう。ITアーキテクトのスキルを持つエンジニアは非常に希少ですし、今後重要なスキルの一つになります。ITアーキテクトのキャリアに興味を持っているなら、ぜひ目標にしてみてください。
また、設計や開発をするエンジニアのスキルとしては、ビジネスロジックとフレームワークやサービスの境界線をきちんと定義していつでも別のフレームワークやサービスなどに切り替えられるような設計、実装ができるスキルを身に付けるべきでしょう。過去の時点で現在の社会状況を予見できなかったように、未来の状況を予想することはできません。今後もより便利で新しいフレームワークやサービスが出てくるのは間違いありません。近い将来に備えられるようなスキルを身に付けてほしいと思います。
寺田氏 現在はさまざまなフレームワークやライブラリが豊富にあります。それらを一気に全て身に付けるのはとても困難です。そこで、どのレイヤーでも構わないので、自分が得意な技術を1つ身に付けてください。そうするとプロジェクト、組織、会社で重宝される存在になるのではないかと思います。現在は、アプリケーション開発しかできないITエンジニアも、そしてネットワーク構築しかできないインフラエンジニアも難しい時代です。とはいえ、クラウド環境で正しくサービスを設計して実装するには、基本がとても大切です。
開発者はOSやネットワークの知識を正しく身に付け、インフラ担当者はモダンなアプリ開発手法もしっかり理解してください。そして、エラーログを読むことも大切です。問題の原因はエラーに書かれています。たとえ英語で書かれていたとしても、エラーの文言を翻訳ツールを使っても結構ですので読んでみてください。
時間の経過とともに知識と経験が蓄えられていくと思います。その蓄えた全てが自分の力になっていくはずです。ぜひ継続して学習していきましょう。本連載の内容がクラウドネイティブの取り組みを進めていく皆さまのお役に立てるなら幸いです。
伊藤智博
OpenJDK Committer、Application Services Solution Architect@Red Hat。外資系ソフトウェアベンダでミドルウェアのコンサルタントとしてミッションクリティカルなシステムの支援、テクノロジストとしてビジネス課題を技術で解決をすることを担当して、現職。趣味では主にHotSpot JVMの機能改善に取り組む。業務ではアプリケーションランタイムのミドルウェアの技術プリセールスやJava関連の情報発信を担当。ビジネス目線でのやりたいことや課題から、システムやそのプロジェクトを改善していくことに注力している。
寺田佳央
Javaエバンジェリスト。Javaの最新技術情報の提供やJavaコミュニティー活動の活性化を日本Javaユーザーグループ(JJUG)とともに行ってきた。現在、マイクロソフト・プラットフォームにおけるJavaの利用促進/啓蒙(けいもう)活動を実施中。2016年には日本人で2人目となるJava Championに就任、海外のJava ChampionやJUGリーダとも多数交流。JJUG幹事メンバー。2019年6月よりオイシックス・ラ・大地の技術顧問に就任。
Copyright © ITmedia, Inc. All Rights Reserved.