代码之家  ›  专栏  ›  技术社区  ›  demo

如何获取服务结构微服务的实例数?

  •  0
  • demo  · 技术社区  · 7 年前

    我有服务。它向第三方API发出请求。由于该API设置了每秒的请求量,因此我需要设置请求的限制。

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

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

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

    2 回复  |  直到 7 年前
        1
  •  3
  •   Diego Mendes    7 年前

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

    在本例中,您将实例计数设置为-1,假设节点数为3,则数学公式为:

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

    $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();
    }
    

    有一些警告:

    • 设置-1时,不要假设节点计数为实例数,只有当节点可用于该副本时,SF才会将服务放置在节点中,这意味着:
      • 如果未禁用该节点,则不会在禁用的节点上分配副本\实例
      • 如果节点没有复制副本的容量
    • 基于上面的规则,也不要考虑StaseCuNoT,因为SF可能无法放置请求的副本数量。当InstanceCount为-1时,必须迭代所有副本\实例。
    • 如上所述,只考虑就绪状态下的副本。我不考虑处于其他状态的实例,如“InBuild”“Deleting”等。
        2
  •  0
  •   Peter Bons    7 年前

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

    如果希望以编程方式执行此操作,请尝试 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);