WCF MSMQを使用したオブザーバーパターン
-
05-07-2019 - |
質問
MSMQによって運ばれるメッセージの複数のリスナーを持つことは可能ですか?
WCFは、サービスの点ですべてを構成しているように見えるため、通信はポイントツーポイントの問題になっています。メッセージキューを使用して、データベースにログを記録する別のプロセスの着信トラフィックをバッファリングしたい。
着信トラフィックの監視に関心を持つ他のプロセスがいくつも存在する可能性があり、これはオブザーバーパターンを積極的に要求しますが、少なくともWCFを介したMSMQを使用せずに、オブザーバーパターンを表現する方法はわかりません。
これについて誰かにアドバイスしてもらえますか?
気にする理由の背景。これは問題を説明するのにも役立つかもしれません。私は、フィールド内の小さなブラックボックスからの接続要求を受け入れるWindowsサービスを持っています。ソケットをセットアップし、ブラックボックスは、時間と空間のGPS位置が注釈されたイベントを説明するメッセージを送信します。
ソケットストリームからのメッセージパケットを解析し、MSMQを介して、重複をフィルタリングしてパケットをデータベーステーブルに書き込む別のプロセスに送信します。
着信トラフィックに応じてインクリメンタル計算の恩恵を受ける後処理があり、ユーザーツールは着信トラフィックに応答してユーザー通知を実行します。
それで、1つのプロセスがメッセージを送信し、複数のプロセスがメッセージを受信するようにしたいと考えています。これらの受信者の1つは、パケットの内容を解析し、メッセージをデータベースに転写する責任があります。これはキューからメッセージを最終的に削除する責任の明白な候補ですが、これがメッセージを処理する最後のハンドラーであることを確認する方法の問題があります。
解決
MSMQがこの状況を単独で処理するように適切に設計されているとは思わない。メッセージに対してできることは、Peek()またはGet()の2つだけです。知る限り、メッセージがすべてのハンドラーによって処理されたかどうかを追跡する良い方法はありません。
機能するのは、メッセージを転写してデータベースに書き込む前に、メッセージを転写するプロセスをオブザーブにし、(おそらく.NETイベントアーキテクチャを使用して)関心のあるすべてのオブザーバーにメッセージを公開することです。これにより、関心のあるすべてのオブザーバーがメッセージを確認し、メッセージが適切にDBに書き込まれることが保証されます。
他のヒント
Publish-Subscribe Channel が必要だと思います:
送信者は、関心のあるすべての受信者にイベントをブロードキャストできますか? 特定のコピーを配信するパブリッシュ/サブスクライブチャネルでイベントを送信する 各レシーバーへのイベント。
パブリッシュ/サブスクライブチャネルは次のように機能します。1つの入力チャネルがあります サブスクライバごとに1つ、複数の出力チャネルに分割されます。 イベントがチャネルに公開されると、Publish-Subscribe チャネルは、メッセージのコピーを各出力チャネルに配信します。 各出力チャネルにはサブスクライバーが1つしかありません。 メッセージを1回消費します。このようにして、各サブスクライバーは メッセージと消費されたコピーがチャンネルから消えます。
このパターンは、 MassTransit および NServiceBus 。