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つのパートから構成される
- Dispatcher - チャンネルからメッセージを使い、それぞれのメッセージをパフォーマー(performer)へ配信するオブジェクト。
- Performer - Dispatcherに渡されたメッセージを処理するオブジェクト。
※(参照 Message Dispatcher Sequenece) †
- dispatcherは、メッセージを受け取ると、利用可能なperformerにメッセージを処理するために委譲する。もしperformerがdispatcherのスレッドを使用してメッセージを処理するのであれば、dispatcherは、performerがメッセージの処理を終えるまでブロックする。
- 逆に、もしperformerが自分自身のスレッドでメッセージを処理するのであれば、そのときにには1つのdispatcherがスレッドをスタートし、すぐに他のメッセージが受取りを始めることができ、他のパフォーマーに委譲するので、メッセージは並列的に処理される。
- dispatcherは、シングルチャンネルと、performerのグループの間で、1対多で通信させ動作させる。performerは、ほとんどが動作する。dispatcherは、ちょうどmatchmakerのように動作する。利用可能なperformerで各メッセージに一致させ、perfomerが自分自身のスレッドで実行している間、ブロックしない。
- このパターンはシンプルで、POSA2のReactorパターンのメッセージに特化したバージョンといえる。
担当者のつぶやき †
みんなの突っ込み †