具有 5 个节点的 Service Fabric 本地开发集群运行的实例和分区少于预期
Posted
技术标签:
【中文标题】具有 5 个节点的 Service Fabric 本地开发集群运行的实例和分区少于预期【英文标题】:Service Fabric local development cluster with 5 nodes runs less instances and less partitions than expected 【发布时间】:2019-04-28 15:26:48 【问题描述】:我正在本地开发集群上运行 Service Fabric 应用程序,在我的 PC 上“模拟”了 5 个节点。
应用程序有一个公共 API 无状态服务,实例计数设置为 -1。
我希望在 Service Fabric Explorer 中看到 5 个无状态服务实例,但我只看到 1 个。
该应用程序还有一个参与者服务,其分区计数设置为 10(由 Visual Studio 自动生成的配置)。
当应用程序部署到我的 PC 上的开发集群时,Service Fabric Explorer 中只能看到一个分区。在我模拟了一个“大”负载并且我的 PC 的 CPU 和内存使用率大约在 90% 以上之后,仍然只有一个演员服务分区。 我创建了一个有状态服务,将分区计数设置为 5,以检查我的环境是否有问题,但它按预期运行。
这对于无状态服务是正常的还是我的配置有问题。此行为是否特定于开发集群,设置为避免端口冲突之类的事情。
演员服务怎么样。根据docs,动态分区缩放是可能的,但即使在高负载期间,actor 服务的分区数量也不会增加。此外,Actor 文档中没有提到动态分区缩放。
Related
提前致谢!
编辑:经过一些不同配置的测试后,我得到了它的工作。
ApplicaitonManifest.xml中的原始配置:
<Parameters>
...
<Parameter Name="HttpAPI_InstanceCount" DefaultValue="-1" />
<Parameter Name="SystemStatusConsumerActorService_PartitionCount"
DefaultValue="10" />
...
</Parameters>
<DefaultServices>
<Service Name="HttpAPI">
<StatelessService ServiceTypeName="HttpAPIType"
InstanceCount="[HttpAPI_InstanceCount]">
<SingletonPartition />
</StatelessService>
</Service>
<Service Name="SystemStatusConsumerActorService"
GeneratedIdRef="faad4d24-04db-4e06-8a1d-22bc6255c7fe|Persisted">
<StatefulService ServiceTypeName="SystemStatusConsumerActorServiceType" TargetReplicaSetSize="SystemStatusConsumerActorService_TargetReplicaSetSize]" MinReplicaSetSize="[SystemStatusConsumerActorService_MinReplicaSetSize]">
<UniformInt64Partition
PartitionCount="[SystemStatusConsumerActorService_PartitionCount]"
LowKey="-9223372036854775808"
HighKey="9223372036854775807" />
</StatefulService>
</Service>
</DefaultServices>
有效的配置:
<Parameters>
...
<Parameter Name="HttpAPIInstanceCount" DefaultValue="-1" />
<Parameter Name="SystemStatusConsumerActorServicePartitionCount"
DefaultValue="10" />
...
</Parameters>
<DefaultServices>
<Service Name="HttpAPI">
<StatelessService ServiceTypeName="HttpAPIType"
InstanceCount="[HttpAPIInstanceCount]">
<SingletonPartition />
</StatelessService>
</Service>
<Service Name="SystemStatusConsumerActorService"
GeneratedIdRef="faad4d24-04db-4e06-8a1d-22bc6255c7fe|Persisted">
<StatefulService ServiceTypeName="SystemStatusConsumerActorServiceType" TargetReplicaSetSize="SystemStatusConsumerActorService_TargetReplicaSetSize]" MinReplicaSetSize="[SystemStatusConsumerActorService_MinReplicaSetSize]">
<UniformInt64Partition
PartitionCount="[SystemStatusConsumerActorServicePartitionCount]"
LowKey="-9223372036854775808"
HighKey="9223372036854775807" />
</StatefulService>
</Service>
</DefaultServices>
请注意,唯一的区别是参数名称:
HttpAPI_InstanceCount
改为
HttpAPIInstanceCount
SystemStatusConsumerActorService_PartitionCount
改为
SystemStatusConsumerActorServicePartitionCount
【问题讨论】:
这是正常的。本地开发集群上的无状态和参与者服务实例将始终是一个实例。对于无状态,这是由于端口冲突而发生的。您只为无状态定义 1 个端口,fabric 不能使用单个端口号打开 5 个实例。对于 actor,fabric 内部只有 1 个应用程序域 [exe] 用于多个分区。这是为了能够快速激活演员。但是,您可以使用“new ActorId()”解析单个参与者分区。 @teeboy 对于无状态服务定义端点端口没有严格要求。您可以删除端口值,Service Fabric 将自动分配端口 - 因此您将拥有多个无状态服务实例。 【参考方案1】:在尝试了很多不同的配置后,仍然存在问题。我在检查我的项目的 git diff 后找到了它。
我的问题是 ApplicationManifest 参数在 Service Fabric 应用程序文件夹中的 ApplicatonParameters\Local.5Node.xml(因为我使用 5 节点本地集群)文件中被覆盖。
棘手的部分是,即使我删除或评论了 SystemStatusConsumerActorService_PartitionCount 的覆盖,工作室也会在我每次构建应用程序时添加一个。唯一的解决方案是更改 ApplicationManifest.xml 中的参数名称。
根据新事实更改配置后,无状态服务和参与者服务分别以所需数量的实例和分区开始。
当然,五个无状态实例中有 4 个中断,但考虑到集群在一台机器上“运行”,这是完全合乎逻辑的。
【讨论】:
您可以从ApplicationManifest.xml
中的服务声明中删除端口规范,以允许服务结构为您分配端口(这样您就可以拥有多个正在运行的实例)。
还有一个问题 - 您是否尝试过更改 Local.5Node.xml
中的参数值?
是的,我更改了 Local.5Node.xml 文件中的值,它也可以工作。我还从服务配置文件中删除了端口。现在我通过反向代理访问服务,它也起到负载均衡器的作用,或者至少将请求重定向到无状态服务的随机实例。
是的,这是正确的。对于无状态服务,反向代理会将请求重定向到随机实例,在有状态服务的情况下,默认反向代理会将所有请求重定向到主副本。以上是关于具有 5 个节点的 Service Fabric 本地开发集群运行的实例和分区少于预期的主要内容,如果未能解决你的问题,请参考以下文章
Service Fabric - 无法进行配置升级以添加或删除节点
使用反向代理 localhost 在 Azure Service Fabric 中的 5 节点群集上不起作用