将 NServiceBus 与 Azure Service Fabric 结合使用
Using NServiceBus with Azure Service Fabric
我已经在 Whosebug 上阅读了关于在 SF 上使用 NSB 的其他问题以及 github 上的示例(已过时),但我仍然不确定如何为该平台正确配置 NServiceBus。
我希望设置仅发送 publish/subscribe 工作流程。我无法通过研究确定的是如何设置它,以便特定服务只有一个实例响应消息。
例如:标准 5 个节点上的 3 个服务 运行(假设这 3 个服务各有 5 个实例)。
- 现有负载均衡器将 HTTP 请求路由到服务 A 的特定实例。
- 服务 A 发布 "OrderComplete" 事件
- 服务 B 和 C 都订阅了该事件。
- 如何确保只有服务 B 和 C 的一个实例响应,而不是服务 B 的所有 5 个实例和服务 C 的所有 5 个实例响应?
所有服务目前都是无状态服务。
我在考虑使用 AzureServiceBus 或 AzureStorageQueue 传输。
在 github 上的 NSB/SF 示例中,有一个处理命令的有状态服务。重要的是在应用程序中它有一个 PartitionCount=1
。我见过的所有其他 NSB 解决方案也是如此,每个服务只有一个分区或实例处理消息。否则,您最终会按照您的描述为每条消息的每个实例订阅一个。
也许您可以采用 Distributor 来实现同一服务的多个实例之间的负载平衡,但是 afaik Distributor 只能与 MSMQ 一起使用,因此您必须重写它才能与 SF 和 Azure Service Bus 一起使用。
如果您坚持使用单个实例,它应该适合您。您仍然可以从 SF 中获得一些好处,因为它可以确保您的服务正常运行 运行,但是多个实例之间的负载平衡需要您做一些工作。
无状态的方法很好。除非您想为您的服务利用可靠的集合,否则您不需要进入具有单个分区的有状态服务。但是让我们看看这两个选项
使用无状态服务
您可以拥有多个服务实例。是的,他们都会创建订阅。我认为这正是您想要的 - competing consumers。您拥有的服务实例越多,您将获得更多的吞吐量,即处理更多的消息。
What I can't determine through my research is how to set this up so that only one instance of a particular service responds to the message.
由于相互竞争的消费者运输(两者 ASB and ASQ)的性质,这将自动发生。
使用有状态服务
对于有状态服务,您需要非常小心。是的,您可以为每个服务使用一个分区,因此只有一个主副本来处理您的消息。但是,可以说,您没有利用集群资源来并发处理许多消息,这就是在浪费集群资源。如果您决定对服务进行分区,那么您将无法使用可靠的集合作为服务的副本不要在它们之间共享可靠的集合。如果您选择使用分区有状态服务 w/o 可靠的集合,那么您最好使用无状态服务。
注意:NSB 将为 运行 有状态服务提供支持,以利用可靠的集合来满足持久性需求,但即便如此,分区也是需要的通过与业务需求保持一致。如果您没有这样的需求,我建议您坚持使用无状态服务和 Azure Storage persistence.
我已经在 Whosebug 上阅读了关于在 SF 上使用 NSB 的其他问题以及 github 上的示例(已过时),但我仍然不确定如何为该平台正确配置 NServiceBus。
我希望设置仅发送 publish/subscribe 工作流程。我无法通过研究确定的是如何设置它,以便特定服务只有一个实例响应消息。
例如:标准 5 个节点上的 3 个服务 运行(假设这 3 个服务各有 5 个实例)。
- 现有负载均衡器将 HTTP 请求路由到服务 A 的特定实例。
- 服务 A 发布 "OrderComplete" 事件
- 服务 B 和 C 都订阅了该事件。
- 如何确保只有服务 B 和 C 的一个实例响应,而不是服务 B 的所有 5 个实例和服务 C 的所有 5 个实例响应?
所有服务目前都是无状态服务。
我在考虑使用 AzureServiceBus 或 AzureStorageQueue 传输。
在 github 上的 NSB/SF 示例中,有一个处理命令的有状态服务。重要的是在应用程序中它有一个 PartitionCount=1
。我见过的所有其他 NSB 解决方案也是如此,每个服务只有一个分区或实例处理消息。否则,您最终会按照您的描述为每条消息的每个实例订阅一个。
也许您可以采用 Distributor 来实现同一服务的多个实例之间的负载平衡,但是 afaik Distributor 只能与 MSMQ 一起使用,因此您必须重写它才能与 SF 和 Azure Service Bus 一起使用。
如果您坚持使用单个实例,它应该适合您。您仍然可以从 SF 中获得一些好处,因为它可以确保您的服务正常运行 运行,但是多个实例之间的负载平衡需要您做一些工作。
无状态的方法很好。除非您想为您的服务利用可靠的集合,否则您不需要进入具有单个分区的有状态服务。但是让我们看看这两个选项
使用无状态服务
您可以拥有多个服务实例。是的,他们都会创建订阅。我认为这正是您想要的 - competing consumers。您拥有的服务实例越多,您将获得更多的吞吐量,即处理更多的消息。
What I can't determine through my research is how to set this up so that only one instance of a particular service responds to the message.
由于相互竞争的消费者运输(两者 ASB and ASQ)的性质,这将自动发生。
使用有状态服务
对于有状态服务,您需要非常小心。是的,您可以为每个服务使用一个分区,因此只有一个主副本来处理您的消息。但是,可以说,您没有利用集群资源来并发处理许多消息,这就是在浪费集群资源。如果您决定对服务进行分区,那么您将无法使用可靠的集合作为服务的副本不要在它们之间共享可靠的集合。如果您选择使用分区有状态服务 w/o 可靠的集合,那么您最好使用无状态服务。
注意:NSB 将为 运行 有状态服务提供支持,以利用可靠的集合来满足持久性需求,但即便如此,分区也是需要的通过与业务需求保持一致。如果您没有这样的需求,我建议您坚持使用无状态服务和 Azure Storage persistence.