1

ClientRequestMessage特定の のリクエストを含むメッセージがあるとしますClient。Web アプリケーションはこれらの要求を生成し、Client処理のために正しいものに送信する必要があります。これにはいくつかのオプションを考えることができます。

  1. すべてのメッセージが送信される単一のキューを作成し、特定のクライアント ハンドラーがプロパティ ( などClientId) をチェックして、それが重要かどうかを判断することができます。しかし、これは私にとって多くのレベルで間違っていると感じています。
  2. 私はすべてのクライアントにメッセージを公開し、彼らは処理中にそれを気にするかどうかを決定できます. これはトラフィックが多すぎるように思われ、そもそも気にする必要のないメッセージを処理するために各クライアントの時間を無駄にします。
  3. これらのメッセージもルーティングされるクライアント固有のキューを持つことができます。これは私にとって最高の気分ですが、どうすればよいかわかりません。シンプルに保ち、クライアント固有のメッセージ タイプを避けたいのですが、NServiceBus に「クライアント A の場合はクライアント A のキューに送信し、クライアント B の場合はクライアント B のキューに送信します」と伝える方法がわかりません。

だから私の質問は、これを設定するための最良の(最も効率的?最も管理しやすい?)方法は何ですか?ディストリビューターを使用する必要があると確信していますが、肯定的ではないので、尋ねてみようと思いました。

おまけの質問:
各クライアントに複数のハンドラーがあるとします。そのうちの 1 つだけが特定のメッセージを処理するようにするにはどうすればよいですか? クライアントごとにディストリビューターが必要ですか?

4

2 に答える 2

0

本当に必要なのが、clientIdに基づいてメッセージに特定のフィルターを配置し、メッセージがクライアントに関連する場合にのみメッセージをクライアントにルーティングできる単一のメッセージを作成できるソリューションである場合は、PServiceBus(pservicebus .codeplex.com)。これにより、クライアントごとに一連のサブスクリプションを特定しやすくなります。これらのサブスクリプションのメッセージはすべて、clientIdによって特定のキューまたは使用可能なトランスポートにフィルターされます。次の例は、UserNameプロパティによるChatTopicのフィルタリングを示しています。サブスクライバーは、メッセージが公開されたUserNameプロパティがTJでない場合にのみ、指定されたトランスポートでメッセージを受信します。GreaterThan( "MyComplexProperty.Blah.ID"、5)などの複雑なフィルターを使用することもできます。

Subscriber.New("MyUserName").Durable(false)
          .SubscribeTo(Topic.Select<ChatTopic>().NotEqual("UserName", "TJ"))
          .AddTransport("Tcp", 
                Transport.New<TcpTransport>(
                transport => { 
                   transport.Format = TransportFormat.Json; 
                   transport.IPAddress = "127.0.0.1"; 
                   transport.Port = port; 
                }), "ChatTopic")
           .Save();
于 2011-07-20T14:41:48.183 に答える
0

MessageEndpointMappings 構成セクションを使用して、メッセージを配置する場所を NSB に指示できます。特定のメッセージの種類またはアセンブリ全体をキューにマップできます。特定のメッセージ タイプを作成してマッピングしたくない場合は、公開アプローチをお勧めします。キューからメッセージを削除するオーバーヘッドはごくわずかです。

「クライアント」がメッセージを取得するための NSB のインスタンスを多数持っている場合は、Distributor を使用する必要があります。配布されている Pub/Sub ドキュメントを確認してください。

于 2011-06-27T14:44:34.787 に答える