将NServiceBus与Azure Service Fabric一起使用

时间:2017-01-31 00:01:31

标签: nservicebus azure-service-fabric

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

使用无状态服务

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

  

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

由于竞争性消费者传输的性质(ASBASQ),这种情况会自动发生。

使用有状态服务

通过有状态服务,您需要非常小心。是的,您可以使用每个服务的单个分区,因此只有一个主副本处理您的邮件。但是,可以说,通过不利用它们来同时处理许多消息,你浪费了你的集群资源。如果您决定对服务进行分区,那么您将无法使用可靠的集合作为服务的副本在它们之间共享可靠的集合。如果您选择使用没有可靠集合的分区有状态服务,那么您最好使用无状态对应项。

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

答案 1 :(得分:0)

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

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

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