Share via


Time-outuitzonderingen voor Azure Cosmos DB .NET SDK-aanvragen vaststellen en oplossen

VAN TOEPASSING OP: NoSQL

HTTP-fout 408 treedt op als de SDK de aanvraag niet vóór de time-outlimiet heeft kunnen voltooien.

Het is belangrijk om ervoor te zorgen dat het toepassingsontwerp onze handleiding volgt voor het ontwerpen van tolerante toepassingen met Azure Cosmos DB SDK's om ervoor te zorgen dat het correct reageert op verschillende netwerkomstandigheden. Uw toepassing moet over de mogelijkheid beschikken nieuwe pogingen uit te voeren bij time-outfouten, omdat deze normaal gesproken kunnen worden verwacht in een gedistribueerd systeem.

Bij het evalueren van de case voor time-outfouten:

  • Wat is de impact die wordt gemeten qua aantal bewerkingen, vergeleken met het aantal geslaagde bewerkingen? Bevindt deze zich binnen de service-SLA's?
  • Is de P99-latentie/beschikbaarheid beïnvloed?
  • Zijn de fouten van invloed op al uw toepassingsexemplaren of alleen op een deel ervan? Wanneer het probleem wordt beperkt tot een beperkt aantal exemplaren, betreft het doorgaans een probleem met betrekking tot deze exemplaren.

De time-out aanpassen in de Azure Cosmos DB .NET SDK

De SDK heeft twee verschillende alternatieven voor het beheren van time-outs, elk met een ander bereik.

Time-outs op aanvraagniveau

Met de CosmosClientOptions.RequestTimeout configuratie (of ConnectionPolicy.RequestTimeout voor SDK v2) kunt u een time-out voor de netwerkaanvraag instellen nadat de aanvraag de SDK heeft verlaten en zich in het netwerk bevindt totdat er een antwoord wordt ontvangen.

Met de CosmosClientOptions.OpenTcpConnectionTimeout configuratie (of ConnectionPolicy.OpenTcpConnectionTimeout voor SDK v2) kunt u een time-out instellen voor de tijd die nodig is om een initiële verbinding te openen. Zodra een verbinding is geopend, gebruiken volgende aanvragen de verbinding.

Een bewerking die door een gebruiker is gestart, kan meerdere netwerkaanvragen omvatten, bijvoorbeeld nieuwe pogingen. Deze twee configuraties zijn per aanvraag, niet end-to-end voor een bewerking.

CancellationToken

Alle asynchrone bewerkingen in de SDK hebben een optionele parameter CancellationToken. Deze parameter CancellationToken wordt gedurende de hele bewerking gebruikt, voor alle netwerkaanvragen en nieuwe pogingen. Tussen netwerkaanvragen kan het annuleringstoken worden gecontroleerd en kan een bewerking worden geannuleerd als het gerelateerde token is verlopen. Het annuleringstoken moet worden gebruikt om bij benadering een verwachte time-out voor het bewerkingsbereik te definiëren.

Notitie

De CancellationToken parameter is een mechanisme waarbij de bibliotheek de annulering controleert wanneer deze geen ongeldige status veroorzaakt. De bewerking wordt mogelijk niet precies geannuleerd wanneer de tijd die in de annulering is gedefinieerd, is verstreken. In plaats daarvan wordt het na het verstrijken van de tijd geannuleerd wanneer dit veilig kan gebeuren.

Stappen voor probleemoplossing

De volgende lijst bevat bekende oorzaken en oplossingen voor time-outuitzonderingen van aanvragen.

CosmosOperationCanceledException

Dat type uitzondering is gebruikelijk wanneer uw toepassing CancellationTokens doorgeeft aan de SDK-bewerkingen. De SDK controleert de status van de CancellationToken tussen-tussen-nieuwe pogingen en als de CancellationToken bewerking wordt geannuleerd, wordt de huidige bewerking met deze uitzondering afgebroken.

De uitzondering Message / ToString() geeft ook de status van uw CancellationToken doorgang Cancellation Token has expired: true aan en bevat ook diagnostische gegevens die de context van de annulering voor de betrokken aanvragen bevatten.

Deze uitzonderingen zijn veilig om het opnieuw te proberen en kunnen worden behandeld als time-outs vanuit het perspectief van opnieuw proberen.

Oplossing

Controleer de geconfigureerde tijd in uwCancellationToken, zorg ervoor dat deze groter is dan uw RequestTimeout en cosmosClientOptions.OpenTcpConnectionTimeout (als u de directe modus gebruikt). Als de beschikbare tijd in de CancellationToken time-outs kleiner is dan de geconfigureerde time-outs en de SDK tijdelijke verbindingsproblemen ondervindt, kan de SDK het niet opnieuw proberen en genereert CosmosOperationCanceledException.

Hoog CPU-gebruik

Hoog CPU-gebruik is het meest voorkomende geval. Voor een optimale latentie moet het CPU-gebruik ongeveer veertig procent zijn. Gebruik 10 seconden als interval om het maximale (niet het gemiddelde) CPU-gebruik te bewaken. CPU-pieken komen vaker voor bij query's tussen partities, waarbij meerdere verbindingen voor één query tot stand gebracht kunnen worden.

De time-outs bevatten diagnostische gegevens, die het volgende bevatten:

