Delen via


Serviceaffiniteit configureren en gebruiken in Service Fabric

Affiniteit is een controle die voornamelijk wordt geboden om de overgang van grotere monolithische toepassingen naar de cloud- en microserviceswereld te vereenvoudigen. Het wordt ook gebruikt als optimalisatie voor het verbeteren van de prestaties van services, hoewel dit wel neveneffecten kan hebben.

Stel dat u een grotere app meeneemt of een app die alleen niet is ontworpen met microservices in gedachten, naar Service Fabric (of een gedistribueerde omgeving). Dit type overgang is gebruikelijk. U begint met het opheffen van de hele app in de omgeving, het verpakken ervan en het probleemloos laten verlopen. Vervolgens begint u het op te delen in verschillende kleinere services die allemaal met elkaar praten.

Uiteindelijk zult u merken dat de toepassing problemen ondervindt. De problemen vallen meestal in een van deze categorieën:

  1. Sommige component X in de monolithische app had een niet-gedocumenteerde afhankelijkheid van onderdeel Y en u hebt deze onderdelen zojuist omgezet in afzonderlijke services. Omdat deze services nu worden uitgevoerd op verschillende knooppunten in het cluster, worden ze verbroken.
  2. Deze onderdelen communiceren via (lokale named pipes | gedeeld geheugen | bestanden op schijf) en ze moeten op dit moment naar een gedeelde lokale resource kunnen schrijven om prestatieredenen. Die harde afhankelijkheid wordt later verwijderd, misschien.
  3. Alles is prima, maar het blijkt dat deze twee onderdelen echt chatty/performance gevoelig zijn. Wanneer ze ze verplaatsten naar afzonderlijke services, zijn de prestaties van toepassingen getankt of de latentie toegenomen. Als gevolg hiervan voldoet de algehele toepassing niet aan de verwachtingen.

In deze gevallen willen we ons herstructureringswerk niet verliezen en willen we niet teruggaan naar de monolithische. De laatste voorwaarde kan zelfs wenselijk zijn als een gewone optimalisatie. Totdat we de onderdelen echter opnieuw kunnen ontwerpen om op natuurlijke wijze te werken als services (of totdat we de prestatieverwachtingen op een andere manier kunnen oplossen) hebben we enige zin in lokaliteit nodig.

Wat u moet doen? Je kunt proberen affiniteit in te schakelen.

Affiniteit configureren

Als u affiniteit wilt instellen, definieert u een affiniteitsrelatie tussen twee verschillende services. U kunt affiniteit beschouwen als 'wijzen' op een andere service en u zegt: 'Deze service kan alleen worden uitgevoerd waar die service wordt uitgevoerd'. Soms verwijzen we naar affiniteit als een bovenliggende/onderliggende relatie (waar u het kind naar het bovenliggende item wijst). Affiniteit zorgt ervoor dat de replica's of exemplaren van een service worden geplaatst op dezelfde knooppunten als die van een andere 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);

Notitie

Een onderliggende service kan slechts deelnemen aan één affiniteitsrelatie. Als u wilt dat het onderliggende element wordt gekoppeld aan twee bovenliggende services tegelijk, hebt u een aantal opties:

  • De relaties omkeren (parentService1 en parentService2 point at the current child service) of
  • Wijs een van de ouders aan als een hub per conventie en zorg ervoor dat alle services bij die service worden gebruikt.

Het resulterende plaatsingsgedrag in het cluster moet hetzelfde zijn.

Verschillende affiniteitsopties

Affiniteit wordt weergegeven via een van de verschillende correlatieschema's en heeft twee verschillende modi. De meest voorkomende affiniteitsmodus is wat we NonAlignedAffinity noemen. In NonAlignedAffinity worden de replica's of exemplaren van de verschillende services op dezelfde knooppunten geplaatst. De andere modus is AlignedAffinity. Uitgelijnde affiniteit is alleen nuttig bij stateful services. Als u twee stateful services configureert om afgestemde affiniteit te hebben, zorgt u ervoor dat de primaries van deze services op dezelfde knooppunten als elkaar worden geplaatst. Het zorgt er ook voor dat elk paar secundaire bestanden ervoor zorgt dat deze services op dezelfde knooppunten worden geplaatst. Het is ook mogelijk (hoewel minder vaak) om NonAlignedAffinity te configureren voor stateful services. Voor NonAlignedAffinity worden de verschillende replica's van de twee stateful services uitgevoerd op dezelfde knooppunten, maar hun primaries kunnen op verschillende knooppunten terechtkomen.

