我已经阅读了 StackOverflow 上有关在 SF 上使用 NSB 的其他问题以及 github 上的示例(已过时),但我仍然不确定如何为此平台正确配置 NServiceBus。
我正在寻求设置仅发送发布/订阅工作流程。通过我的研究,我无法确定如何进行设置,以便特定服务只有一个实例响应该消息。
例如:在标准 5 个节点上运行 3 个服务(因此假设这 3 个服务各有 5 个实例)。
- 现有负载均衡器将 http 请求路由到服务 A 的特定实例。
- 服务 A 发布“OrderComplete”事件
- 服务 B 和 C 都订阅该事件。
- 如何确保只有服务 B 和 C 的一个实例响应,而不是服务 B 的所有 5 个实例和服务 C 的所有 5 个实例响应?
所有服务目前都是无状态服务。
我正在考虑使用 AzureServiceBus 或 AzureStorageQueue 传输。
最佳答案
无状态方法很好。您不需要使用单个分区进入有状态服务,除非您想为您的服务利用可靠的集合。但让我们看看这两个选项
使用无状态服务
可以拥有多个服务实例。是的,他们都会创建订阅。我认为这正是你想要的 - 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 和 ASQ),这将自动发生。
使用有状态服务
对于有状态服务,您需要非常小心。是的,您可以为每个服务使用一个分区,从而让一个主副本处理您的消息。但是,可以说,您没有利用集群资源来并发处理许多消息,从而浪费了集群资源。如果您决定对服务进行分区,那么您将无法使用可靠集合,因为服务的副本不在它们之间共享可靠集合。如果您选择使用没有可靠集合的分区有状态服务,那么您最好使用无状态对应服务。
注意:NSB 将提供对运行有状态服务的支持,以利用可靠的集合来满足持久性需求,但即便如此,也需要通过分区来满足业务需求。如果您没有这样的需求,我建议坚持使用无状态服务和 Azure Storage persistence .
关于nservicebus - 将 NServiceBus 与 Azure Service Fabric 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41947570/