将NServiceBus消息路由到特定客户端的最佳方法是什么?

时间:2011-06-26 13:30:00

标签: nservicebus nservicebus-distributor

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

  1. 我可以拥有一个所有消息都会到达的队列,特定的客户端处理程序会检查属性(如ClientId)以确定它们是否关心它。这对我来说在很多层面上都是错误的。
  2. 我可以向所有客户发布消息,他们可以决定在处理过程中是否关心它。这似乎是过多的流量,并且浪费每个客户的时间来处理他们不应该首先关注的消息。
  3. 我可以拥有客户端特定的队列,这些消息也会被路由。这个对我来说是最好的,但我不确定如何做到这一点。我想保持简单并避免客户端特定的消息类型,但我不知道如何告诉NServiceBus“客户端A将其发送到客户端A的队列,并且客户端B将其发送到客户端B的队列”。
  4. 所以我的问题是,什么是最好的(最有效的?最容易管理的?)方式来设置它?我很确定我需要使用经销商,但不是积极的,所以我想问。

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

2 个答案:

答案 0 :(得分:0)

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

如果您的“客户端”有许多NSB实例来接收消息,那么您将需要使用分发服务器。查看distributed Pub/Sub documentation

答案 1 :(得分: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();