Dela via


Felsöka prestandaproblem i API-anrop

Med hjälp av bloggen om felsökningsserien för Azure API Management är det här det fjärde scenariot i labbet. Se till att du har följt instruktionerna för labbkonfigurationen enligt detta för att återskapa problemet.

Ursprunglig produktversion: API Management Service
Ursprungligt KB-nummer: 4464929

Symptom

API ProductStore i APIM kommunicerar med serverdelsslutpunkten (https://productstoreapp.azurewebsites.net) för att enkelt skapa, läsa, uppdatera och ta bort poster vid behov. Du kan dock stöta på vissa prestandaproblem och undantag när du anropar DE API-åtgärder som anges nedan. För att underlätta testningen bör du bara behålla tre produkter med ID:t från 1 till 3.

  • En av API-funktionerna Products_GetAllProducts tar 5 sekunder att returnera resultatet, medan den förväntade svarstiden är mindre än en sekund.

  • När du tar bort en produkt som har något av ovan nämnda ID:t (1 till 3) får du HTTP 500 – internt serverfel med meddelandet nedan genom att anropa Products_DeleteProduct åtgärd.

    {
    "Meddelande": "Ett fel har inträffat."
    }

  • Products_PutProduct åtgärd som uppdaterar en produkt begränsas oväntat och genererar HTTP 429 – För många begäranden med felmeddelandet nedan oavsett produkt-ID och begärandetext som du skickar i begäran. Om kunden till exempel uppdaterar produktpriset för "Tomato Soup" med produkt-ID = 1 med Json-brödtexten nedan får han HTTP 429-statuskod.

    Mallparameter-ID: 1
       Begärandetext: {"Namn": "Tomatsoppa","Kategori": "Livsmedel","Pris": 2.45}
       Svarstext:
    {
    Hastighetsbegränsning överskriden. Försök igen efter en stund.
    }

Felsökningsanvisningar

  • När du felsöker prestandaproblem är den bästa metoden för felisolering att samla in [APIM-kontrollspårning som visar hur mycket tid det tar i varje avsnitt (inkommande/serverdel/utgående).

  • Om du analyserar API Inspector-spårningen för det första problemet skulle du märka att serverdelsavsnittet tar större delen av tiden (cirka 5 sekunder), vilket innebär att det sker en viss långsam eller tidskrävande åtgärd på serverdelen.

    "source": "forward-request",
    "tidsstämpel": "2018-07-29T16:16:46.6615081Z",
    "förflutit": "00:00:05.5844430","data": {
    "response": {
    "status": {
    "code": 200,
    "reason": "OK"
    }

  • När du har isolerat att långsamheten är på serverdelen måste du undersöka serverdelsprogrammets kod för webb-API-programmet. För scenarier där du inte har åtkomst till serverdelen kan du implementera cachelagring på APIM-nivå som nedan. Läs mer om hur du kan implementera cachelagringsprinciper för att förbättra prestanda i Azure API Management.

    <?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>
    
  • För det andra problemet (HTTP 500 – internt serverfel) följer du samma procedur för att analysera APIM-kontrollspårningen och vi bör se HTTP 500-statuskoden under svarsattributet "vidarebefordra begäran".

  • Det innebär att serverdels-API:et returnerade HTTP 500 på grund av ett ohanterat undantag vid serverdelskoden. Det finns inget problem på APIM-nivå.

    forward-request (841.060 ms)
    {
    "response": {
    "status": {
    "code": 500,
    "reason": "Internal Server Error"
    }

  • För det tredje problemet (HTTP 429 – För många begäranden) ser det ut som om du når GRÄNSEN för API-anropsfrekvens. Förmodligen kan du kontrollera om det finns någon "rate-limit" eller "rate-limit-by-key"-princip implementerad på åtgärdsnivå.

  • Om du inte hittar några sådana principer på åtgärdsnivå klickar du på knappen Beräkna effektiv princip , som visar alla ärvda principer från olika nivåer, som om du har vissa principer på produktnivå som kan orsaka det här problemet.

  • Här bör du observera att vissa principer implementeras på API-nivå som inte riktigt begränsar API-anropsfrekvensen men efterliknar dess åtgärd genom att returnera ett anpassat svar tillbaka till klienten med hjälp av principer för "return-response" och "set-status" vid utgående avsnitt.

    <?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>
    

Kontakta oss för att få hjälp

Om du har frågor eller behöver hjälp skapar du en supportförfrågan eller frågar Azure community support. Du kan också skicka produktfeedback till Azure-feedbackcommunityn.