Introduzione ai gruppi di applicazioniIntroduction to Application Groups

Cluster Resource Manager di Service Fabric generalmente gestisce le risorse del cluster distribuendo il carico (rappresentato tramite Metriche) in modo uniforme nell'intero cluster.Service Fabric's Cluster Resource Manager typically manages cluster resources by spreading the load (represented via Metrics) evenly throughout the cluster. Service Fabric gestisce la capacità dei nodi del cluster e il cluster nel suo complesso tramite la capacità.Service Fabric manages the capacity of the nodes in the cluster and the cluster as a whole via capacity. Metriche e capacità rappresentano un'ottima soluzione per molti tipi di carichi di lavoro, ma i modelli che fanno largo uso di diverse istanze di applicazione di Service Fabric comportano a volte requisiti aggiuntivi.Metrics and capacity work great for many workloads, but patterns that make heavy use of different Service Fabric Application Instances sometimes bring in additional requirements. Ad esempio, si può desiderare di:For example you may want to:

  • Riservare alcune capacità sui nodi del cluster per i servizi all'interno di qualche istanza di applicazione denominataReserve some capacity on the nodes in the cluster for the services within some named application instance
  • Limitare il numero totale di nodi eseguiti dai servizi all'interno di un'istanza dell'applicazione denominata (anziché distribuirli tramite l'intero cluster)Limit the total number of nodes that the services within a named application instance run on (instead of spreading them out over the entire cluster)
  • Definire le capacità nell'istanza di applicazione stessa denominata per limitare il numero di servizi o il consumo totale delle risorse dei servizi al suo internoDefine capacities on the named application instance itself to limit the number of services or total resource consumption of the services inside it

Per soddisfare questi requisiti, Cluster Resource Manager di Service Fabric supporta una funzionalità chiamata Gruppi di applicazioni.To meet these requirements, the Service Fabric Cluster Resource Manager supports a feature called Application Groups.

Limitazione del numero massimo di nodiLimiting the maximum number of nodes

Il caso d'uso più semplice della capacità dell'applicazione è quando un'istanza di applicazione deve essere limitata a un numero massimo di nodi.The simplest use case for Application capacity is when an application instance needs to be limited to a certain maximum number of nodes. Consolida tutti i servizi all'interno di tale istanza dell'applicazione su un numero di set di macchine.This consolidates all services within that application instance onto a set number of machines. Il consolidamento è utile quando si sta cercando di stimare o limitare l'utilizzo delle risorse fisiche da parte dei servizi all'interno di tale istanza dell'applicazione denominata.Consolidation is useful when you're trying to predict or cap physical resource use by the services within that named application instance.

Nell'immagine seguente è mostrata un'istanza di applicazione con e senza un numero massimo di nodi definiti.The following image shows an application instance with and without a maximum number of nodes defined:

Istanza di applicazione che definisce il numero massimo di nodi
Application Instance Defining Maximum Number of Nodes

Nell'esempio a sinistra, l'applicazione non ha un numero massimo di nodi definito, e ha tre servizi.In the left example, the application doesn’t have a maximum number of nodes defined, and it has three services. Cluster Resource Manager ha distribuito tutte le repliche tra sei nodi disponibili per ottenere il bilanciamento ottimale nel cluster (il comportamento predefinito).The Cluster Resource Manager has spread out all replicas across six available nodes to achieve the best balance in the cluster (the default behavior). Nell'esempio a destra, notiamo la stessa applicazione limitata a tre nodi.In the right example, we see the same application limited to three nodes.

Il parametro che gestisce questo comportamento è denominato MaximumNodes.The parameter that controls this behavior is called MaximumNodes. Questo parametro può essere impostato durante la creazione dell'applicazione oppure può essere aggiornato per un'istanza di applicazione già in esecuzione.This parameter can be set during application creation, or updated for an application instance that was already running.

PowerShellPowershell

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

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

All'interno del set di nodi, Cluster Resource Manager non garantisce quali oggetti di servizio si posizionano insieme o quali nodi vengono usati.Within the set of nodes, the Cluster Resource Manager doesn't guarantee which service objects get placed together or which nodes get used.

