1

我在本地开发集群上运行 Service Fabric 应用程序,在我的 PC 上“模拟”了 5 个节点。

该应用程序有一个公共 API 无状态服务,实例计数设置为 -1。

我希望在 Service Fabric Explorer 中看到 5 个无状态服务实例,但我只看到 1 个。

该应用程序还有一个参与者服务,其分区计数设置为 10(由 Visual Studio 自动生成的配置)。

当应用程序部署到我的 PC 上的开发集群时,Service Fabric Explorer 中只能看到一个分区。在我模拟“大”负载并且我的 PC 的 CPU 和内存使用率在 90% 左右或以上之后,仍然只有一个演员服务分区。我创建了一个有状态服务,将分区计数设置为 5,以检查我的环境是否有问题,但它按预期运行。

这对于无状态服务是正常的还是我的配置有问题。此行为是否特定于开发集群,设置为避免端口冲突之类的事情。

演员服务怎么样。根据文档动态分区缩放是可能的,但是即使在高负载期间,actor服务的分区数量也不会增加。此外,Actor 文档中没有提到动态分区缩放。

有关的

提前致谢!

编辑:经过一些不同配置的测试后,我得到了它的工作。

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

4

1 回答 1

1

在尝试了很多不同的配置后,仍然存在问题。我在检查我的项目的 git diff 后找到了它。

我的问题是 ApplicationManifest 参数在 Service Fabric 应用程序文件夹中的 ApplicatonParameters\Local.5Node.xml (因为我使用 5 节点本地集群)文件中被覆盖。

棘手的部分是,即使我删除或评论了 SystemStatusConsumerActorService_PartitionCount 的覆盖,工作室也会在我每次构建应用程序时添加一个。唯一的解决方案是更改 ApplicationManifest.xml 中的参数名称。

根据新事实更改配置后,无状态服务和参与者服务分别以所需数量的实例和分区开始。

当然,五个无状态实例中有 4 个中断,但考虑到集群在一台机器上“运行”,这是完全合乎逻辑的。

于 2018-11-27T09:30:19.877 回答