Как получить количество экземпляров микросервисов Service Fabric? - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть сервис.Делает запрос к стороннему API.Поскольку этот API установил количество запросов в секунду, мне нужно установить ограничения для моих запросов.

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

У меня есть эта конфигурация.«-1» означает максимальную доступную сумму, если я не ошибаюсь.

Как я могу получить количество экземпляров «MyService»?Должен ли я также подсчитать количество разделов, чтобы получить реальное количество экземпляров?

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Проще говоря, это просто получение количества разделов, умноженного на количество выделенных реплик (с состоянием) или экземпляров (без сохранения состояния), которые имеет служба:

В вашем случае вы устанавливаете количество экземпляров на -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();
}

Сценарии вышедолжен работать для Stateful и Stateless.

Есть несколько предостережений:

  • Службы с сохранением состояния имеют концепцию первичного и вторичного, если вы не обрабатываете запросы во вторичном, вы должны рассмотретьтолько количество разделов (которое будет таким же, как количество первичных реплик)
  • Не принимайте число узлов в качестве количества экземпляров, когда установлено -1, SF поместит сервисы только в узелесли узел доступен для этой реплики, это означает:
    • , если узел не отключен, реплика \ экземпляр не будет размещена на отключенных узлах
    • , если узел hкак отсутствие емкости для реплики
    • , если у службы есть ограничения на размещение
    • , если служба указана в блоке, указанном в узле
  • На основе вышеуказанных правилтакже не учитывайте InstanceCount, поскольку SF может не иметь возможности разместить количество запрошенных реплик.А когда значение InstanceCount равно -1, необходимо выполнить итерацию всех реплик \ экземпляров.
  • Как отмечалось выше, рассматривать только реплики в состоянии готовности.Я не принимаю во внимание случаи нахождения в другом статусе, например, «InBuild», «Удаление» и т. Д.
0 голосов
/ 27 ноября 2018

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