0

我有一个启用会话的 Azure 服务总线队列。我需要某种形式的服务,可以从队列中读取并处理它们并保存结果(在内存中供以后检索)。我们在当前架构中使用 azure servicefabric。关于选择有状态服务还是无状态服务,我几乎没有收到任何问题。

如果我使用有状态服务,那么根据我的理解,服务将在 1 个主节点(假设 1 个分区)和 2 个活动辅助节点上运行。这意味着,如果我有一个 10 节点的 Service Fabric 集群,那么这个有状态的服务将主要只使用一个节点 (VM)。

因此,如果我向这个有状态服务添加一个侦听器以从队列中读取消息,那么主节点上的该服务将从队列中读取消息,并且所有其他剩余的 9 个节点将无法使用。这个对吗?

而如果我使用无状态服务,我可以在所有 10 个节点上创建实例,并且它们都可以监听队列中的消息并并行处理它们。但是,我将放弃保存结果的选项。

请指教。

4

1 回答 1

1

因此,如果我向这个有状态服务添加一个侦听器以从队列中读取消息,那么主节点上的该服务将从队列中读取消息,并且所有其他剩余的 9 个节点将无法使用。这个对吗?

那是对的。在有状态的服务场景中,只有主副本才会执行它的监听器,然后才能完成工作。其他副本可以在只读模式下使用,但它们不会将任何内容写入可靠的集合中。

而如果我使用无状态服务,我可以在所有 10 个节点上创建实例,并且它们都可以监听队列中的消息并并行处理它们。

确切地。无状态服务可以并行执行它们的工作,并且没有状态被持久化。这也是没有可用于此 Service Fabric 模型的可靠集合的原因。

但是,我将放弃保存结果的选项。

不一定是真的。您仍然可以将数据保存在集中式/共享数据库中,就像您过去使用无状态解决方案(例如云服务或 Azure WebApp)所做的那样。

你应该问自己的是你在解决什么问题。如果你有数据分片,Statful 更有意义。如果您没有数据分片和/或您需要扩展您的处理能力,而不是向上扩展,无状态是一种更好的方法。

于 2018-01-27T17:49:34.303 回答