前回 (その1) は、マイクロサービス アーキテクチャについてモノリシックなアプリケーションと比較して概説しました。今回は、マイクロサービス間のコミュニケーションに焦点をあててマイクロサービス アーキテクチャを掘り下げていきます。
UNIX のパイプ
マイクロサービス アーキテクチャは、クラシックな技術ではありますが UNIX のパイプ機能になぞらえることができます。
UNIX のパイプ機能は、最初のシェルが作られた 1970 年代に誕生しています。このブログを読まれている方の中には、UNIX のシェルを直接使用してコマンド実行をしたことがない人もいるかもしれません。簡単に説明してみます。
- シェルは、UNIX を利用するための UI (ユーザー インタフェース) を担っています。
- グラフィカルなインタフェースではなく、コマンド ラインとしてのインタフェースです。
- UNIX の機能やユーティリティは、コマンドとしてユーザーに提供されています。
- 例えば、次のようなコマンドがあります。
cat : 指定されたファイルの内容を出力
(cat という名前本来の意味は concatenate (連結)で、複数ファイルを連結することから
きています。話を単純にするために、ここではファイル内容の出力としておきます。)
grep : 措定した文字列の検索。指定文字列を含む行を出力
sort : 行単位のソート - 各コマンドは、下記の標準入出力ポートを持っています。
stdin 標準入力: インプット (デフォルトはキーボード)
stdout 標準出力: アウトプット (デフォルトはコンソール)
stderr 標準エラー出力 : エラー時の出力 (デフォルトはコンソール) - デフォルトではコマンドは次のように動作します。
1. コマンドはキーボード (stdin) からデータを入力
2. データを処理
3. 処理結果をコンソール (stdout) に出力
4. エラー時には、エラー結果 (エラー通知) をコンソール (stderr) に出力
さて、ここで次の課題を考えてみましょう。
『あるファイルの中から “Apple” という単語を含む行を抽出し、各行の先頭にある項目番号でソートした結果を出力する』
UNIX ではこれを洗練された形で解決します。UNIX シェルのパイプ機能です。
パイプ機能を使用することをシェルに知らせるためには “|” 記号でコマンドをつなげていきます。上の課題では、次のようになります。
cat File-A | grep Apple | sort
シェルはパイプ指定を受けると、コマンドの stdin、stdout をシェル内部のバッファ (パイプ) に切り替えます。
UNIX のパイプ機能によって、一連のコマンドを連続して処理することがたいへん簡単に行えるようになります。さらに、リソース的に高価な外部 I/O (ファイル、コンソールなど) をシェル内部のバッファに置き換えることで、ライトウェイトな処理となり処理パフォーマンスも向上します。
また、コマンドの入れ替え (例えば中間の grep を他のコマンドと入れ替える) も何の問題もなく簡単に行えます。
マイクロサービスにおけるパイプライン
マイクロサービス アーキテクチャは、UNIX のパイプ機能と同じ利点を持ったサービス連携アーキテクチャです。
単一の機能にしぼった小さな (マイクロな) サービスを連携させることで、大きな処理を実現するアプローチは、UNIX シェルのパイプのエッセンスを有しています。
マイクロサービス間の連携の様子は、下図のように表わすことができます。これは、UNIX のパイプ機能を拡張したものとなっています。
UNIX のパイプと最も異なる点は、入力/出力のポートが複数ある点です。これによって、以下の処理が可能となります。
- データ内容などの条件によって、送信先を変更できる
- 同一データを複数の相手に送信できる
- 複数の相手からデータを集めてきて、その集合データに対して処理が行える
また、クラウド コンピューティングの利用などの現代の IT 利用環境を考慮する必要もあります。
UNIX では、すべてのコマンドが単一のマシン上で稼働することを前提としていましたが、マイクロサービスでは下図に示すような分散環境で実行することが必要となります。
次回は、マイクロサービスのパイプライスを実現するための具体的なインフラについて考察する予定です。
Twitter Facebook Google+