Configurazione e utilizzo dell'affinità del servizio in Service FabricConfiguring and using service affinity in Service Fabric

Il controllo di affinità è disponibile principalmente per facilitare la transizione di grandi applicazioni monolitiche verso ambienti cloud e di microservizi.Affinity is a control that is provided mainly to help ease the transition of larger monolithic applications into the cloud and microservices world. Viene anche usato come ottimizzazione per migliorare le prestazioni dei servizi, sebbene questa operazione possa avere effetti collaterali.It is also used as an optimization for improving the performance of services, although doing so can have side effects.

Si supponga di voler importare in Service Fabric un'applicazione di grandi dimensioni o che non era stata progettata nell'ottica dei microservizi (o qualsiasi ambiente distribuito).Let’s say you’re bringing a larger app, or one that just wasn’t designed with microservices in mind, to Service Fabric (or any distributed environment). Questo tipo di transizione è comune.This type of transition is common. È necessario innanzitutto sollevare l'intera applicazione nell'ambiente, creare il pacchetto e accertarsi che venga eseguita senza problemi.You start by lifting the entire app into the environment, packaging it, and making sure it is running smoothly. Quindi, la si suddivide in vari servizi più piccoli che comunicano tra loro.Then you start breaking it down into different smaller services that all talk to each other.

Infine è possibile che nell'applicazione si siano verificati alcuni problemi.Eventually you may find that the application is experiencing some issues. I problemi rientrano, in genere, in una di queste categorie:The issues usually fall into one of these categories:

  1. Una parte del componente X dell'app monolitica aveva una dipendenza non documentata dal componente Y che abbiamo appena convertito in servizi separati.Some component X in the monolithic app had an undocumented dependency on component Y, and you just turned those components into separate services. Poiché questi servizi sono in esecuzione su nodi diversi del cluster, vengono interrotti.Since these services are now running on different nodes in the cluster, they're broken.
  2. Queste componenti comunicano tramite (named pipe locali | memoria condivisa | file su disco), e devono essere subito in grado di scrivere su una risorsa locale condivisa per motivi di prestazioni.These components communicate via (local named pipes | shared memory | files on disk) and they really need to be able to write to a shared local resource for performance reasons right now. Tale dipendenza rigida viene rimossa, forse, in un secondo momento.That hard dependency gets removed later, maybe.
  3. La procedura è corretta, ma si scopre che questi due componenti comunicano tra loro o sono sensibili alle prestazioni.Everything is fine, but it turns out that these two components are actually chatty/performance sensitive. Quando sono stati spostati in servizi separati, le prestazioni globali hanno subito dell'applicazione ne hanno risentito pesantemente o hanno aumentato la latenza.When they moved them into separate services overall application performance tanked or latency increased. Di conseguenza, l'applicazione globale non soddisfa le aspettative.As a result, the overall application is not meeting expectations.

In questi casi non si vuole perdere il lavoro di refactoring e non si vuole tornare all'app monolitica.In these cases, we don’t want to lose our refactoring work, and don’t want to go back to the monolith. L'ultima condizione può anche essere utile come una normale ottimizzazione.The last condition may even be desirable as a plain optimization. Tuttavia fino a quando non sarà possibile riprogettare i componenti perché funzionino in modo naturale come servizi (o fino a quando non si sarà in grado di risolvere le aspettative delle prestazioni in un altro modo), è necessario un senso di località.However, until we can redesign the components to work naturally as services (or until we can solve the performance expectations some other way) we're going to need some sense of locality.

Cosa fare?What to do? Si può provare ad attivare il servizio di affinità.Well, you could try turning on affinity.

Come configurare l'affinitàHow to configure affinity

Per impostare l'affinità, è necessario definire una relazione di affinità tra due servizi.To set up affinity, you define an affinity relationship between two different services. Si tratta di fare in modo che un servizio "punti" a un altro servizio affinché il primo possa essere eseguito solo se anche il secondo è in esecuzione.You can think of affinity as “pointing” one service at another and saying “This service can only run where that service is running.” A volte, si fa riferimento all'affinità come a una relazioni padre-figlio, in cui l'elemento figlio punta all'elemento padre.Sometimes we refer to affinity as a parent/child relationship (where you point the child at the parent). L'affinità garantisce che le repliche o le istanze di un servizio vengano inserite negli stessi nodi in cui risiedono quelle di un altro servizio.Affinity ensures that the replicas or instances of one service are placed on the same nodes as those of another service.