Metriche, carico e capacità dell'applicazioneApplication Metrics, Load, and Capacity

I gruppi di applicazioni consentono anche di definire le metriche associate a una determinata istanza di applicazione denominata, nonché la capacità di quell'istanza dell'applicazione in relazione a tali metriche.Application Groups also allow you to define metrics associated with a given named application instance, and that application instance's capacity for those metrics. Le metriche dell'applicazione consentono di tener traccia del consumo di risorse da parte dei servizi all'interno dell'istanza di applicazione, di riservarlo e di limitarlo.Application metrics allow you to track, reserve, and limit the resource consumption of the services inside that application instance.

Per ogni metrica di applicazione, è possibile impostare due valori:For each application metric, there are two values that can be set:

  • Capacità totale dell'applicazione: rappresenta la capacità totale dell'applicazione per una particolare metrica.Total Application Capacity – This setting represents the total capacity of the application for a particular metric. Cluster Resource Manager impedisce di creare nuovi servizi all'interno dell'istanza di applicazione che farebbero superare questo valore di carico totale.The Cluster Resource Manager disallows the creation of any new services within this application instance that would cause total load to exceed this value. Si supponga, ad esempio, che l'istanza di applicazione abbia una capacità pari a 10 e il carico sia già pari a cinque.For example, let's say the application instance had a capacity of 10 and already had load of five. La creazione di un servizio con un carico totale predefinito di 10 non verrebbe consentita.The creation of a service with a total default load of 10 would be disallowed.
  • Capacità massima del nodo: specifica il carico totale massimo per l'applicazione in un singolo nodo.Maximum Node Capacity – This setting specifies the maximum total load for the application on a single node. Se il carico supera questa capacità, Cluster Resource Manager sposta le repliche in altri nodi in modo che il carico diminuisca.If load goes over this capacity, the Cluster Resource Manager moves replicas to other nodes so that the load decreases.

Powershell:Powershell:

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

C#: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);

Riserva della capacitàReserving Capacity

I gruppi di applicazioni vengono comunemente usati anche per garantire che le risorse all'interno del cluster siano riservate per una determinata istanza di applicazione.Another common use for application groups is to ensure that resources within the cluster are reserved for a given application instance. Lo spazio viene riservato sempre quando viene creata l'istanza dell'applicazione.The space is always reserved when the application instance is created.

La riserva dello spazio nel cluster per l'applicazione si verifica immediatamente, anche se:Reserving space in the cluster for the application happens immediately even when:

  • l'istanza dell'applicazione viene creata ma non dispone ancora di tutti i servizi all'interno di essathe application instance is created but doesn't have any services within it yet
  • il numero di servizi all'interno dell'istanza dell'applicazione cambia ogni voltathe number of services within the application instance changes every time
  • i servizi esistono ma non usano le risorsethe services exist but aren't consuming the resources

Per prenotare le risorse per un'istanza dell'applicazione è necessario definire due parametri aggiuntivi: MinimumNodes e NodeReservationCapacityReserving resources for an application instance requires specifying two additional parameters: MinimumNodes and NodeReservationCapacity

  • MinimumNodes: definisce il numero minimo di nodi con cui l'istanza dell'applicazione deve essere eseguita.MinimumNodes - Defines the minimum number of nodes that the application instance should run on.
  • NodeReservationCapacity: questa impostazione è per ogni metrica per l'applicazione.NodeReservationCapacity - This setting is per metric for the application. Il valore è la quantità di tale metrica riservata per l'applicazione su ogni nodo in cui si eseguono i servizi dell'applicazione.The value is the amount of that metric reserved for the application on any node where that the services in that application run.

La combinazione di MinimumNodes e NodeReservationCapacity garantisce una riserva minima del carico per l'applicazione all'interno del cluster.Combining MinimumNodes and NodeReservationCapacity guarantees a minimum load reservation for the application within the cluster. Se si ha meno capacità rimanente nel cluster rispetto al totale della riserva richiesta, la creazione dell'applicazione ha esito negativo.If there's less remaining capacity in the cluster than the total reservation required, creation of the application fails.

