Prestatieproblemen in API-aanroepen oplossen
Dit is het vierde scenario van het lab, wat verwijst naar de blog over azure API Management Troubleshooting Series. Zorg ervoor dat u de instructies voor het instellen van het lab hebt gevolgd om het probleem opnieuw te maken.
Oorspronkelijke productversie: API Management Service
Oorspronkelijk KB-nummer: 4464929
Symptomen
De API ProductStore in APIM communiceert met het back-endeindpunt (https://productstoreapp.azurewebsites.net
) om records eenvoudig te maken, lezen, bijwerken en verwijderen wanneer dat nodig is. U kunt echter prestatieproblemen en uitzonderingen ondervinden tijdens het aanroepen van de API-bewerkingen die hieronder worden vermeld. Houd voor een gemakkelijke test slechts drie producten met id's variërend van 1 tot 3.
Een van de API-functies Products_GetAllProducts duurt vijf seconden om de resultaten te retourneren, terwijl de verwachte reactietijd minder dan een seconde is.
Tijdens het verwijderen van een product met een van de bovenstaande genoemde id's (1 tot 3), krijgt u HTTP 500 - Interne serverfout met het onderstaande bericht door Products_DeleteProduct bewerking aan te roepen.
{
"Bericht": "Er is een fout opgetreden."
}Products_PutProduct bewerking die een product bijwerkt onverwacht wordt beperkt, wordt HTTP 429 - Te veel aanvragen gegenereerd met het onderstaande foutbericht, ongeacht product-id en aanvraagbody, die u in de aanvraag verzendt. Als de klant bijvoorbeeld de productprijs van 'Tomaatsoep' bijwerkt met product-id = 1 met de onderstaande Json-body, krijgt hij HTTP 429-statuscode.
Sjabloonparameter-id: 1
Aanvraagtekst: {"Naam": "Tomatensoep","Categorie": "Boodschappen","Prijs": 2,45}
Hoofdtekst van antwoord:
{
De limiet wordt overschreden. Probeer het na enige tijd opnieuw.
}
Stappen voor probleemoplossing
Tijdens het oplossen van prestatieproblemen is de beste manier om foutisolatietechniek vast te leggen [APIM Inspector-tracering die de tijd toont die in elke sectie is genomen (inkomend/back-end/uitgaand).
Als u de API Inspector-tracering analyseert voor het eerste probleem, merkt u dat de back-endsectie de meeste tijd in beslag neemt (ongeveer 5 seconden), wat betekent dat er enige traagheid of langdurige bewerking plaatsvindt in de back-end.
"source": "forward-request",
"tijdstempel": "2018-07-29T16:16:46.6615081Z",
"verstreken": "00:00:05.5844430","data": {
"antwoord": {
"status": {
"code": 200,
"reden": "OK"
}Zodra u hebt geïsoleerd dat de traagheid zich in de back-end bevindt, moet u de code van de back-endtoepassing van de web-API-toepassing onderzoeken. Voor scenario's waarin u geen toegang hebt tot de back-end, kunt u caching implementeren op APIM-niveau, zoals hieronder. Lees hoe u cachebeleid kunt implementeren om de prestaties in Azure API Management te verbeteren.
<?xml version="1.0" encoding="UTF-8"?> <policies> <inbound> <base /> <cache-lookup vary-by-developer="true" vary-by-developer-groups="true" must-revalidate="true" downstream-caching-type="public" /> </inbound> <backend> <base /> </backend> <outbound> <base /> <cache-store duration="60" /> </outbound> <on-error> <base /> </on-error> </policies>
Voor het tweede probleem (HTTP 500 - Interne serverfout) volgt u dezelfde procedure voor het analyseren van de APIM-controletracering. We moeten http 500-statuscode zien onder het antwoordkenmerk 'forward-request'.
Dit betekent dat de back-end-API HTTP 500 heeft geretourneerd omdat er een niet-verwerkte uitzondering is opgetreden in de back-endcode, er geen probleem is op APIM-niveau.
forward-request (841.060 ms)
{
"antwoord": {
"status": {
"code": 500,
"reason": "Interne serverfout"
}Voor het derde probleem (HTTP 429 - Te veel aanvragen) lijkt het erop dat u de frequentielimiet voor API-aanroepen bereikt. Waarschijnlijk kunt u controleren of er beleid 'rate-limit' of 'rate-limit-by-key' is geïmplementeerd op bewerkingsniveau.
Als u dergelijke beleidsregels niet kunt vinden op bewerkingsniveau, klikt u op de knop Effectief beleid berekenen, waarin alle overgenomen beleidsregels van verschillende niveaus worden weergegeven, zoals u mogelijk een aantal beleidsregels op productniveau hebt die dit probleem kunnen veroorzaken.
Hier ziet u dat sommige beleidsregels zijn geïmplementeerd op API-niveau die de frequentie van de API-aanroep niet echt beperken, maar de actie nabootsen door een aangepast antwoord terug te sturen naar de client met behulp van beleid 'return-response' en 'set-status' in de uitgaande sectie.
<?xml version="1.0" encoding="UTF-8"?> <outbound> <!--base: Begin Api scope--> <return-response> <set-status code="429" reason="Too many requests" /> <set-body><![CDATA[{ Rate limit is exceeded. Try again after some time. }]]></set-body> </return-response> <!--base: End Api scope--> </outbound>
Contacteer ons voor hulp
Als u vragen hebt of hulp nodig hebt, maak een ondersteuningsaanvraag of vraag de Azure-communityondersteuning. U kunt ook productfeedback verzenden naar de Azure-feedbackcommunity.