【问题标题】:How to get instance count of Service Fabric microservices?如何获取 Service Fabric 微服务的实例数?
【发布时间】:2019-04-29 05:51:56
【问题描述】:

我有服务。它向 3rd-party API 发出请求。由于该 API 设置了每秒的请求数量,我需要为我的请求设置限制。

<DefaultServices>
    <Service Name="MyService">
      <StatelessService ServiceTypeName="MyService" InstanceCount="-1">
        <UniformInt64Partition PartitionCount="5" LowKey="0" HighKey="5" />
      </StatelessService>
    </Service>
  </DefaultServices>

我有这个配置。如果我没记错的话,“-1”表示最大可用数量。

如何获取“MyService”实例的数量?我是否还应该计算分区数量以获得实际实例数量?

【问题讨论】:

标签: c# .net azure microservices azure-service-fabric


【解决方案1】:

简单来说,就是将分区的数量乘以服务拥有的已分配副本(有状态)或实例(无状态)的数量:

在您的情况下,您将实例计数设置为 -1,假设节点数为 3,那么数学将是:

3(instances) * 5(partitions) = 15 (instances)

使用 PowerShell

$instances =  0
foreach ($partition in Get-ServiceFabricPartition -ServiceName "fabric:/AppName/ServiceName") {
   foreach ($replica in Get-ServiceFabricReplica -PartitionId $partition.PartitionId) 
   {
        if($replica.ReplicaStatus -eq 'Ready'){
            $instances++ 
        }
   }
}
echo $instances

使用 FabricClient:

int instances = 0;
var fabricClient = new FabricClient();
var partitions = await fabricClient.QueryManager.GetPartitionListAsync(new Uri("fabric:/AppName/ServiceName"));
foreach (var partition in partitions)
{
    instances += (await fabricClient.QueryManager.GetReplicaListAsync(partition.PartitionInformation.Id)).Where(r => r.ReplicaStatus == ServiceReplicaStatus.Ready).Count();
}

上面的脚本应该适用于有状态和无状态。

有一些注意事项:

  • 有状态的服务有primary和secondary的概念,如果不处理secondary的请求,只考虑分区数(与primary副本数相同)
  • 当设置-1时,不要假设节点计数为实例数,只有当节点可用于该副本时,SF才会将服务放置在节点中,这意味着:
    • 如果节点未禁用,则不会在禁用节点上分配副本\实例
    • 如果节点没有副本容量
    • 如果服务有放置限制
    • 如果服务是在节点中列出的块
  • 根据上述规则,也不要考虑 InstanceCount,因为 SF 可能无法放置请求的副本数量。而当 InstanceCount 为 -1 时,您必须迭代所有副本\实例。
  • 如上所述,仅考虑处于就绪状态的副本。我没有考虑处于其他状态的实例,例如“InBuild”、“Deleting”等。

【讨论】:

    【解决方案2】:

    InstanceCount 为 -1 表示服务的实例正在集群中的每个节点上运行。因此,一个 5 节点集群将运行 5 个 MyService 实例,每个节点上都有一个。无状态服务没有分区(嗯,只有一个,SingletonPartition

    所以,获取实例的数量你可以只看InstanceCount的值。如果是 -1 则为节点数,否则为实例数。

    如果你想以编程方式尝试这个 FabricClient 类:

    var fabricClient = new FabricClient();
    var partitions = await fabricClient.QueryManager.GetPartitionListAsync(new Uri("fabric:/Application2/Stateless1"));
    var singletonPartition = (StatelessServicePartition)partitions.First(); // stateless service has just one partition
    Console.WriteLine(singletonPartition.InstanceCount);
    

    【讨论】:

      猜你喜欢
      • 2016-08-15
      • 2018-06-23
      • 2016-04-07
      • 2019-09-10
      • 2020-01-27
      • 2020-10-24
      • 2017-12-15
      • 2018-10-19
      • 1970-01-01
      相关资源
      最近更新 更多