Di seguito viene illustrato un esempio di come viene riservata la capacità:Let's look at an example of capacity reservation:

Istanze di applicazione che definiscono la capacità riservata
Application Instances Defining Reserved Capacity

Nell'esempio a sinistra, le applicazioni non hanno una capacità definita.In the left example, applications do not have any Application Capacity defined. Cluster Resource Manager bilancia tutti gli elementi in base alle normali regole.The Cluster Resource Manager balances everything according to normal rules.

Nell'esempio a destra, si supponga che Applicazione1 sia stata creata con le impostazioni seguenti:In the example on the right, let's say that Application1 was created with the following settings:

  • MinimumNodes impostato su dueMinimumNodes set to two
  • Una metrica dell'applicazione definita con le impostazioni seguenti:An application Metric defined with
    • NodeReservationCapacity pari a 20NodeReservationCapacity of 20

PowerShellPowershell

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

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

Service Fabric riserva la capacità in due nodi per Applicazione1 e non consente ai servizi da Applicazione2 di usare tale capacità, anche se non sono presenti carichi usati dai servizi all'interno di Applicazione1 al momento.Service Fabric reserves capacity on two nodes for Application1, and doesn't allow services from Application2 to consume that capacity even if there are no load is being consumed by the services inside Application1 at the time. Questa capacità riservata dell'applicazione viene considerata usata e conta a fronte della capacità residua del nodo e del cluster.This reserved application capacity is considered consumed and counts against the remaining capacity on that node and within the cluster. La riserva viene sottratta immediatamente dalla capacità del cluster rimanente, tuttavia il consumo riservato viene sottratto dalla capacità di un nodo specifico solo quando almeno un oggetto del servizio viene posizionato su di esso.The reservation is deducted from the remaining cluster capacity immediately, however the reserved consumption is deducted from the capacity of a specific node only when at least one service object is placed on it. Questa prenotazione successiva consente un utilizzo ottimale delle risorse e flessibilità, dal momento che le risorse sono riservate nei nodi solo quando necessario.This later reservation allows for flexibility and better resource utilization since resources are only reserved on nodes when needed.

Ottenimento delle informazioni sul carico dell'applicazioneObtaining the application load information

Per ogni applicazione con una Capacità dell'applicazione definita per una o più metriche è possibile ottenere le informazioni relative al carico aggregato segnalato dalle repliche dei suoi servizi.For each application that has an Application Capacity defined for one or more metrics you can obtain the information about the aggregate load reported by replicas of its services.

Powershell:Powershell:

Get-ServiceFabricApplicationLoad –ApplicationName fabric:/MyApplication1

C#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
}

La query ApplicationLoad restituisce le informazioni di base sulla capacità dell'applicazione che è stata specificata.The ApplicationLoad query returns the basic information about Application Capacity that was specified for the application. Queste informazioni includono le informazioni sul numero minimo e massimo di nodi e sul numero attualmente occupato dall'applicazione.This information includes the Minimum Nodes and Maximum Nodes info, and the number that the application is currently occupying. Sono inoltre incluse informazioni su ogni metrica di carico dell'applicazione, tra cui:It also includes information about each application load metric, including:

  • Nome della metrica: nome della metrica.Metric Name: Name of the metric.
  • Capacità di prenotazione: capacità riservata nel cluster per questa applicazione.Reservation Capacity: Cluster Capacity that is reserved in the cluster for this Application.
  • Carico dell'applicazione: carico totale delle repliche figlio dell'applicazione.Application Load: Total Load of this Application’s child replicas.
  • Capacità dell'applicazione: valore massimo consentito di carico dell'applicazione.Application Capacity: Maximum permitted value of Application Load.

Rimozione della capacità dell'applicazioneRemoving Application Capacity

Dopo aver impostato i parametri di capacità per un'applicazione, questi parametri possono essere rimossi usando le API di aggiornamento dell'applicazione o i cmdlet PowerShell.Once the Application Capacity parameters are set for an application, they can be removed using Update Application APIs or PowerShell cmdlets. ad esempio:For example:

