2011-06-26 53 views
1

比方说,我有一个ClientRequestMessage消息,其中包含对特定Client的请求。网络应用程序将生成这些请求,并且需要将它们发送到正确的Client进行处理。我可以为此考虑一些选择。将NServiceBus消息路由到特定客户端的最佳方式是什么?

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

所以我的问题是,什么是最好的(最有效的?最容易管理?)的方式来设置它?我很确定我需要使用经销商,但不是积极的想法,我会问。

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

+0

你最终使用了什么解决方案? – Charlino

+0

我仍在努力解决它。我对发布到所有方法都不是很满意,因为这些是客户端特定的队列,理想情况下他们无法访问彼此的消息。 –

回答

0

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

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

+0

将有100多个客户都收到相同类型的消息(为了争取订单),所以我不想创建100多个特定的客户订单消息类。看起来更容易包含客户端标识符。所以你说只是将所有的订单发布到所有的客户端队列中,让他们忽略那些不属于他们的订单? –

+0

是的,让他们忽略他们不关心的信息是最容易的。 –

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(); 
相关问题