メリット
はじめに¶
アプリケーションをクラウドに移行しようとするお客様が増えています。しかし、その旅はまだ完了していません。インタビューの中で、IBMのCEOであるArvind Krishna氏は、顧客のアプリケーションの約80%がまだクラウドに移行されていないと指摘しています。これらのアプリケーションの中には、かなり長い間運用されているものが多数あります。様々な理由でクラウドに移行されていないのです。アプリケーションの規模が大きすぎて、単純なリフト&シフトや、リプラットフォームのようなバリエーションは魅力的ではないのかもしれません。多くの場合、お客様は、モダナイゼーションへの投資から最大限の利益を得るために、これらのアプリケーションをまずリファクタリングしてから、リファクタリングされたバージョンをクラウドに展開したいと考えています。残念ながら、アプリケーションのリファクタリングは簡単ではなく、複雑な作業です。モノリシック・アプリケーションを経済的に無停止でリファクタリングするための、健全でシンプルな方法論は存在しません。
IBM ResearchとIBM Cloud and Cognitive SoftwareのジョイントベンチャーであるIBM Mono2Microは、Javaモノリシック・アプリケーションをマイクロサービスに自動的にリファクタリングするための、AIによる野心的な試みです。Mono2Microは同様に、AIと、Javaプログラミング言語のセマンティクスに関する内蔵の深い知識からその力を引き出しています。機械学習(ML)と深層学習(DL)を用いて、Mono2Microはまず、モノリシックなアプリケーションをいくつかの分離したパーティション(クラスの集まり)にリファクタリングします。Mono2Microは、これらのパーティションに対して、プログラミング言語のセマンティクスに基づいて、パーティションをマイクロサービスとして実現するためのコードを自動的に生成する。
本稿では、Mono2Microの動作原理を簡単に説明した後、Mono2Microを現場で適用して得られた興味深い結果を紹介する。Mono2Microの基本的な戦略を、モノリシックアプリケーションを変換するための類似した方法論やツールと比較し、既存のモノリシックアプリケーションを安全かつ健全に経済的にリファクタリングする上で、他の関連ユーティリティと比較した場合のMono2Microの実用的な有用性、優位性、ひいてはROIの高さを指摘している。
動作原理¶
記事「IBM Mono2Microでモノリスアプリケーションをマイクロサービスに変換」やビデオ「Automate application refactoring with Mono2Micro」で紹介されているMono2Microは,アプリケーションの静的解析と実行時解析を組み合わせてパーティションを生成する。Mono2Microの最初のコンポーネントであるmono2micro-bluejay
は、単純なprint文を挿入することでJavaのソースコードをインスツルメンテーションし、関数の入力と終了をタイムスタンプとともに記録します。インスツルメンテーションの過程で、このコンポーネントはすべてのクラスに関する多くのメタデータを抽出し、そのうちの1つがクラスのメンバー属性である。このようなメンバー属性に基づいて、Mono2Microはクラス間の格納データ依存関係を作成する。形式的に言えば、クラス A
と B
が非原始的な Java 型であり、クラス A
が少なくとも B
型のメンバー b
を含む場合、クラス A
からクラス B
への格納データ依存関係が存在する。
ユーザーは、インスツルメンテッド・コードをビルドしてデプロイした後、アプリケーションのすべてのビジネス・ユースケースを実行します。JVMのログファイルには、実行されたビジネスユースケースに基づく実行痕跡が記録されます。ログファイルは、ソースコードの静的解析から生成されたメタデータとともに、Mono2MicroのAIコンポーネントであるmono2micro-aipl
に供給される。時間的な流れの分析、教師なしの機械学習(ML)と深層学習(DL)の技術を用いて、mono2micro-aipl
は、「ビジネスロジック」に基づくパーティションと、「自然な継ぎ目」に基づくパーティションの2つのセットを生成する。最初のイテレーションでは、ビジネスロジックに基づくパーティションは、純粋に実行トレースに基づいて導き出されます。次のイテレーションでは、関連するすべてのパーティションをマージしてより大きなパーティションを形成することで、パーティション間のデータ依存性をすべて排除し、ナチュラルシームを実現します。自然な継ぎ目に基づいたパーティションは、当然ながらステートレスでシェアナッシングなマイクロサービスを生成することができ、それが独立したスケーラビリティとディスポーザビリティに直結します。
Mono2MicroのGUIコンポーネントであるmono2micro-ui
は、mono2micro-bluejay
とmono2micro-aipl
の重要なアウトプットを、直感的なGUIで表現します。オリジナルのモノリシックアプリケーションの2つの異なる特性に対応する2つの有向グラフがGUIパネルに表示されます。静的なソースコード解析から得られた格納データの依存関係と、ランタイムログファイルの解析から得られたクラス間のランタイムコールの2つです。この2つのカテゴリのパーティションは、GUIでも確認することができます。また、mono2micro-ui
では、推奨パーティションを微調整することができます。
自然な継ぎ目を利用したパーティションは理想的に見えますが、顧客のアプリケーションを扱った経験や、社内のレガシーなモノリシックアプリケーションを扱った経験からすると、自然な継ぎ目を利用すると、一般的に、すべての重要なクラスを含む1つまたは2つの非常に大きなパーティションが生成されます。ビジネス・ロジック・ベースのパーティショニングでは、一般的に、より多くのパーティションが作成され、パーティション間のクラスの配分が改善されます。しかし、ビジネス・ロジック・ベースのパーティショニングでは、ほとんどの場合、パーティション間のデータ依存性が発生します。
モノリシックアプリケーションのアーキテクチャやドメインを深く理解している上級ユーザーは、Mono2Microが推奨するパーティションを調整することができます。GUIパネルでは、以下のアウトラインに従って、中間的なカスタム・パーティショニング戦略を追求することができます。
- 自然な継ぎ目またはビジネスロジックベースのパーティションのいずれかから開始します。
- 反対側に移動する。
- 3つの指標のバランスが取れたところで停止する。
- ビジネスコンテキストの純度
- パーティション間のメソッド呼び出し
- パーティション間のデータ依存性
Mono2Microが生成するレポートは、ユーザーが反復的にカスタムパーティションに到達する際に大きな助けとなる。
最後に、プログラミング言語のセマンティクスを扱うMono2Microのコンポーネントであるmono2micro-cardinal
は、パーティションのコードを自動的に生成する。具体的には、mono2micro-cardinal
が、マイクロサービスを呼び出すためのAPIや、分散オブジェクト管理、ガベージコレクション、リモート・ローカル間のオブジェクト変換を処理するための基盤となるコードをすべて生成する。Mono2Microがコードを生成できないいくつかのエッジケースについては、その問題を処理するための提案を含めた規範的なガイダンスがユーザーに提供される。これまでの経験から、パーティションからマイクロサービスを実現するために必要なコードの80%以上を mono2micro-cardinal
が生成していると言えます。
Mono2Microの主要な4つのコンポーネントは、Docker Hubでコンテナとして提供されています。各コンポーネントの詳細や利用シーンについては、Mono2Microへのサインアップの際に提供される「Mono2Microユーザーガイド」をご参照ください。
結果¶
Mono2Micro およびその初期バージョンは、ユーザーから大きな関心を集めました。例えば、あるフォーチュン100企業がMono2Microの初期バージョンを試してみたところ、非常に有望な結果が得られたという。100万行以上のコードを含むモノリシックなアプリケーションに対し、Mono2Microはわずか数週間で約2ダースのパーティションを推奨した。生成されたパーティションはすべて、企業のSMEによって検証されました。これは、1年以上も続いている手作業によるリファクタリングの努力とは対照的です。分析の副産物として、Mono2Microはアプリケーションの中にかなりの量の潜在的なデッドコードが存在することを指摘し、それを取り除くことでアプリケーションのサイズと静的な複雑さを減らすことができるとした。現在、Mono2Microをフォーチュン500社の多くの企業で使用し、企業が選択したモノリシックアプリケーションをリファクタリングする作業が進行中です。今後の記事では、その結果を詳しくご紹介する予定です。
リファクタリングとリライト¶
Mono2Micro はアプリケーションをリファクタリングし、コードの修正を最小限に抑えます。Mono2Microは、クラスを決して分解せず、クラスをカプセル化された不可分の最小単位と見なします。従来の手作業による、境界条件やドメイン駆動型の分析に基づいてモノリシックアプリケーションをマイクロサービスに変換するアプローチでは、一般的にクラスが保持されません。ビジネスの中核となる機能を実装しているかなりの数のクラスが分割され、これらのクラスの既存のメソッドは、しばしば異なるパーティションに存在する異なるクラスに分散されます。また、このプロセスでは、まったく新しいクラスも作成されます。このアプローチは、元のモノリシックアプリケーションの異なるカプセル化モデル、つまり異なるアーキテクチャを作成すると見なすことができ、かなりの量のコードを書き換える必要があります。この書き換えは、侵襲的でコストがかかり、リスクもあります。一方、Mono2Microでは、クラスベースのリファクタリングのみを考慮しているため、非侵襲的で安全かつ経済的なアプローチとなり、すぐに実証可能な結果を得ることができます。
私たちは、IBMの社内グループが手作業で行ったいくつかのシンプルなアプリケーションのリファクタリングを調査しました。いずれの場合も、手作業によるリファクタリングの試みは、一般的にかなりの量の書き換えを伴うことに気付きました。つまり、元のモノリスのビジネス機能の大部分を実装しているクラスを壊し、他のクラスに書き換えるのです。単純なアプリケーションに必要なリライトの量から、現実のアプリケーションでは数年どころか数ヶ月の作業が必要になると容易に推測できます。クラスを書き換えることで、ほとんどの場合、処理しなければならない問題が1つ増えます。書き換えられたマイクロサービスの機能を検証するために、新しいテストケースを開発しなければなりません。一方、Mono2Microによってリファクタリングされたマイクロサービスでは、元のモノリシックアプリケーションと同じ既存のテストケースを使用することができるはずだ。
新規にマイクロサービスを作成する場合には、再設計や書き換えが適切な場合もあるが、既存のモノリシックアプリケーションを変換する場合には、Mono2Microのリファクタリング手法が経済性、簡便性、有効性の面で際立っている。Mono2MicroのAIによるリファクタリング手法は、モノリシックアプリケーションの基本的なカプセル化やアーキテクチャを変更しません。それは
- コードの書き換えを最小限に抑えることができます。
- 既存のテストケースの再利用が可能
その結果、ユーザーに大きなROIをもたらします。
今後の記事では、モノリシックアプリケーションを変換する際のリファクタリングと書き換えのアプローチについて、より正式で定量的な設定と例示を交えて詳しく説明する予定です。
モノリシックなアプリケーションを変換するための他のアプローチ¶
一枚岩のアプリケーションをマイクロサービスに変換するための既存のアプローチはいくつかあります。それらのほとんどは、ドメイン駆動設計 (DDD)に焦点を当てたマニュアルガイドラインです。DDDは、マイクロサービスを設計するための優れたアーキテクチャガイダンスを提供しますが、正しいドメインを定義する方法や、モノリシックアプリケーションを望ましいデザインに変換する方法については、アーキテクトと開発者が完全に決定します。このプロセスは非公式なものであるため、やや主観的な性質を持っています。実際には、このプロセスには多大な手作業が必要であり、予想された予算をオーバーすることがよくあります。また、コードの書き換え量も非常に多く、その結果、デバッグ、テスト、検証が長期化し、極端な場合にはプロジェクトが放棄されてしまうこともあります。これに対し、Mono2Microは、コードの書き換えを最小限に抑え、効率的で一貫性のある、効果的な、ほぼ自動化された変換方法を目指しています。
前述のDDDベースのアプローチは、ある程度自動化が可能です。AIを使ってパーティションを決定するツールには2つのカテゴリーがあります。1つは静的なコード解析の結果にAIを用いるもので、もう1つはランタイム解析を用いるものです。これらのドメイン・ドリブンなアプローチは、どちらも前述のような欠点があります。静的解析は、外見上は単純ですが、実際の制御の時間的な流れやランタイムの呼び出し量を検出したり利用したりすることができないため、ほとんどの場合、品質の劣るパーティションを作成することになります。静的解析ベースのツールでは、使用されていないクラスで構成されたパーティションが作成される可能性があります。また、レガシーアプリケーションのデッドコードが、静的解析ベースのツールのパーティショニング決定に悪影響を及ぼす可能性があります。純粋に動的な分析ベースのアプローチでは、パーティションを推奨する際にデータの依存性を考慮することができません。
Mono2Microは、静的解析と実行時解析の両方を考慮して、2つのカテゴリのパーティションを導き出します。また、他のツールではサポートされていない、カスタマイズされたパーティションをユーザーが導き出すためのガイダンスも提供します。
Mono2Microは、リファクタリングによって明らかに優れた品質のパーティションを作成するだけでなく、パーティションを実現するためのコードを生成するユニークな機能を備えています。このコード生成機能は、健全かつ非侵襲的で安全な方法でモノリシックなアプリケーションを迅速にリファクタリングすることで、あらゆる企業のクラウド化を著しく促進することができます。
次のステップ¶
Mono2Microの強力なリファクタリング機能とコード生成機能をお試しください。Mono2Microのすべてのコンポーネントを、ご自身のモノリシック・アプリケーションでテストドライブすることができます。また、提供されているサンプルデータを使って、Mono2MicroのAIやコード生成コンポーネントを、モノリシックアプリケーションの例ですぐにお試しいただけます。
現在、Mono2MicroはJavaアプリケーションのみを取り扱っていますが、シンプルなモジュール構造を採用しているため、他の言語用のコンポーネントをプラグインすることも可能です。
Mono2Microは進化しています。今後は、マイクロサービスの構成情報を自動的に生成するなど、さまざまな機能を追加していく予定です。
謝辞¶
IBM Cloud and Cognitive Software のディレクターである Melissa Modejski 氏は、この記事を丹念にレビューし、技術的な正確さとプレゼンテーションの質を向上させるために多くの示唆を与えてくれました。著者は、IBM Cloud and Cognitive Software の VP である Danny Mace 氏、IBM Fellow で IBM Research のチーフサイエンティストである Ruchir Puri 博士、IBM Research の Saurabh Sinha 博士、IBM Research の Liana Chen 博士、そして Mono2Micro の開発チームのすべての協力と貢献に感謝します。クラウド・インテグレーションのオファリング・マネージャーであるJohn Meegan氏からのアドバイスと、Sarah Domina氏の優れたコピー編集により、プレゼンテーションの質が向上しました。