【发布时间】:2018-11-28 09:07:45
【问题描述】:
假设我在一个 5 节点集群上创建了一个有 5 个分区的有状态服务结构服务。我看到每个节点每个节点都有 1 个分区。当我在 VS 中调试服务时,我注意到服务结构正在所有 5 个分区中创建 5 个有状态服务的实例 [基本上每个分区 1 个静态实例]。无论客户端进行多少次调用,只有 5 个此类的实例可以提供请求。 以下说法正确吗?
有状态服务中的任何类级别成员变量本质上都是静态的 [因为它解析为该分区上的单例实例],因此在更新时需要“锁定”语义?
由于客户端始终为给定分区解析为类的“相同”实例,因此客户端可以重复使用“代理”实例吗?
- 当大量客户端每秒调用同一个服务实例数百次时,这种有状态服务创建的“单例”模型如何影响性能和可伸缩性。 [重载下] 我了解到在配置 V2 远程监听器时有一个设置,我们可以通过“FabricTransportRemotingListenerSettings”指定“MaxConcurrentCalls”。
【问题讨论】:
-
嗨@teeboy。你能澄清一下每个分区有多少个副本吗?每个分区有一个副本吗?
-
我刚刚意识到我将本地集群更改为 1 个节点。服务结构是否忽略 1 个节点集群的“副本”计数?但是,我在 local.1Node.xml 中的副本数确实为 1。
-
Service Fabric 不会忽略 1 个节点群集上的“副本计数” - 一个节点的单个分区中的“副本”不能超过一个。回到您的问题 - Service Fabric 为每个副本创建一个 StatefulService 类的实例。在副本关闭之前,此实例将处于活动状态。要获得更多信息,我建议您查看service lifecycle。
-
感谢您的链接。我只是重读了一遍。如果结构运行时为每个客户端调用创建多个实例或为每个分区创建一个单例实例,它没有提及任何地方。
-
Service Fabric 不为每个客户端请求创建 StatefuleService 类的新实例,而不是为每个副本创建一个实例。要尝试它,您应该创建 5 个节点集群并将 TargetReplicaSetSize 和 MinReplicaSetSize 指定为 5(那么您总共将拥有 5x5=25 个副本)。另请注意,默认情况下辅助副本不做任何工作,即监听端点(您应该明确指定),默认情况下所有客户端类将始终联系 primary 副本。
标签: azure-service-fabric service-fabric-stateful