EIP / Message Dispatcher


Message Dispatcher

一言要約


1つのチャンネルで、複数のコンシューマを協調させて処理させることができるパターン。

Context

  • アプリケーションは、Messagingを使っている。
  • アプリケーションを協調して動作させるために、1つのMessage Channelで複数のコンシューマを必要としている。

Problem

どうやって1つのチャンネルで複数のコンシューマに、メッセージ処理を協調させることができるだろうか?

Detail

  • 1つのPoint-to-Point Channel で複数のコンシューマは、Competing Cnsumersとして動作する。コンシューマが交換可能であるときには適している。だが、コンシューマの特定が許されてないので、あるコンシューマは、あるメッセージをより上手く使うことができる。
  • 1つのPublish-Subscribe Channelで複数のコンシューマは、意図したように動作しないだろう。むしろメッセージを読み込み、これらのコンシューマは動作を繰り返すだろう。

Solution

1つのチャンネルからメッセージを消費するチャンネルでMessage Dispatcherを作成し、パフォーマー(performers)に配信する。


  • Message Dispatcherは、2つのパートから構成される
  1. Dispatcher - チャンネルからメッセージを使い、それぞれのメッセージをパフォーマー(performer)へ配信するオブジェクト。
  2. Performer - Dispatcherに渡されたメッセージを処理するオブジェクト。

※(参照 Message Dispatcher Sequenece)

  • dispatcherは、メッセージを受け取ると、利用可能なperformerにメッセージを処理するために委譲する。もしperformerがdispatcherのスレッドを使用してメッセージを処理するのであれば、dispatcherは、performerがメッセージの処理を終えるまでブロックする。
  • 逆に、もしperformerが自分自身のスレッドでメッセージを処理するのであれば、そのときにには1つのdispatcherがスレッドをスタートし、すぐに他のメッセージが受取りを始めることができ、他のパフォーマーに委譲するので、メッセージは並列的に処理される。
  • dispatcherは、シングルチャンネルと、performerのグループの間で、1対多で通信させ動作させる。performerは、ほとんどが動作する。dispatcherは、ちょうどmatchmakerのように動作する。利用可能なperformerで各メッセージに一致させ、perfomerが自分自身のスレッドで実行している間、ブロックしない。
  • このパターンはシンプルで、POSA2のReactorパターンのメッセージに特化したバージョンといえる。

担当者のつぶやき

みんなの突っ込み