EIP / Content-Based Router


EIP

コンテントベースのルーター

一言要約

  • コンテントベースのルータを使って、メッセージの中身に応じて、各メッセージが正しい受け手に伝わるようにしよう。

要約

  • 注文処理システムを作っているとして、まずバリデーションを行い、次に在庫があるかをチェックするのであれば、パイプとフィルター(70)が使える。しかし、エンタープライズでは普通、在庫管理システムは複数あり、それぞれ別々の商品を扱う
  • 論理的には一つの機能が、物理的にバラバラなシステムに配置されている場合、どうすればいいだろうか?
  • インテグレーション・ソリューションとは、既存のアプリケーションをつなぎ合わせることだ。しかし、普通は統合を想定しないでアプリケーションは作られているので、業務機能が一つのシステムにまとまっていることはない。
  • たとえばウィジェット&ガジェットで在庫管理システムが別々だったとして、それぞれにチャネルを作ることもできるが、それでは、クライアントに内部のアーキテクチャを晒すことになってしまう。クライアントから内部のアーキテクチャを隠すためには、別々の商品の注文が同じチャネルに届くようにしなければならない。
  • 注文をすべての在庫システムに送信し、各システムで処理するかどうかを判断させてもよい。このやり方には、新しく在庫システムを追加する場合に既存システムに影響を与えなくてすむというメリットもあるが、調整処理が複数のシステムにまたがることになってしまう。すると、注文がどのシステムでも処理されなかった場合にどうすれば良いか?といった問題が起きてしまう。
  • 他のやり方として、商品番号をチャネルアドレスとして使うことも考えられる。各商品には専用のチャネルが割り当てられ、クライアントは商品に応じたチャネルを呼び出せばいい。在庫システム側は自分が処理できるチャネルをリッスンする。こうすると、正しい在庫システムに注文が届くという、チャネルのアドレサビリティは向上するが、商品数が増えると、チャネルの数が爆発してしまう。
  • メッセージトラフィックも最小限にしなければならない。GoFのチェーン・オブ・レスポンシビリティのように、あるシステムが処理しないメッセージを別のシステムに受け渡すことも考えられるが、システム同士がお互いを知る必要が生じてしまうし、このやり方ではオーバーヘッドが大きくなってしまう。
  • 要するに、業務機能がシステムにまたがってしまっているという事実をカプセル化し、メッセージチャネルとトラフィックを効率化し、注文が一つのシステムだけで処理できるようにしなければならない。
  • コンテントベースのルータを使って、メッセージの中身に応じて、各メッセージが正しい受け手に伝わるようにしよう。
  • コンテントベースのルーターは、メッセージの中身を評価して、それに応じて別々のチャネルにメッセージを送信する。ルーティングの基準は様々な可能性がある。コンテントベースのルーターを実装するときには、ルーティング機能は保守しやすく作らなければならない。ルーターは頻繁にメンテナンスする必要が生じるからだ。より高度なシステムでは、設定可能なルールエンジンの形になるかもしれない。

依存関係を減らす

  • コンテントベースのルーターは、汎用的なメッセージルーター(78)という形をとることがしばしばある。また、コンテントベースのルーターは、予見的なルーティング(predictive routing)を使っている。つまり、各メッセージが直接所定のシステムに送られるのだ。コンテントベースのルーターの欠点は、受け手とその能力をすべて知っておかなければならないということだ。受け手が追加されたり、削除されたりするたびに変更しなければならない。これは、メンテナンス・ナイトメアになる可能性がある。
  • コンテントベースのルーターが個々のシステムに依存してしまうことを回避するためには、各受け手がルーティングプロセスをコントロールするようにすればいい。このやりかたは、まとめて、リアクティブ・フィルタリング(reactive filtering)と呼ばれる。こうすると、コンテントベースのルーターが入らなくなるが、効率は落ちる。このトレードオフについては、メッセージフィルター(237)とルーティング・スリップ(301)で扱う。
  • ダイナミック・ルーター(243)はコンテントベースのルーターとリアクティブフィルタリングとの間のトレードオフに対応している。すなわち、各受け手がコンテントベースのルーターに自分の能力を伝えるのだ。コンテントベースのルーターは、各受け手の能力の一覧を保守すればいい。柔軟に出来る代償として、ソリューションが複雑になり、デバッグが大変になる。

具体例

  • 省略

担当者のつぶやき

  • コンテントベースのルーターとは何か、という話はシンプルに理解できる。依存関係の話が面白い。

みんなの突っ込み