具有 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 节点群集上不起作用

单个节点上的 Service Fabric 无状态服务部署

Service Fabric 中的 actorevent 都有哪些限制?

如何重新启动 Service Fabric 规模集计算机

Service Fabric 证书交换。应用程序无法激活