繁体   English   中英

如何获取Service Fabric微服务的实例数?

[英]How to get instance count of Service Fabric microservices?

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

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

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

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

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

在您的情况下,将实例计数设置为-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();
}

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

有一些警告:

  • 有状态服务具有主服务器和辅助服务器的概念,如果您不处理辅助服务器中的请求,则应仅考虑分区数(与主副本的数目相同)
  • 当设置为-1时,不要以节点数为实例数,仅当该节点可用于该副本时,SF才会将服务放置在该节点中,这意味着:
    • 如果未禁用该节点,则不会在禁用的节点上分配副本\\实例
    • 如果该节点没有副本空间
    • 如果服务有放置限制
    • 如果服务是在节点中列出的阻止
  • 根据上述规则,也不要考虑InstanceCount,因为SF可能无法放置请求的副本数。 并且当InstanceCount为-1​​时,您必须迭代所有副本\\ instances。
  • 如上所述,仅考虑处于就绪状态的副本。 我没有考虑处于其他状态(例如“正在构建”,“正在删除”等)的实例。

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM