我有服务。它向第三方API发出请求。由于该API设置了每秒的请求数量,因此我需要为我的请求设置限制。
<DefaultServices>
<Service Name="MyService">
<StatelessService ServiceTypeName="MyService" InstanceCount="-1">
<UniformInt64Partition PartitionCount="5" LowKey="0" HighKey="5" />
</StatelessService>
</Service>
</DefaultServices>
我有此配置。 “ -1”表示我没记错的最大可用金额。
如何获取“ MyService”实例的数量?我还应该计算分区数量以获得实际数量吗?
答案 0 :(得分: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();
}
以上脚本应适用于有状态和无状态
有一些警告:
答案 1 :(得分:0)
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);