"マイクロサービス" とは、ソフトウェア アプリケーションを設計するためのアーキテクチャ スタイルとして、 ここ数年で急速に認知されてきた新しい設計/構築技術です。
フィオラノ ソフトウェアは、このマイクロサービス アーキテクチャをアプリケーション間連携に応用した連携プラットフォーム製品 (Fiorano Integration Platform) を提供しています。
1. アナロジーとしての UNIX のパイプライン
マイクロサービス アーキテクチャによるアプリケーション間連携は、UNIX のパイプ機能になぞらえることができます。
UNIX のパイプ機能は、最初のシェルが作られた 1970 年代に誕生しています。このページを読まれている方の中には、UNIX のシェルを直接使用してのコマンド実行の経験がない人もいるかもしれません。簡単に説明してみます。
UNIX シェル環境のパイプ機能は、単機能なコマンドをつないでより複雑な処理を実行させることができる一種のプログラミング環境です。
ここで次の課題を考えてみましょう。
『あるファイルの中から“Apple”という単語を含む行を抽出し、
各行の先頭にある項目番号でソートした結果を出力する』
UNIX パイプでは、この課題を既に動作が完成している既存の 3 つのコマンドをつなぐことで実現できます。
具体的には、次のようになります。
cat File-A | grep Apple | sort
UNIX パイプによるコマンドの連携 (図をクリックすると拡大図を表示します)
|
新たなコード開発をまったく必要としない洗練された方法といえます。
*UNIX パイプの詳細および例題の説明は、弊社のブログ記事 『マイクロサービス (その2) -パイプライン-』を参照してください。
2. マイクロサービスにおけるパイプライン
マイクロサービス アーキテクチャを利用したアプリケーション (サービス) 連携は、UNIX のパイプと同じように、単一の機能にしぼった小さな (マイクロな) サービスを連携させることで、大きな処理を実現するアプローチです。
マイクロサービス間の連携の様子は、下図のように表わすことができます。
マイクロサービスによる連携 (パイピング) (図をクリックすると拡大図を表示します)
|
UNIX のパイプと最も異なる点は、入力/出力のポートが複数ある点です。これによって、以下の処理が可能となります。
- データ内容などの条件によって、送信先を変更できる
- 同一データを複数の相手に送信できる
- 複数の相手からデータを集めてきて、その集合データに対して処理が行える
また、クラウド コンピューティングなどに代表される現代の IT 利用環境にも考慮する必要があります。
UNIX ではすべてのコマンドが単一のマシン上で稼働することを前提としていましたが、マイクロサービスでは下図に示すような分散環境で実行することが必要となります。
分散環境で稼働するマイクロサービス (図をクリックすると拡大図を表示します)
|
3. 土管 (Dump Pipe)
マイクロサービスを提唱したJames Lewis氏が Martin Fowler氏と共に著した『Microservices』という記事の中で、「Smart endpoints and dumb pipes」というセクションを設けて、マイクロサービス間の連携について説明しています。
このセクションでマイクロサービスによる構築とは、
- 個々のマイクロサービスのコヒージョン (凝集度) を高め
- マイクロサービス間の関係は疎結合 (decoupled)
とすることを目的としたものであり、そのためには "smart endpoints and dumb pipes (賢いエンドポイントと機能性の低いパイプ)"アプローチが好ましいとしています。
このアプローチは、具体的に以下を実現することです。
- 中央制御を排する
- マイクロサービス自身による自治制御 (コレオグラフィ) を行う
- マイクロサービス間の通信には、ライトウェイトなプロトコルを用いる
これは、従来の連携プラットフォーム製品が有していた機能をできる限りマイクロサービス側に移し、中央に君臨している連携プラットフォームの “くびき” を軽減し、マイクロサービスの自治の自由度を高めることを意味しています。
中央制御には以下の問題点があるからです。
中央制御の問題点
中央制御では、制御対象は中央のプラットフォーム (J2EE や .NET など) の強い影響下にあります。このような環境下では、サービスやアプリケーションも中央のフレームワーク (J2EE または .NET) にしたがったものとなります。このフレームワークに則っていないものは、何らかの特別な手段をこうじて制御下におくことを余儀なくされます。
マイクロサービスに限らずアプリケーションやサービスには、それぞれの機能を実現するにあたり、それに適した稼働環境や開発言語があり、中央のフレームワークに従わない(従い難い)ケースが少なくありません。
フレームワークに則っていないサービスの呼び出しには特殊アダプターを用いるなどの何らかの手段が必要となってしまいます。
中央ですべてを制御するために処理が複雑となり、そのために処理負荷などが中央のサーバーに集中します。このため中央のサーバーマシンに多大な投資が要求されます。
*中央制御の問題点の詳細については、弊社のブログ記事 『ハブ&スポークの問題点』を参照してください。
*コレオグラフィの詳細については、弊社のブログ記事 『コレオグラフィ vs オーケストレーション』を参照してください。
4. メッセージングによるマイクロサービスの連携 (パイピング)
単一のマシン上ではなく多様な環境に分散配置されたマイクロサービスの間を連携するには、メッセージングがたいへん有用なメカニズムです。
下図は、メッセージングによるマイクロサービス間連携の様子を示しています。
メッセージングによるマイクロサービスの連携 (図をクリックすると拡大図を表示します)
|
メッセージングによる通信を担うメッセージング サーバーが "パイプ機能" を実現しています。
メッセージング サーバーは中央に位置するのではなく、マイクロサービスと同様に複数のサーバーに分散配置されます。
そして、メッセージ サーバー同士もメッセージング通信によって連携します。
このように、複数のメッセージング サーバーを分散配置することで、中央制御を排し、オンプレミスやクラウドなどの様々なロケーションに位置するマイクロサービス間の連携 (メッセージングによる通信) を実現できるようになります。
5. メッセージングの重要性
マイクロサービス間の通信に、リモートプロシジャー呼び出し (RPC) ではなく、メッセージングが適しているのは、メッセージングが以下の特徴を有しているからです。
また、メッセージングのプロトコルとして JMS (Java メッセージング サービス) を前提としています。これは、JMS が標準規格として確立されており、企業のメッセージング インフラの基礎を築くのに最適なものとなっているからです。
- ストア&フォワード メカニズムによる疎結合
- 2 種類のドメインによる非同期メッセージング (同期メッセージングも可)
- ポイント・ツー・ポイント (PTP)
- パブリッシュ-サブスクライブ (Pub/Sub))
- メッセージ配信の保証
- メッセージの永続化
- Java によるインターオペラビリティ
- 他の Java API (JDBC, EJB, JTA, JTS, JNDI など)との連携
特に疎結合と非同期は重要な要素です。
RPC (Remote Procedure Call) では、呼び出す側と呼び出される側のアプリケーションが同時に稼動している必要があります。また、アプリケーション間で同期をとるため、相手アプリケーションの処理状況に連動していなければなりません (例えば、リクエストの処理結果を受け取るまで待機するなど)。
これとは異なり、非同期な連携では次の利点が得られます。
- 受け取り側のマイクロサービスに障害 (ネットワーク障害やサービス自体の障害) が発生していても、メッセージを送信できる
- メッセージング サーバーにメッセージを送った直後から、次の処理に移行できる
- マイクロサービスの変更や他のマイクロサービスとの置き換えの必要が生じても、相手アプリケーションに大きな影響をおよぼさない
- マイクロサービス変更時にシステム全体を停止する必要がない
また、JMS の “ストア&フォワード” メカニズムはアプリケーション間の結びつきを “疎結合” なものとし、非同期性と相まって耐障害性を向上させます。
ネットワーク障害などによって受け側のアプリケーションがメッセージを受け取れない場合でも、ストア&フォワード メカニズムによってメッセージを保存しておくことができ、メッセージを損失することがありません。障害が解消した時点で、メッセージの処理を再開できます。このことは、一方のアプリケーションに障害が発生しても、他方のアプリケーションは処理を継続できることを意味し、システム全体が停止してしまうことがありません。
*メッセージングの重要性については、弊社のブログ記事 『メッセージング再入門 (前篇) - JMS を使用することの意味 -』を参照してください。
6. マイクロサービスの種類とレイヤー構造
ここまでで、
- ビジネス ロジックを複数のマイクロサービスからなるコレオグラフィとして実現し、
- マイクロサービス間の通信はライトウェイトなメッセージング (JMS) で行い、
- メッセージングをサポートする複数のサーバーで構成される仮想的なバス (Dumb pipe: 土管)
がアプリケーション間連携の良いアーキテクチャであると説明してきました。
コレオグラフィとメッセージングバス (図をクリックすると拡大図を表示します)
|
このアーキテクチャによって、オンプレミスやクラウド上に分散されて配置されるマイクサービスを連携し、1つのビジネス ロジックとして実行することが可能になります。
個々のマイクロサービスは、それが有する機能特性/機能ドメインによって下記の稼働環境を他マイクロサービスとは非依存に選択でき、これがマイクロサービスの利点ともなっています。
- 開発言語
- 稼働プラットフォーム (マシン/OS)
- 配置場所 (オンプレミス/クラウド、他組織の IT 環境、デバイスなど)
また、データは個々のマイクロサービスの中に隠蔽され、マイクロサービス間でデータを共有することはできる限り避けるように設計実装されます。こうすることで、他マイクロサービスを含む外部の変化変更からの影響を最小化できるからです。
マイクロサービスには本来のビジネスロジック (アプリケーション ロジック) の機能を実現したものの他に、以下のような補助的なマイクロサービスが必要となります。
メディエーション機能
マイクロサービス間の非依存性/疎結合性を高めると、マイクロサービスが通信する際にデータ形式などの違いを吸収するなど、本来のビジネスロジックではないメディエーション機能が必要となってきます。
メディエーションとは、日本語に訳すと “調停” や “仲介” という意味で、マイクロサービス間のデータ スキーマなどの違いを調整し、両者がうまくコミュニケーションできるようにする機能です。代表的なメディエーション機能を下に挙げてみます。
- データ変換
- データマッピング
- XML - プレインテキスト間の変換
- EDI 電文 - XML 間の変換
- XML- JSON 間の変換
- XML から PDF への変換
- データ暗号化、圧縮
- フローコントロール (データのルーティング)
- 複数のマイクロサービスからのデータを 1つにまとめる
- データの分割
- データの内容に応じた送信先マイクロサービスへの振り分け
- 受信したデータのフォーマット チェックなどの検証
アダプター
マイクロサービスによるアプリケーション連携において課題となってくるのが、既存のアプリケーションです。
コストや困難度を無視すれば、マイクロサービス アーキテクチャに基づくものへと再構築するということも可能です。しかしながら、製品ベンダーなどから提供されているパッケージ ソフトの場合には、作り変えることは不可能です。
レガシーなアプリケーションやパッケージ製品などは、マイクロサービスとするのではなく、今ある姿のまま稼働させることがベターな方法です。ただし、マイクロサーサービスからこれらの非マイクサービスなアプリケーションへのアクセス手段を用意しておく必要があります。これによって、既存ロジックをマイクロサービスによる新しいアプリケーションの中でも利用/再利用できるようになるからです。
アクセス手段は、いわゆるアダプターとしての機能を持ったマイクロサービスがベストです。
アダプターはアクセス先がサポートしているプロトコルに応じて、下に示す種類毎にマイクロサービスとして用意します。
SAP アダプター |
Salesforce アダプター |
DBMS (JDBC) アダプター |
JMS/MOM 用各種アダプター |
Web サービス(SOAP)アダプター |
HTTP アダプター |
REST アダプター |
FTP アダプター |
SMTP アダプター |
POP3 アダプター |
SMS アダプター |
HL7 アダプター |
FIX アダプター |
SWIFT アダプター |
EDI 用各種アダプター |
EJB アダプター |
ファイル 読み書き用アダプター |
|
マイクロサービスのレイヤー
マイクロサービスは次の3種のタイプに分けて考えるのが、現実のアプリケーション開発やアプリケーション連携には妥当な方法論のように思います。
- アプリケーション本来の機能を実装したマイクロサービス
ビジネス ロジックを実装。他のアプリケーションでもビジネス ロジックとして再利用可能。
- サポート機能を実装したマイクロサービス
その都度開発するのではなく、マイクロサービスの部品としてコンテナに格納しておく。あるいはマイクロサービスをサポートするプラットフォーム製品ベンダーのバンドルを利用する。
- メディエーション マイクロ サービス
データ変換などのメディエーション機能を果たす
- アダプター マイクロサービス
マイクロサービス形態ではないビジネス ロジックにアクセスするための機能を果たす
これらのマイクロサービスのタイプは下図のようにレイヤー構造として図式化することができます。
マイクロサービスのレイヤー構造 (図をクリックすると拡大図を表示します)
|
7. まとめ (企業 IT システムを進化させるマイクロサービス)
2000年代の初期に登場した SOA は、大きな期待を集め、また導入に成功したプロジェクトも多くありました。それにもかかわらず、今日では、いくつかの理由によって、過剰に宣伝されたハイプ (hype) なテクノロジーとみなされるようになってきました。
しかしながら、ビジネスのデジタル化が強く求められている現代においては、サービス指向のアプリケーション連携はますます重要なものとなってきています。
ビジネスのデジタル化を実現するための最も重要なチャレンジは、イベント処理によるリアルタイム化です。これによって、業務遂行上のキーとなる以下の能力を向上させることが可能となるからです。
- ビジネス プロセスの効率性
- 業務処理状態の検知能力
- リクエストに対する即応性
フィオラノのプラットフォーム製品は、"メッセージのパイプライン" をその基本コンセプトとしています。このパイプライン上をデータが流れ、分散している各エンドポイント (マイクロサービス) まで、イベント駆動によって届けられます。
リクエスト-リプライの同期式連携とは異なり、イベント駆動は業務上の事象 "イベント" を検知し、そのイベントを処理するアプリケーション/サービスにリアルタイムで通知することができる方式です。
フィオラノ製品は、エコシステム内のバリューチェインに応じたインテグレーションを構築し、デジタル ビジネスをサポートするリアルタイム性を提供します。
モバイル、クラウド、ソーシャル メディア、ビッグデータの拡大は、企業のバックオフィスで稼働していたサービスをオムニチャネルなデジタル社会に直面させるよう前面に引き出してきます。
企業のデジタル化が急務となった今、IT インテグレーションはその複雑性や困難性を増しながらも、一方で迅速な実現が求められています。
フィオラノのマイクロサービスに基づく連携プラットフォームは、デジタル ビジネスのリアルタイム化を促進するテクノロジーを提供します。
- インテグレーション プロジェクトの短期化
- IT 部門ではなく、業務部門によるインテグレーション
- ライトウェイト
- セルフサービスな構築 (citizen integration)
- 最新インタフェースのサポート
- RESTful プロトコル
- JSON フォーマット
- API マネジメント
- クラウド連携
|