【问题标题】:What is the best way to route NServiceBus messages to specific clients?将 NServiceBus 消息路由到特定客户端的最佳方式是什么?
【发布时间】:2011-06-26 13:29:59
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您最终为此使用了什么解决方案?
  • 我仍在努力解决。我对发布到所有方法不太满意,因为这些是特定于客户端的队列,理想情况下它们无法访问彼此的消息。

标签: nservicebus nservicebus-distributor


【解决方案1】:

如果您真正想要的是允许您只拥有一条消息的解决方案,您可以在其中根据 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();

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 将有 100 多个客户都收到相同类型的消息(为了参数而订购),所以我不想创建 100 多个特定的客户订单消息类。似乎更容易包含客户标识符。所以你说只是将所有订单发布到所有客户队列,让他们忽略不属于他们的订单?
    • 是的,让他们忽略他们不关心的消息是最简单的。
    猜你喜欢
    • 2018-11-25
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 2014-11-19
    • 2016-08-02
    相关资源
    最近更新 更多