ServiceCorrelationDescription affinityDescription = new ServiceCorrelationDescription();
affinityDescription.Scheme = ServiceCorrelationScheme.Affinity;
affinityDescription.ServiceName = new Uri("fabric:/otherApplication/parentService");
serviceDescription.Correlations.Add(affinityDescription);
await fabricClient.ServiceManager.CreateServiceAsync(serviceDescription);

Nota

Un servizio figlio può partecipare solo a una relazione di affinità singola.A child service can only participate in a single affinity relationship. Se si desidera creare un'affinità fra un servizio figlio e due servizi padre in una volta sola, sono disponibili due opzioni:If you wanted the child to be affinitized to two parent services at once you have a couple options:

  • Invertire le relazioni (includere i punti parentService1 e parentService2 nel servizio figlio corrente), oppureReverse the relationships (have parentService1 and parentService2 point at the current child service), or
  • Designare uno dei padri come hub per convenzione e disporre di tutti i punti del servizio in quel servizio.Designate one of the parents as a hub by convention and have all services point at that service.

Il comportamento di selezione risultante del cluster deve essere lo stesso.The resulting placement behavior in the cluster should be the same.

Diverse opzioni di affinitàDifferent affinity options

L'affinità è rappresentata tramite vari possibili schemi di correlazione e ha due modalità diverse.Affinity is represented via one of several correlation schemes, and has two different modes. La modalità di affinità più comune è la cosiddetta NonAlignedAffinity.The most common mode of affinity is what we call NonAlignedAffinity. Nella modalità NonAlignedAffinity le repliche o le istanze dei diversi servizi vengono inserite negli stessi nodi.In NonAlignedAffinity, the replicas or instances of the different services are placed on the same nodes. L'altra modalità è AlignedAffinity.The other mode is AlignedAffinity. La modalità AlignedAffinity viene usata solo con i servizi con stato.Aligned Affinity is useful only with stateful services. La configurazione di due servizi con stati per l'allineamento dell'affinità garantisce che i primari di tali servizi vengano inseriti negli stessi nodi.Configuring two stateful services to have aligned affinity ensures that the primaries of those services are placed on the same nodes as each other. La configurazione consente anche di inserire ogni coppia di secondari dei servizi negli stessi nodi.It also causes each pair of secondaries for those services to be placed on the same nodes. È possibile anche configurare una relazione NonAlignedAffinity per i servizi con stato, sebbene questa pratica sia meno comune.It is also possible (though less common) to configure NonAlignedAffinity for stateful services. Per la relazione NonAlignedAffinity, le diverse repliche dei due servizi con stato saranno in esecuzione sugli stessi nodi, ma le relative primarie potrebbero finire in nodi diversi.For NonAlignedAffinity, the different replicas of the two stateful services would run on the same nodes, but their primaries could end up on different nodes.

Modalità di affinità e loro effetti
Affinity Modes and Their Effects

Stato desiderato del massimo sforzoBest effort desired state

Una relazione di affinità è migliore.An affinity relationship is best effort. Non fornisce le stesse garanzie di collocazione o affidabilità di quelle eseguite nello stesso processo eseguibile.It does not provide the same guarantees of collocation or reliability that running in the same executable process does. I servizi in una relazione di affinità sono entità profondamente diverse che possono avere esito negativo ed essere spostate in modo indipendente.The services in an affinity relationship are fundamentally different entities that can fail and be moved independently. Una relazione di affinità può anche subire un'interruzione, anche se tali interruzioni sono temporanee.An affinity relationship could also break, though these breaks are temporary. Ad esempio, i limiti di capacità possono significare che solo alcuni degli oggetti del servizio nella relazione di affinità possono contenere un determinato nodo.For example, capacity limitations may mean that only some of the service objects in the affinity relationship can fit on a given node. In questi casi, anche se è disponibile una relazione di affinità, non verrà applicata a causa di altri vincoli.In these cases even though there's an affinity relationship in place, it can't be enforced due to the other constraints. Se è possibile eseguire questa operazione, la violazione viene corretta automaticamente in un secondo momento.If it is possible to do so, the violation is automatically corrected later.

