Tolerantie van toepassingen en infrastructuur
Tolerantie is de mogelijkheid om te herstellen van tijdelijke fouten. Via de herstelstrategie van de app worden de normale functies hersteld met minimale gevolgen voor de gebruiker. Fouten kunnen optreden in cloudomgevingen en uw app moet reageren op een manier die downtime en gegevensverlies minimaliseert. In een ideale situatie verwerkt uw app fouten zonder dat de gebruiker ooit weet dat er een probleem is.
Omdat microserviceomgevingen vluchtig kunnen zijn, ontwerpt u uw apps om gedeeltelijke fouten te verwachten en af te handelen. Een gedeeltelijke fout kan bijvoorbeeld codeuitzonderingen, netwerkstoringen, niet-reagerende serverprocessen of hardwarefouten bevatten. Zelfs geplande activiteiten, zoals het verplaatsen van containers naar een ander knooppunt binnen een Kubernetes-cluster, kunnen een tijdelijke fout veroorzaken.
Benaderingen van tolerantie
Bij het ontwerpen van tolerante toepassingen moet u vaak kiezen tussen een foutieve snelle en elegante afname. Als de toepassing niet snel werkt, treedt er onmiddellijk een fout of uitzondering op wanneer er iets misgaat, in plaats van het probleem te herstellen of te omzeilen. Hierdoor kunnen problemen snel worden geïdentificeerd en opgelost. Graceful degradatie betekent dat de toepassing probeert te blijven werken in een beperkte capaciteit, zelfs wanneer een onderdeel uitvalt.
In cloudeigen toepassingen is het belangrijk dat services fouten probleemloos verwerken in plaats van snel te mislukken. Omdat microservices gedecentraliseerd en onafhankelijk kunnen worden geïmplementeerd, worden gedeeltelijke fouten verwacht. Als u niet snel werkt, kan een fout in één service snel afhankelijke services uitschakelen, waardoor de algehele systeemtolerantie wordt verminderd. In plaats daarvan moeten microservices worden gecodeerd om zowel interne als externe servicefouten te verwachten en te verdragen. Door deze probleemloze verslechtering kan het algehele systeem blijven werken, zelfs als sommige services worden onderbroken. Kritieke, gebruikersgerichte functies kunnen worden voortgezet, waardoor een volledige storing wordt voorkomen. Bij een fout met een fout kunnen ook gestoorde services tijd krijgen om te herstellen of zelf te herstellen voordat dit van invloed is op de rest van het systeem. Voor toepassingen op basis van microservices is een goede verslechtering beter afgestemd op aanbevolen procedures voor tolerantie, zoals foutisolatie en snel herstel. Hiermee voorkomt u dat lokale incidenten trapsgewijs worden over het hele systeem heen.
Er zijn twee fundamentele benaderingen ter ondersteuning van een respijtvolle verslechtering met tolerantie: toepassing en infrastructuur. Elke benadering heeft voordelen en nadelen. Beide benaderingen kunnen geschikt zijn, afhankelijk van de situatie. In deze module wordt uitgelegd hoe u tolerantie op basis van code en infrastructuur implementeert.
Tolerantie op basis van code
Om tolerantie op basis van code te implementeren, heeft .NET een extensiebibliotheek voor tolerantie en afhandeling van tijdelijke fouten. Microsoft.Extensions.Http.Resilience
Het maakt gebruik van een vloeiende, eenvoudig te begrijpen syntaxis om code voor foutafhandeling op een thread-veilige manier te bouwen. Er zijn diverse soorten tolerantiebeleid waarmee gedrag voor foutafhandeling wordt gedefinieerd. In deze module past u de strategieën voor opnieuw proberen en circuitonderbreker toe op HTTP-clientbewerkingen.
Strategie voor opnieuw proberen
Een strategie voor opnieuw proberen is precies wat de naam impliceert. De aanvraag wordt na een korte wachttijd opnieuw uitgevoerd, en als er een foutbericht wordt ontvangen. De wachttijd neemt toe bij elke nieuwe poging. De toename kan lineair of exponentieel zijn.
Nadat het maximum aantal nieuwe pogingen is bereikt, geeft de strategie een uitzondering op en genereert deze een uitzondering. Vanuit het perspectief van de gebruiker duurt het meestal langer om bepaalde bewerkingen uit te voeren. Het kan even duren voordat de app de gebruiker informeert dat de bewerking niet kan worden voltooid.
Circuitonderbrekerstrategie
Een circuitonderbrekerstrategie geeft een doelservice een onderbreking na een herhaald aantal fouten door te onderbreken om ermee te communiceren. De service kan een ernstig probleem ondervinden en kan tijdelijk niet reageren. Na een gedefinieerd aantal opeenvolgende fouten worden de verbindingspogingen onderbroken en wordt het circuit geopend. Tijdens deze wachttijd mislukken extra bewerkingen op de doelservice onmiddellijk zonder de service te verbinden. Wanneer de wachttijd is verstreken, wordt geprobeerd de bewerking opnieuw uit te voeren. Als de service reageert, wordt het circuit gesloten en gaat het systeem terug naar normaal.
Op infrastructuur gebaseerde tolerantie
Als u op infrastructuur gebaseerde tolerantie wilt implementeren, kunt u een servicemesh gebruiken. Behalve dat er bij een servicemesh sprake is van tolerantie zonder dat er code bij te pas komt, levert deze ook verkeerbeheer, beleid, beveiliging, een sterke identiteit en waarneembaarheid. Uw app wordt losgekoppeld van deze operationele mogelijkheden, die worden verplaatst naar de infrastructuurlaag.
Vergelijking met op code gebaseerde benaderingen
Een tolerantiebenadering op basis van infrastructuur kan een weergave op basis van metrische gegevens gebruiken waarmee deze dynamisch kan worden aangepast aan clusteromstandigheden in realtime. Met deze benadering wordt een andere dimensie toegevoegd voor het beheren van het cluster, zonder dat er code wordt toegevoegd.
Met een op code gebaseerde benadering kunt u het volgende doen:
- Ben u verplicht om te gissen welke parameters voor opnieuw proberen en het toepassen van time-outs geschikt zijn.
- Richt u zich op een specifieke HTTP-aanvraag.
Er is geen redelijke manier om te reageren op een infrastructuurfout in de code van uw app. Denk aan de honderden of duizenden aanvragen die tegelijkertijd worden verwerkt. Zelfs een nieuwe poging met exponentieel afzien van activiteit (maal het aantal aanvragen) kan een service overbelasten.
Daarentegen zijn op infrastructuur gebaseerde benaderingen niet op de hoogte van de interne werking van apps. Complexe databasetransacties zijn bijvoorbeeld onzichtbaar voor service-meshes. Dergelijke transacties kunnen alleen worden beveiligd tegen fouten met een op code gebaseerde benadering.
In toekomstige eenheden implementeert u tolerantie voor een op microservice gebaseerde app met behulp van .NET HTTP-tolerantie in code en een Linkerd-service-mesh.