1

假设我有一条ClientRequestMessage消息,其中包含对特定Client. Web 应用程序将生成这些请求,并且需要将它们发送到正确的位置Client进行处理。我可以为此想到一些选择。

  1. 我可以有一个所有消息都发送到的队列,并且特定的客户端处理程序检查一个属性(如ClientId)来决定他们是否关心它。不过,这在很多层面上对我来说都是错误的。
  2. 我可以向所有客户发布一条消息,他们可以决定在处理过程中是否关心它。这似乎是太多的流量,浪费了每个客户处理他们最初不应该关心的消息的时间。
  3. 我可以有客户端特定的队列,这些消息也被路由。这对我来说感觉最好,但我不确定如何去做。我想保持简单并避免使用客户端特定的消息类型,但我不确定如何告诉 NServiceBus“客户端 A 将其发送到客户端 A 的队列,客户端 B 将其发送到客户端 B 的队列”。

所以我的问题是,最好的(最有效的?最容易管理的?)方法是什么?我很确定我需要使用分销商,但不是肯定的,所以我想我会问。

奖励问题:
假设每个客户端都有多个处理程序。如何确保只有其中一个处理给定消息?我需要每个客户的分销商吗?

4

2 回答 2

0

您可以使用 MessageEndpointMappings 配置部分告诉 NSB 将消息放在哪里。您可以将特定消息类型或整个程序集映射到队列。如果您不想创建特定的消息类型并对其进行映射,那么我会推荐发布方法。从队列中删除消息的开销非常小。

如果您的“客户”有许多 NSB 实例来获取消息,那么您将需要使用分发器。查看分发的 Pub/Sub 文档

于 2011-06-27T14:44:34.787 回答
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 回答