Modelli a catena o a stellaChains vs. stars

Oggi Cluster Resource Manager non è in grado modellare le catene di relazioni di affinità di.Today the Cluster Resource Manager isn't able to model chains of affinity relationships. Ciò significa che un servizio che è un elemento figlio in una relazione di affinità non potrà essere un elemento padre in un'altra relazione di affinità.What this means is that a service that is a child in one affinity relationship can’t be a parent in another affinity relationship. Se si desidera modellare questo tipo di relazione, è necessario modellarla in modo efficace a forma di stella, invece di una catena.If you want to model this type of relationship, you effectively have to model it as a star, rather than a chain. Per spostarsi da un modello a catena a uno a stella, l'elemento figlio più basso verrebbe imparentato con il padre del primo elemento figlio.To move from a chain to a star, the bottommost child would be parented to the first child’s parent instead. A seconda della disposizione dei servizi, è possibile eseguire l'operazione più volte.Depending on the arrangement of your services, you may have to do this multiple times. Se non esiste alcun servizio padre naturale, è necessario crearne uno che funga da segnaposto.If there's no natural parent service, you may have to create one that serves as a placeholder. A seconda dei requisiti, è inoltre consigliabile esaminare i gruppi di applicazioni.Depending on your requirements, you may also want to look into Application Groups.

Modelli a catena o a stella nel contesto delle relazioni di affinità
Chains vs. Stars in the Context of Affinity Relationships

Un altro aspetto da notare circa le relazioni di affinità attuali è che sono direzionali.Another thing to note about affinity relationships today is that they are directional. Ciò significa che la regola di affinità impone solo che l'elemento figlio sia collocato nella stessa posizione dell'elemento padre.This means that the affinity rule only enforces that the child placed with the parent. Non garantisce che l'elemento padre sia posizionato con l'elemento figlio.It does not ensure that the parent is located with the child. È anche importante notare che la relazione di affinità non può essere perfetta o immediatamente imposta poiché diversi servizi dispongono di diversi cicli di vita e possono avere esito negativo e spostarsi in modo indipendente.It is also important to note that the affinity relationship can't be perfect or instantly enforced since different services have with different lifecycles and can fail and move independently. Supponiamo, ad esempio, che per l'elemento padre improvvisamente si verifichi un errore su un altro nodo perché si è arrestato in modo anomalo.For example, let's say the parent suddenly fails over to another node because it crashed. Cluster Resource Manager e Gestione failover gestiscono prima di tutto il failover, poiché mantenere i servizi attivi, coerenti e disponibili è la priorità.The Cluster Resource Manager and Failover Manager handle the failover first, since keeping the services up, consistent, and available is the priority. Una volta completato il failover, la relazione di affinità è interrotta, ma per Cluster Resource Manager l'operazione si svolge in modo corretto fino a quando non rileva che l'elemento figlio non si trova con l'elemento padre.Once the failover completes, the affinity relationship is broken, but the Cluster Resource Manager thinks everything is fine until it notices that the child is not located with the parent. Questi tipi di controlli vengono eseguiti periodicamente.These sorts of checks are performed periodically. Altre informazioni sulla modalità in cui Cluster Resource Manager valuta i vincoli sono disponibili in questo articolo, mentre questo fornisce altre indicazioni su come configurare la frequenza con cui questi vincoli vengono valutati.More information on how the Cluster Resource Manager evaluates constraints is available in this article, and this one talks more about how to configure the cadence on which these constraints are evaluated.

Supporto del partizionamentoPartitioning support

L'ultimo aspetto da notare è che le relazioni di affinità non sono supportate nelle situazioni in cui l'elemento padre è partizionato.The final thing to notice about affinity is that affinity relationships aren’t supported where the parent is partitioned. I servizi padre partizionati potrebbero essere supportati alla fine, ma attualmente non è consentito.Partitioned parent services may be supported eventually, but today it is not allowed.

Passaggi successiviNext steps