Share via


Strategieën voor het afhandelen van gedeeltelijke fouten

Tip

Deze inhoud is een fragment uit het eBook, .NET Microservices Architecture for Containerized .NET Applications, beschikbaar op .NET Docs of als een gratis downloadbare PDF die offline kan worden gelezen.

.NET Microservices Architecture for Containerized .NET Applications eBook cover thumbnail.

Als u gedeeltelijke fouten wilt oplossen, gebruikt u een van de strategieën die hier worden beschreven.

Gebruik asynchrone communicatie (bijvoorbeeld communicatie op basis van berichten) in interne microservices. Het is ten zeerste raadzaam om geen lange ketens van synchrone HTTP-aanroepen te maken in de interne microservices, omdat dat onjuiste ontwerp uiteindelijk de belangrijkste oorzaak van slechte storingen wordt. Integendeel, behalve voor de front-endcommunicatie tussen de clienttoepassingen en het eerste niveau van microservices of fijnmazige API-gateways, is het raadzaam om alleen asynchrone communicatie (op berichten gebaseerd) te gebruiken na de eerste aanvraag-/responscyclus, in de interne microservices. Uiteindelijke consistentie en gebeurtenisgestuurde architecturen helpen om rimpeleffecten te minimaliseren. Deze benaderingen dwingen een hoger niveau van microserviceautonomie af en voorkomen daarom het probleem dat hier wordt vermeld.

Gebruik nieuwe pogingen met exponentieel uitstel. Deze techniek helpt bij het voorkomen van korte en onregelmatige fouten door het opnieuw proberen van aanroepen een bepaald aantal keren uit te voeren, voor het geval de service niet alleen gedurende korte tijd beschikbaar was. Dit kan optreden als gevolg van onregelmatige netwerkproblemen of wanneer een microservice/container wordt verplaatst naar een ander knooppunt in een cluster. Als deze nieuwe pogingen echter niet goed zijn ontworpen met circuitonderbrekers, kan het de rimpeleffecten verergeren, uiteindelijk zelfs een Denial of Service (DoS) veroorzaken.

Time-outs voor netwerken omzeilen. In het algemeen moeten clients niet voor onbepaalde tijd worden geblokkeerd en time-outs altijd gebruiken bij het wachten op een reactie. Het gebruik van time-outs zorgt ervoor dat resources nooit voor onbepaalde tijd worden gekoppeld.

Gebruik het circuitonderbrekerpatroon. In deze benadering houdt het clientproces het aantal mislukte aanvragen bij. Als de foutfrequentie een geconfigureerde limiet overschrijdt, wordt er een 'circuitonderbreker'-ritten uitgevoerd, zodat verdere pogingen onmiddellijk mislukken. (Als een groot aantal aanvragen mislukt, betekent dit dat de service niet beschikbaar is en dat het verzenden van aanvragen zinloos is.) Na een time-outperiode moet de client het opnieuw proberen en sluit de circuitonderbreker als de nieuwe aanvragen zijn geslaagd.

Geef terugval op. In deze benadering voert het clientproces terugvallogica uit wanneer een aanvraag mislukt, zoals het retourneren van gegevens in de cache of een standaardwaarde. Dit is een benadering die geschikt is voor query's en is complexer voor updates of opdrachten.

Beperk het aantal aanvragen in de wachtrij. Clients moeten ook een bovengrens opleggen aan het aantal openstaande aanvragen dat een clientmicroservice naar een bepaalde service kan verzenden. Als de limiet is bereikt, is het waarschijnlijk zinloos om extra aanvragen te doen. Deze pogingen moeten onmiddellijk mislukken. Wat de implementatie betreft, kan het polly bulkhead isolatiebeleid worden gebruikt om aan deze vereiste te voldoen. Deze aanpak is in wezen een parallelle vertraging met SemaphoreSlim als implementatie. Het staat ook een 'wachtrij' toe buiten het schot. U kunt proactief overtollige belasting afwerpen, zelfs voordat de uitvoering wordt uitgevoerd (bijvoorbeeld omdat de capaciteit als vol wordt beschouwd). Dit maakt de reactie op bepaalde foutscenario's sneller dan een circuitonderbreker zou zijn, omdat de circuitonderbreker wacht op de fouten. Het object BulkheadPolicy in Polly laat zien hoe vol het schot en de wachtrij zijn, en biedt gebeurtenissen over overloop, zodat ook kan worden gebruikt om geautomatiseerd horizontaal schalen te stimuleren.

Aanvullende bronnen