EIP / One-Minute EAI


EIP

1分クッキングEAI

一言要約

1分でできるほど世の中そんなに甘くない

要約

密結合依存の影響や解決方法を示すため、例としてフロントエンドのWebアプリとバックエンドの金融システムが統合されたオンラインバンキングシステムを想定してみる。

二つのシステムをつなぐ最も簡単な方法はネットワークプロトコルで最もユビキタスなTCP/IPを使うことだ。

以下に、人の名前と金額を引数に与えて預金を個人口座に入れるコードをC#で表す。

String hostName = "finance.bank.com";
int port = 80;

IPHostEntry hostInfo = Dns.GetHostByName(hostName);
IPAddress address = hostInfo.AddressList[0];

IPEndPoint endpoint = new IPEndPoint(address, port);

Socket socket = new Socket(address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(endpoint);

byte[] amount = BitConverter.GetBytes(1000);
byte[] name = Encoding.ASCII.GetBytes("Joe");

int bytesSent = socket.Send(amount);
bytesSent += socket.Send(name);

socket.Close();

このたった10行のコードはEAIツールやRPCツールキットなどの高価なミドルウェアは不要だが、一体このどこが統合において困難になるのだろうか?

プラットフォームに依存しないようにするためにはデータをバイトストリームに変換する必要がある(例ではBitConverter?を使用)が、システムにより内部表現が異なるため.NETなどの32bit上システムで整数(4バイト)を送ったとしても、64bit上の受信システムでは顧客名まで含んだデータ(8バイト)を1つの整数として解釈してしまう。

またビッグエンディアン形式で保存するシステムとリトルエンディアン形式で保存するシステムが混在することもある。

232 3 0 0

この4バイトはリトルエンディアンでは232 + 3 * 2^8 = 1000だが、ビッグエンディアンでは232 * 2^24 + 3 * 2^16 = 3892510720となってしまう。お金がふえるよ、やったね!ジョーくん

さらに問題としてリモートマシンの場所(finance.bank.com)を指定しているので、別ドメインに移動したりマシンに障害が発生したりした場合にコードを変更する必要がある。

TCP/IPはコネクション指向のプロトコルであり、両方のマシンとネットワークが全て同時に使用できる必要があり、どれかに障害があるとデータ送信は行えない。

非常に厳密なデータ形式に依存しているのも問題で、もし引数の数を変更すると送受信ともに変更する必要がある。


Tightly Coupled Interaction(密結合の相互作用)

最低限の統合ソリューションは高速かつ安価だが、以下の前提条件が互いに成り立たないとならない非常に脆いものでもある。

プラットフォーム技術
数値とオブジェクトの内部表現
位置
ハードコードされたマシンアドレス
時間
前コンポーネントが同時に利用できなければならない
データ形式
引数のリストと型が合っていなければならない 結合(coupling)はどれくらい前提条件があるかが尺度となり、このソリューションは前提条件が多いので密結合である。 より疎結合にするには、まずXMLなどの標準データ形式を使うべきである。また特定のマシンに直接送信する代わりにアドレス可能(addressable)なチャネル(位置依存性のない論理アドレス)に送るべきである。そしてリクエストをキューイングするよう強化することで時間的な依存性を解決できる。キューイングにはデータをチャンクする必要があり、チャネル内のデータ形式を変換可能にすることで、この依存関係を取り除ける。

Loosely Coupled Interaction(疎結合の相互作用)

共通データ形式、非同期通信、変換器などのメカニズムは密結合を疎結合にもたらすが複雑度が増すのが欠点である。そのため、メッセージ指向のミドルウェアインフラを使うことで始めにあげた例と同じくらい簡単に疎結合を実現できる。次のセクションではこのようなミドルウェアを構成するコンポーネントについて説明していく。

疎結合は万能薬か?全てのエンタープライズアーキテクチャにおいて単一の最良の答えはない。疎結合は柔軟性や拡張性をもたらすが、複雑なプログラミングモデルをもたらし設計や構築、デバッグも困難になる。

担当者のつぶやき

  • 本という特性上重要なポイントを強調して説明しないといけないので致し方ないが、現実的に考えるとちょっと例が極端な気がしなくもない。ちょっとしたライブラリ(ØMQとか) + Virtual IP な1 day EIPで十分なケースはいっぱいありそう。

みんなの突っ込み