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 hebbenTrue
, 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
- Problemen vaststellen en oplossen wanneer u de Azure Cosmos DB .NET SDK gebruikt.
- Meer informatie over prestatierichtlijnen voor .NET v3 en .NET v2.