【问题标题】:Using NServiceBus with Azure Service Fabric将 NServiceBus 与 Azure Service Fabric 一起使用
【发布时间】:2017-02-14 13:52:33
【问题描述】:

我已阅读 StackOverflow 上有关在 SF 上使用 NSB 的其他问题以及 github 上的示例(已过时),但我仍然不确定如何为该平台正确配置 NServiceBus。

我希望设置仅发送的发布/订阅工作流程。通过我的研究,我无法确定如何设置它,以便只有一个特定服务的实例响应消息。

例如:在标准的 5 个节点上运行 3 个服务(因此假设 3 个服务中的每一个都有 5 个实例)。

  1. 现有负载平衡器将 http 请求路由到服务 A 的特定实例。
  2. 服务 A 发布“OrderComplete”事件
  3. 服务 B 和 C 都订阅了该事件。
  4. 如何确保只有一个服务 B 和 C 实例响应,而不是所有 5 个服务 B 实例和所有 5 个服务 C 实例?

目前所有服务都是无状态服务。

我正在考虑使用 AzureServiceBus 或 AzureStorageQueue 传输。

【问题讨论】:

  • 你有没有以某种方式得到这个答案?
  • @CrusherJoe 我相信它的主要部分是使用主题。为服务 A 创建一个主题订阅,然后从该订阅中处理事件的第一件事获胜,除非您创建单独的订阅,否则所有实例都没有机会处理该消息。所以总而言之,多个订阅使多个事物能够处理单个消息(主题)。 docs.microsoft.com/en-us/azure/service-bus-messaging/… 正如下面的答案所述,服务的所有实例都将充当竞争消费者。

标签: nservicebus azure-service-fabric


【解决方案1】:

无状态方法很好。除非您想为您的服务利用可靠的集合,否则您不需要使用单个分区进入有状态服务。但是让我们看看这两个选项

使用无状态服务

可以有多个服务实例。是的,他们都会创建订阅。我认为这正是您想要的 - competing consumers。您拥有更多服务实例,您将获得更多吞吐量,即处理更多消息。

我无法通过我的研究确定如何设置它,以便只有一个特定服务的实例响应消息。

由于竞争消费者运输的性质(ASBASQ),这将自动发生。

使用有状态服务

对于有状态服务,您需要非常小心。是的,您可以为每个服务使用一个分区,从而让一个主副本处理您的消息。但是,可以说,您没有将集群资源用于并发处理许多消息,从而浪费了集群资源。如果您决定对服务进行分区,那么您将无法使用可靠集合作为服务的副本在它们之间共享可靠集合。如果您选择使用没有可靠集合的分区有状态服务,那么您最好使用无状态对应物。

注意:NSB 将为使用有状态服务运行提供支持,以利用可靠的集合来满足持久性需求,但即便如此,分区仍需要通过以符合业务需求.如果您没有这样的需求,我建议您坚持使用无状态服务和Azure Storage persistence

【讨论】:

【解决方案2】:

在 github 上的 NSB/SF 示例中,有一个处理命令的有状态服务。重要的是在应用程序中它有一个PartitionCount=1。我见过的所有其他 NSB 解决方案也是如此,每个服务只有一个分区或实例来处理消息。否则,如您所描述的,您最终会为每条消息的每个实例订阅一个。

也许您可以采用 Distributor 来实现同一服务的多个实例之间的负载平衡,但 afaik Distributor 仅适用于 MSMQ,因此您必须重写它以与 SF 和 Azure Service Bus 一起使用。

如果您坚持使用单个实例,它应该适合您。您仍然可以从 SF 中获得一些好处,因为它可以确保您的服务正常运行,但是多个实例之间的负载平衡需要您做一些工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-13
    • 2019-11-30
    • 2016-05-17
    • 2015-09-17
    • 2016-10-12
    • 1970-01-01
    • 2017-06-09
    • 2015-07-11
    相关资源
    最近更新 更多