Introdução aos grupos de aplicativos

O Gerenciador de Recursos de Cluster do Service Fabric normalmente gerencia recursos de cluster distribuindo a carga (representada por meio de métricas) uniformemente por todo o cluster. O Service Fabric gerencia a capacidade dos nós no cluster e no cluster como um todo por meio da capacidade. As métricas e a capacidade funcionam muito bem para muitas cargas de trabalho, mas os padrões que fazem uso intenso de diferentes instâncias de aplicativos do Service Fabric às vezes trazem requisitos adicionais. Por exemplo, você pode querer:

  • Reservar alguma capacidade nos nós do cluster para os serviços dentro de alguma instância de aplicativo nomeada
  • Limitar o número total de nós em que os serviços dentro de uma instância de aplicativo nomeada são executados (em vez de distribuí-los por todo o cluster)
  • Definir capacidades na própria instância do aplicativo nomeado para limitar o número de serviços ou o consumo total de recursos dos serviços dentro dela

Para atender a esses requisitos, o Gerenciador de Recursos de Cluster do Service Fabric oferece suporte a um recurso chamado Grupos de Aplicativos.

Limitando o número máximo de nós

O caso de uso mais simples para a capacidade do aplicativo é quando uma instância do aplicativo precisa ser limitada a um determinado número máximo de nós. Isso consolida todos os serviços dentro dessa instância de aplicativo em um número definido de máquinas. A consolidação é útil quando você está tentando prever ou limitar o uso de recursos físicos pelos serviços dentro dessa instância de aplicativo nomeada.

A imagem a seguir mostra uma instância de aplicativo com e sem um número máximo de nós definidos:

Instância do aplicativo definindo o número máximo de nós

No exemplo à esquerda, o aplicativo não tem um número máximo de nós definidos e tem três serviços. O Gerenciador de Recursos de Cluster distribuiu todas as réplicas em seis nós disponíveis para obter o melhor equilíbrio no cluster (o comportamento padrão). No exemplo certo, vemos a mesma aplicação limitada a três nós.

O parâmetro que controla esse comportamento é chamado MaximumNodes. Esse parâmetro pode ser definido durante a criação do aplicativo ou atualizado para uma instância do aplicativo que já estava em execução.

PowerShell

New-ServiceFabricApplication -ApplicationName fabric:/AppName -ApplicationTypeName AppType1 -ApplicationTypeVersion 1.0.0.0 -MaximumNodes 3
Update-ServiceFabricApplication –ApplicationName fabric:/AppName –MaximumNodes 5

C#

ApplicationDescription ad = new ApplicationDescription();
ad.ApplicationName = new Uri("fabric:/AppName");
ad.ApplicationTypeName = "AppType1";
ad.ApplicationTypeVersion = "1.0.0.0";
ad.MaximumNodes = 3;
await fc.ApplicationManager.CreateApplicationAsync(ad);

ApplicationUpdateDescription adUpdate = new ApplicationUpdateDescription(new Uri("fabric:/AppName"));
adUpdate.MaximumNodes = 5;
await fc.ApplicationManager.UpdateApplicationAsync(adUpdate);

Dentro do conjunto de nós, o Gerenciador de Recursos de Cluster não garante quais objetos de serviço são colocados juntos ou quais nós são usados.

Métricas, carga e capacidade do aplicativo

Os Grupos de Aplicativos também permitem definir métricas associadas a uma determinada instância de aplicativo nomeada e a capacidade dessa instância de aplicativo para essas métricas. As métricas do aplicativo permitem rastrear, reservar e limitar o consumo de recursos dos serviços dentro dessa instância do aplicativo.

Para cada métrica de aplicativo, há dois valores que podem ser definidos:

  • Capacidade total do aplicativo – Esta configuração representa a capacidade total do aplicativo para uma métrica específica. O Gerenciador de Recursos de Cluster não permite a criação de novos serviços nessa instância de aplicativo que fariam com que a carga total excedesse esse valor. Por exemplo, digamos que a instância do aplicativo tinha uma capacidade de 10 e já tinha carga de cinco. A criação de um serviço com uma carga padrão total de 10 seria desautorizada.
  • Capacidade máxima do nó – Esta configuração especifica a carga total máxima para o aplicativo em um único nó. Se a carga ultrapassar essa capacidade, o Gerenciador de Recursos de Cluster moverá réplicas para outros nós para que a carga diminua.