Affiniteitsmodi en hun effecten

Best effort gewenste status

Een affiniteitsrelatie is best effort. Het biedt niet dezelfde garanties voor collocatie of betrouwbaarheid die in hetzelfde uitvoerbare proces worden uitgevoerd. De services in een affiniteitsrelatie zijn fundamenteel verschillende entiteiten die kunnen mislukken en onafhankelijk kunnen worden verplaatst. Een affiniteitsrelatie kan ook worden verbroken, hoewel deze onderbrekingen tijdelijk zijn. Capaciteitsbeperkingen kunnen bijvoorbeeld betekenen dat slechts enkele serviceobjecten in de affiniteitsrelatie op een bepaald knooppunt passen. In deze gevallen kan er geen affiniteitsrelatie worden afgedwongen vanwege de andere beperkingen. Als dit mogelijk is, wordt de schending later automatisch gecorrigeerd.

Ketens versus sterren

Momenteel kan Cluster Resource Manager geen ketens van affiniteitsrelaties modelleren. Dit betekent dat een service die een onderliggende relatie is in één affiniteitsrelatie, geen bovenliggende relatie kan zijn in een andere affiniteitsrelatie. Als u dit type relatie wilt modelleren, moet u deze effectief modelleren als een ster in plaats van een keten. Als u van een keten naar een ster wilt gaan, wordt het onderste onderliggende element in plaats daarvan bovenliggend naar het bovenliggende element van het eerste kind. Afhankelijk van de rangschikking van uw services, moet u dit mogelijk meerdere keren doen. Als er geen natuurlijke bovenliggende service is, moet u mogelijk een service maken die als tijdelijke aanduiding fungeert. Afhankelijk van uw vereisten kunt u ook kijken naar toepassingsgroepen.

Ketens versus sterren in de context van affiniteitsrelaties

Een ander ding om te weten over affiniteitsrelaties is dat ze standaard directioneel zijn. Dit betekent dat de affiniteitsregel alleen afdwingt dat het onderliggende element bij het bovenliggende item is geplaatst. Het zorgt er niet voor dat het bovenliggende element zich bij het kind bevindt. Als er een schending van de affiniteit is en de schending om de een of andere reden wilt corrigeren, is het niet mogelijk om het kind naar het knooppunt van het bovenliggende item te verplaatsen, zelfs als het verplaatsen van het bovenliggende knooppunt naar het knooppunt van het kind de schending heeft gecorrigeerd. Het bovenliggende item wordt niet verplaatst naar het knooppunt van het kind. Als u de configuratie MoveParentToFixAffinityViolation instelt op true, wordt de directionaliteit verwijderd. Het is ook belangrijk om te weten dat de affiniteitsrelatie niet perfect of onmiddellijk kan worden afgedwongen, omdat verschillende services met verschillende levenscycluss hebben en onafhankelijk kunnen mislukken en kunnen worden verplaatst. Stel dat het bovenliggende item plotseling een failover naar een ander knooppunt uitvoert omdat het is vastgelopen. Het cluster Resource Manager en Failover Manager verwerken de failover eerst, omdat de services up,consistent en beschikbaar blijven, de prioriteit is. Zodra de failover is voltooid, wordt de affiniteitsrelatie verbroken, maar de Cluster Resource Manager denkt dat alles goed is totdat het kind zich niet bij het bovenliggende item bevindt. Dit soort controles worden periodiek uitgevoerd. In dit artikel vindt u meer informatie over de wijze waarop beperkingen in Cluster Resource Manager worden geëvalueerd. In dit artikel wordt uitgelegd hoe u het ritme configureert waarop deze beperkingen worden geëvalueerd.

Ondersteuning voor partitionering

Het laatste wat u moet zien over affiniteit, is dat affiniteitsrelaties niet worden ondersteund wanneer het bovenliggende item wordt gepartitioneerd. Gepartitioneerde bovenliggende services kunnen uiteindelijk worden ondersteund, maar momenteel is het niet toegestaan.

Volgende stappen