Update-ServiceFabricApplication –Name fabric:/MyApplication1 –RemoveApplicationCapacity

Questo comando rimuove tutti i parametri di gestione della capacità dall'istanza dell'applicazione.This command removes all Application capacity management parameters from the application instance. Ciò include MinimumNodes, MaximumNodes e le metriche dell'applicazione, se presenti.This includes MinimumNodes, MaximumNodes, and the Application's metrics, if any. L'effetto del comando è immediato.The effect of the command is immediate. Una volta eseguito il comando, Cluster Resource Manager usa il comportamento predefinito per la gestione delle applicazioni.After this command completes, the Cluster Resource Manager uses the default behavior for managing applications. I parametri di capacità dell'applicazione possono essere specificati nuovamente tramite Update-ServiceFabricApplication/System.Fabric.FabricClient.ApplicationManagementClient.UpdateApplicationAsync().Application Capacity parameters can be specified again via Update-ServiceFabricApplication/System.Fabric.FabricClient.ApplicationManagementClient.UpdateApplicationAsync().

Restrizioni relative alla capacità dell'applicazioneRestrictions on Application Capacity

Esistono diverse restrizioni da rispettare per i parametri di capacità dell'applicazione.There are several restrictions on Application Capacity parameters that must be respected. Se sono presenti errori di convalida non viene apportata alcuna modifica.If there are validation errors no changes take place.

  • Tutti i parametri di tipo integer devono essere numeri non negativi.All integer parameters must be non-negative numbers.
  • MinimumNodes non deve essere mai maggiore di MaximumNodes.MinimumNodes must never be greater than MaximumNodes.
  • Se definite, le capacità per una metrica di carico devono rispettare queste regole:If capacities for a load metric are defined, then they must follow these rules:
    • La capacità di prenotazione del nodo non deve essere maggiore della capacità massima del nodo.Node Reservation Capacity must not be greater than Maximum Node Capacity. Ad esempio, non è possibile limitare la capacità per la metrica "CPU" nel nodo a due unità e provare a prenotare tre unità in ogni nodo.For example, you cannot limit the capacity for the metric “CPU” on the node to two units and try to reserve three units on each node.
    • Se viene specificato MaximumNodes, il prodotto di MaximumNodes e della capacità massima del nodo non deve essere maggiore della capacità totale dell'applicazione.If MaximumNodes is specified, then the product of MaximumNodes and Maximum Node Capacity must not be greater than Total Application Capacity. Si supponga, ad esempio, che la capacità massima del nodo per la metrica di carico "CPU" sia impostata su 8.For example, let's say the Maximum Node Capacity for load metric “CPU” is set to eight. Si supponga anche che il numero massimo di nodi sia impostato su 10.Let's also say you set the Maximum Nodes to 10. In questo caso, la capacità totale dell'applicazione deve essere superiore a 80 per la metrica di carico.In this case, Total Application Capacity must be greater than 80 for this load metric.

Le restrizioni vengono applicate sia durante la creazione dell'applicazione sia durante i suoi aggiornamenti.The restrictions are enforced both during application creation and updates.

Come usare la capacità dell'applicazioneHow not to use Application Capacity

  • Non tentare di usare le funzionalità dei gruppi di applicazioni per vincolare l'applicazione a uno specifico subset di nodi.Do not try to use the Application Group features to constrain the application to a specific subset of nodes. In altre parole, è possibile specificare che l'applicazione venga eseguita su un massimo di cinque nodi, ma non indicare i cinque nodi del cluster specifici.In other words, you can specify that the application runs on at most five nodes, but not which specific five nodes in the cluster. È possibile vincolare un'applicazione a nodi specifici usando i vincoli di posizionamento per i servizi.Constraining an application to specific nodes can be achieved using placement constraints for services.
  • Non usare la capacità dell'applicazione per garantire che due servizi della stessa applicazione vengano sempre posizionati sugli stessi nodi.Do not try to use the Application Capacity to ensure that two services from the same application are placed on the same nodes. Usare invece affinità o vincoli di posizionamento.Instead use affinity or placement constraints.

Passaggi successiviNext steps