"systemHistory": [
{
"dateUtc": "2021-11-17T23:38:28.3115496Z",
"cpu": 16.731,
"memory": 9024120.000,
"threadInfo": {
"isThreadStarving": "False",
....
}

},
{
"dateUtc": "2021-11-17T23:38:28.3115496Z",
"cpu": 16.731,
"memory": 9024120.000,
"threadInfo": {
"isThreadStarving": "False",
....
}

},
...
]
  • Als de cpu waarden hoger zijn dan 70%, wordt de time-out waarschijnlijk veroorzaakt door CPU-uitputting. In dit geval kunt u de bron voor het hoge CPU-gebruik onderzoeken en deze verminderen, of de computer opschalen voor gebruik van grotere resources.
  • Als de threadInfo/isThreadStarving knooppunten waarden hebben True , is de oorzaak thread-starvatie. In dit geval kunt u de oorzaak of oorzaken onderzoeken van de threadblokkade (mogelijk vergrendelde threads) of de computers opschalen voor gebruik van een grotere resourcegrootte.
  • Als de dateUtc tijd tussen metingen niet ongeveer 10 seconden is, zou dit ook duiden op conflicten in de threadpool. Het CPU-gebruik wordt gemeten als een onafhankelijke taak die elke 10 seconden in de threadgroep wordt opgenomen. Als de tijd tussen metingen langer is, kan dit erop wijzen dat de asynchrone taken niet tijdig kunnen worden verwerkt. De meest voorkomende scenario's zijn het blokkeren van aanroepen via asynchrone code in de toepassingscode.

Oplossing

De clienttoepassing die gebruikmaakt van de SDK, moet dan omhoog of omlaag worden geschaald.

De beschikbaarheid van sockets of poorten is mogelijk laag

Wanneer clients worden uitgevoerd in Azure, kunnen clients die de .NET SDK gebruiken, te maken krijgen met Azure SNAT-poortuitputting (PAT) raken.

Oplossing 1

Als u azure-VM's gebruikt, volgt u de SNAT-poortuitputtingshandleiding.

Oplossing 2

Als u op Azure-app Service werkt, volgt u de handleiding voor het oplossen van verbindingsproblemen en gebruikt u diagnostische gegevens van App Service.

Oplossing 3

Als u azure Functions uitvoert, controleert u of u de Aanbeveling van Azure Functions volgt om singleton- of statische clients te onderhouden voor alle betrokken services (inclusief Azure Cosmos DB). Controleer de servicelimieten op basis van het type en de grootte van uw functie-app-hosting.

Oplossing 4

Als u een HTTP-proxy gebruikt, moet u ervoor zorgen dat deze het aantal verbindingen ondersteunt dat is geconfigureerd in de SDK ConnectionPolicy. Anders ondervindt u verbindingsproblemen.

Meerdere clientexemplaren maken

Het maken van meerdere clientinstanties kan leiden tot verbindingsproblemen en time-outproblemen. De diagnostische gegevens bevatten twee relevante eigenschappen:

{
    "NumberOfClientsCreated":X,
    "NumberOfActiveClients":Y,
}

NumberOfClientsCreated houdt het aantal keren bij dat een is CosmosClient gemaakt binnen hetzelfde AppDomain en NumberOfActiveClients houdt de actieve clients bij (niet verwijderd). De verwachting is dat als het singleton-patroon wordt gevolgd, X overeenkomt met het aantal accounts waarmee de toepassing werkt en dat X gelijk is aan Y.

Als X deze groter is dan Y, betekent dit dat de toepassing clientexemplaren maakt en disponeert. Dit kan leiden tot conflicten tussen verbindingen en/of CPU-conflicten.

Oplossing

Volg de tips voor prestaties en gebruik één CosmosClient-exemplaar per account gedurende een heel proces. Vermijd het maken en verwijderen van clients.

Dynamische partitiesleutel

Azure Cosmos DB verdeelt de totale ingerichte doorvoer gelijkmatig over fysieke partities. Bij een dynamische partitie verbruiken een of meer logische partitiesleutels op een fysieke partitie alle aanvraageenheden per seconde (RU/s) van de fysieke partitie. Tegelijkertijd blijven de RU/s op andere fysieke partities ongebruikt. Als symptoom is het totale aantal verbruikte RU/s kleiner dan de totale ingerichte RU/s in de database of container, maar u ziet nog steeds beperking (429s) voor de aanvragen op basis van de dynamische logische partitiesleutel. Gebruik de metrische gegevens voor genormaliseerd RU-verbruik om te zien of de werkbelasting een dynamische partitie ondervindt.

Oplossing

Kies een goede partitiesleutel waarmee het aanvraagvolume en de opslag gelijkmatig worden gedistribueerd. Meer informatie over het wijzigen van uw partitiesleutel.

Hoge mate van gelijktijdigheid

De toepassing voert een hoog gelijktijdigheidsniveau uit, wat kan leiden tot conflicten op het kanaal.

Oplossing

De clienttoepassing die gebruikmaakt van de SDK, moet dan omhoog of omlaag worden geschaald.

Grote aanvragen of antwoorden

Grote aanvragen of antwoorden kunnen leiden tot een hoofd-of-lijnblokkering op het kanaal en verergeren conflicten, zelfs met een relatief lage mate van gelijktijdigheid.

Oplossing

De clienttoepassing die gebruikmaakt van de SDK, moet dan omhoog of omlaag worden geschaald.

Foutpercentage valt binnen de SLA van Azure Cosmos DB

De toepassing moet tijdelijke fouten kunnen afhandelen en het opnieuw proberen wanneer dat nodig is. 408 uitzonderingen worden niet opnieuw geprobeerd omdat het bij het maken van paden onmogelijk is om te weten of de service het item heeft gemaakt of niet. Als u hetzelfde item opnieuw verzendt voor het maken, ontstaat er een conflict-uitzondering. Bedrijfslogica van gebruikerstoepassingen kan aangepaste logica hebben voor het afhandelen van conflicten, waardoor de dubbelzinnigheid van een bestaand item ten opzichte van een conflict bij het maken van een nieuwe poging wordt verbroken.

Foutpercentage schendt de SLA van Azure Cosmos DB

Neem contact op met de ondersteuning van Azure.

Volgende stappen