2012-01-26 9 views
7

私はさまざまなハードウェアタイプからのステータス情報の受信をサポートするシステムを開発しています。各ハードウェアは同じステータス情報(緯度、経度)を報告していますが、各ハードウェアタイプはこの情報を報告するために固有のプロトコルを使用します。このため、私は、各デバイスの種類ごとに1つずつ、そのデバイスのプロトコルをリッスンして解析する複数のサービスを用意しています。NServiceBusエンドポイントは同じメッセージの複数のパブリッシャにサブスクライブできますか?

public interface IPositionMessage : IMessage 
{ 
    string UnitName { get; set; } 
    double Latitude { get; set; } 
    double Longitude { get; set; } 
} 

私は何の問題私の最初のサービスの設定がありませんでしたが、今私は私の第2のサービスを設定していますことを、私はそれを見つけている:これらのサービスのそれぞれが共通のメッセージを使用してステータス情報を公開するために私が希望します私の購読者は複数の出版社から同じメッセージを購読することができません。

同様のquestion on the NServiceBus yahoo groupでは、共通のメッセージをコマンドに変換し、Bus.PublishではなくBus.Sendを使用することをお勧めします。実際に起こっていることはイベントです(ユニットは既にポジションに到着しており、新しいポジションを報告しています)ので、このシナリオでは意味をなさないと思います。これをコマンドに変換すると、私はこのイベントの潜在的な加入者をすべて事前に知る必要があります。もう1つの可能な解決策は、各サービスがBus.Sendになる集約/再発行者を作成し、メッセージを単一の発行元から再発行することです。これは不要なボトルネックのようです。

複数のサイト運営者から同じメッセージを定期購読する方法はありますか?

+0

AFAIK、複数のLOGICALパブリッシャーから公開するのは悪い習慣です。 –

+0

私の見解では、各サービスは、1つの論理パブリッシャーの一部として参加する物理ノードです。サービスの実装が1つで、2台目のマシンにインストールする必要がある場合は、私のシナリオは変わりません。 – JadeMason

答えて

12

これは、Udiがあなたのために非常に難しくしようとしているSOA「成功のピット」の1つです。

基本的な二重性はこれです:

  • コマンドは、多くのクライアントによって送信されると、単一の信頼できるソースによって受信されるべき。
  • イベントは、単一の信頼できるソースによって公開され、多くのクライアントによって受信される必要があります。

しかし、この単一の信頼できるソースは、信頼できるソースです。重要な点は、すべてのIPositionMessageデータに興味がある場合、購読要求を送信する論理ポイント(queuename @ servername)が1つだけであることです。

同じ論理サービス内の複数の物理プロセッサが、発行する内容が信頼できるものである限り、すべて同じイベントタイプを公開することはできません。

重要な点は、すべての物理プロセッサが同じサブスクリプションストレージを共有することです。実際、1つの物理エンドポイントにサブスクリプション要求のみを処理させ、処理を全く行わないことができます。ただサブスクリプションリクエストを受信するだけです(QueueX @ ServerYはIPositionMessageに興味があります)、サブスクリプションストレージを更新します。

次に、同じサブスクリプションストレージに接続されている各プロセッサは、IPositionMessageを公開し、QueueX @ ServerYが関心を持っていることがわかり、その場所にイベントのコピーを送信します。

NServiceBus.Liteプロファイルを実行している環境では、サブスクリプションの記憶域がデフォルトでメモリに格納されているため、これは開発環境では少し難しいでしょう。したがって、明らかに共有されず正しく実行されませんそれで、準備が整っています。

+0

あなたは私の闘争に直接ぶつかってきました。それぞれの物理ノードが独立した入力キューを使う方法を見つけて(それぞれのプロトコル実装がユニークな構成コマンドを受け取れるように)、同時にこれらのノードは論理パブリッシャの物理ノードとして機能します(各ノードはそのイベントの信頼できるパブリッシャです)。私は、公開されるメッセージを扱う非常に単純な「再発行者」を作成し、すべての購読者に公開しました。最初の紅潮では、それはまだハックのように感じますが、私はこれが懸念をどのように分けているのかを見ることができます。 – JadeMason

+0

このように設定する方法の例はありますか?私はこのことについてどうやって行くのかについて少し混乱しています。 –

+0

気にしないでください。すべての関連エンドポイントが同じRaven DBデータベースを参照するように設定するだけです。 MSMQストレージの場合、同じキューを指し示す必要があると思います。 –

1

複数のパブリッシャ(これは<unicastBusConifg />で設定できます)を購読することはできますが、パブリッシュではなく論理的な送信になるという点でユーザーグループに同意します。

なぜ私はこれを考えるのか分かりません。

関連する問題