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

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

我有服务。它向第 3 方 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 时,您必须迭代所有副本\实例。
  • 如上所述,仅考虑处于就绪状态的副本。我没有考虑处于其他状态的实例,例如“InBuild”“Deleting”等。

关于c# - 如何获取 Service Fabric 微服务的实例数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53500531/

相关文章:

c# - 使用 ASP.Net 中的 SOAP API 将购物车项目发送到 Paypal

c# - NET CF 上的线程安全调用

c# - 如何根据许多选项确定 VAR?

Azure CLI - 如何更新磁盘加密设置

c# - dotnet 程序中的 Azure.Identity.CredentialUnavailableException

azure - 无服务器框架为 Azure Functions 提供了什么?

c# - 反射:调用方法,传递委托(delegate)作为参数

c# - 更改winform应用程序中所有表单的背景颜色

c# - 将 ASP.NET 应用程序移植到 Linux 下的 Mono/Apache

.net - .NET 的 FTP 客户端类