PowerShell:

New-ServiceFabricApplication -ApplicationName fabric:/AppName -ApplicationTypeName AppType1 -ApplicationTypeVersion 1.0.0.0 -Metrics @("MetricName:Metric1,MaximumNodeCapacity:100,MaximumApplicationCapacity:1000")

C#:

ApplicationDescription ad = new ApplicationDescription();
ad.ApplicationName = new Uri("fabric:/AppName");
ad.ApplicationTypeName = "AppType1";
ad.ApplicationTypeVersion = "1.0.0.0";

var appMetric = new ApplicationMetricDescription();
appMetric.Name = "Metric1";
appMetric.TotalApplicationCapacity = 1000;
appMetric.MaximumNodeCapacity = 100;
ad.Metrics.Add(appMetric);
await fc.ApplicationManager.CreateApplicationAsync(ad);

Reserva de capacidade

Outro uso comum para grupos de aplicativos é garantir que os recursos dentro do cluster sejam reservados para uma determinada instância de aplicativo. O espaço é sempre reservado quando a instância do aplicativo é criada.

A reserva de espaço no cluster para o aplicativo acontece imediatamente, mesmo quando:

  • A instância do aplicativo foi criada, mas ainda não tem nenhum serviço dentro dela
  • O número de serviços dentro da instância do aplicativo muda sempre
  • os serviços existem, mas não consomem os recursos

Reservar recursos para uma instância de aplicativo requer a especificação de dois parâmetros adicionais: MinimumNodes e NodeReservationCapacity

  • MinimumNodes - Define o número mínimo de nós em que a instância do aplicativo deve ser executada.
  • NodeReservationCapacity - Esta configuração é por métrica para o aplicativo. O valor é a quantidade dessa métrica reservada para o aplicativo em qualquer nó onde os serviços nesse aplicativo são executados.

A combinação de MinimumNodes e NodeReservationCapacity garante uma reserva de carga mínima para o aplicativo dentro do cluster. Se houver menos capacidade restante no cluster do que a reserva total necessária, a criação do aplicativo falhará.

Vejamos um exemplo de reserva de capacidade:

Instâncias de aplicativo definindo capacidade reservada

No exemplo à esquerda, os aplicativos não têm nenhuma capacidade de aplicativo definida. O Gerenciador de Recursos de Cluster equilibra tudo de acordo com as regras normais.

No exemplo à direita, digamos que Application1 foi criado com as seguintes configurações:

  • MinimumNodes definido como dois
  • Uma métrica de aplicativo definida com
    • NodeReservationCapacidade de 20

PowerShell

New-ServiceFabricApplication -ApplicationName fabric:/AppName -ApplicationTypeName AppType1 -ApplicationTypeVersion 1.0.0.0 -MinimumNodes 2 -Metrics @("MetricName:Metric1,NodeReservationCapacity:20")

C#

ApplicationDescription ad = new ApplicationDescription();
ad.ApplicationName = new Uri("fabric:/AppName");
ad.ApplicationTypeName = "AppType1";
ad.ApplicationTypeVersion = "1.0.0.0";
ad.MinimumNodes = 2;

var appMetric = new ApplicationMetricDescription();
appMetric.Name = "Metric1";
appMetric.NodeReservationCapacity = 20;

ad.Metrics.Add(appMetric);

await fc.ApplicationManager.CreateApplicationAsync(ad);

O Service Fabric reserva capacidade em dois nós para o Aplicativo1 e não permite que os serviços do Aplicativo2 consumam essa capacidade, mesmo que não haja carga sendo consumida pelos serviços dentro do Aplicativo1 no momento. Essa capacidade de aplicativo reservada é considerada consumida e conta em relação à capacidade restante nesse nó e dentro do cluster. A reserva é deduzida da capacidade restante do cluster imediatamente, no entanto, o consumo reservado é deduzido da capacidade de um nó específico somente quando pelo menos um objeto de serviço é colocado nele. Essa reserva posterior permite flexibilidade e melhor utilização de recursos, uma vez que os recursos são reservados apenas nos nós quando necessário.

