我有一个启用了Session的Azure servicebus队列。我需要某种形式的服务,它可以从队列中读取并处理它们并保存结果(在内存中供以后检索)。我们在当前的架构中使用azure servicefabric。关于哪一个选择有状态或无状态服务我几乎没有问题。
如果我使用有状态服务,那么基于我理解的文档,服务将在1个主节点(假设1个分区)和2个活动辅助节点上运行。这意味着,如果我有一个10节点的服务结构集群,那么这个有状态服务将主要只使用一个节点(VM)。
因此,如果我向此有状态服务添加一个侦听器以从队列中读取消息,那么主节点上的该服务将从队列中读取消息,并且所有其他剩余的9个节点将无法使用。它是否正确?
然而,如果我使用无状态服务,我可以在所有10个节点上创建实例,并且所有节点都可以在队列中侦听消息并并行处理它们。但是,我将松开保存结果的选项。
请告知。
答案 0 :(得分:1)
因此,如果我向此有状态服务添加一个侦听器以从队列中读取消息,那么主节点上的该服务将从队列中读取消息,并且所有其他剩余的9个节点将无法使用。这是对的吗?
这是正确的。对于有状态服务场景,只有主副本将执行它的侦听器,并且将完成工作。其他副本可以以只读模式使用,但它们不会将任何内容写入可靠的集合中。
然而,如果我使用无状态服务,我可以在所有10个节点上创建实例,并且所有节点都可以在队列中侦听消息并并行处理它们。
完全。无状态服务可以并行执行其工作,并且不会持续存在任何状态。这也是乳清没有为此Service Fabric模型提供可靠收集的原因。
但是,我会松开保存结果的选项。
不一定是真的。您仍然可以将数据保存在集中/共享数据库中,就像您过去使用无状态解决方案一样(例如云服务或Azure WebApp)。
你应该问自己什么是你解决的问题。如果您有数据分片,则Statful更有意义。如果您没有数据分片和/或您需要扩展处理能力,而不是扩展,Stateless是一种更好的方法。