Obtendo as informações de carga do aplicativo

Para cada aplicativo que tem uma Capacidade de Aplicativo definida para uma ou mais métricas, você pode obter as informações sobre a carga agregada relatada por réplicas de seus serviços.

PowerShell:

Get-ServiceFabricApplicationLoadInformation –ApplicationName fabric:/MyApplication1

C#

var v = await fc.QueryManager.GetApplicationLoadInformationAsync("fabric:/MyApplication1");
var metrics = v.ApplicationLoadMetricInformation;
foreach (ApplicationLoadMetricInformation metric in metrics)
{
    Console.WriteLine(metric.ApplicationCapacity);  //total capacity for this metric in this application instance
    Console.WriteLine(metric.ReservationCapacity);  //reserved capacity for this metric in this application instance
    Console.WriteLine(metric.ApplicationLoad);  //current load for this metric in this application instance
}

A consulta ApplicationLoad retorna as informações básicas sobre a capacidade do aplicativo que foi especificada para o aplicativo. Essas informações incluem as informações de Nós Mínimos e Nós Máximos e o número que o aplicativo está ocupando no momento. Ele também inclui informações sobre cada métrica de carga do aplicativo, incluindo:

  • Nome da métrica: Nome da métrica.
  • Capacidade de Reserva: Capacidade de Cluster reservada no cluster para esta Aplicação.
  • Carga do aplicativo: carga total das réplicas filhas deste aplicativo.
  • Capacidade de Aplicação: Valor máximo permitido de Carga de Aplicação.

Removendo a capacidade do aplicativo

Depois que os parâmetros de Capacidade do Aplicativo forem definidos para um aplicativo, eles poderão ser removidos usando APIs de Aplicativo de Atualização ou cmdlets do PowerShell. Por exemplo:

Update-ServiceFabricApplication –Name fabric:/MyApplication1 –RemoveApplicationCapacity

Este comando remove todos os parâmetros de gerenciamento de capacidade do aplicativo da instância do aplicativo. Isso inclui MinimumNodes, MaximumNodes, e as métricas do aplicativo, se houver. O efeito do comando é imediato. Após a conclusão desse comando, o Gerenciador de Recursos de Cluster usa o comportamento padrão para gerenciar aplicativos. Os parâmetros de capacidade do aplicativo podem ser especificados novamente via Update-ServiceFabricApplication/System.Fabric.FabricClient.ApplicationManagementClient.UpdateApplicationAsync().

Restrições à capacidade de aplicação

Existem várias restrições nos parâmetros de Capacidade de Aplicação que devem ser respeitadas. Se houver erros de validação, não haverá alterações.

  • Todos os parâmetros inteiros devem ser números não negativos.
  • MinimumNodes nunca deve ser maior que MaximumNodes.
  • Se as capacidades para uma métrica de carga forem definidas, elas devem seguir estas regras:
    • A Capacidade de Reserva do Nó não deve ser superior à Capacidade Máxima do Nó. Por exemplo, não é possível limitar a capacidade da métrica "CPU" no nó a duas unidades e tentar reservar três unidades em cada nó.
    • Se MaximumNodes for especificado, o produto de MaximumNodes e Maximum Node Capacity não deverá ser maior que Total Application Capacity. Por exemplo, digamos que a Capacidade Máxima do Nó para a métrica de carga "CPU" esteja definida como oito. Digamos também que você defina os nós máximos como 10. Nesse caso, a Capacidade Total do Aplicativo deve ser maior que 80 para essa métrica de carga.

As restrições são aplicadas durante a criação e as atualizações do aplicativo.

Como não usar a capacidade do aplicativo

  • Não tente usar os recursos do Grupo de Aplicativos para restringir o aplicativo a um subconjunto específico de nós. Em outras palavras, você pode especificar que o aplicativo seja executado em no máximo cinco nós, mas não em quais cinco nós específicos no cluster. Restringir um aplicativo a nós específicos pode ser alcançado usando restrições de posicionamento para serviços.
  • Não tente usar a capacidade do aplicativo para garantir que dois serviços do mesmo aplicativo sejam colocados nos mesmos nós. Em vez disso, use restrições de afinidade ou posicionamento.

Próximos passos