Udostępnij za pośrednictwem


Rozwiązywanie problemów z wydajnością wywołań interfejsu API

Korzystając z bloga z serii rozwiązywania problemów z usługą Azure API Management, jest to czwarty scenariusz laboratorium. Upewnij się, że wykonano instrukcje konfiguracji laboratorium zgodnie z tym, aby ponownie utworzyć problem.

Oryginalna wersja produktu: usługa API Management
Oryginalny numer KB: 4464929

Symptomy

Magazyn produktów interfejsu API w usłudze APIM komunikuje się z punktem końcowym zaplecza (https://productstoreapp.azurewebsites.net), aby łatwo tworzyć, odczytywać, aktualizować i usuwać rekordy zgodnie z potrzebami. Jednak podczas wywoływania operacji interfejsu API wymienionych poniżej mogą wystąpić pewne problemy z wydajnością i wyjątki. Aby ułatwić testowanie, zachowaj tylko trzy produkty z identyfikatorami od 1 do 3.

  • Jedna z funkcji interfejsu API Products_GetAllProducts zwraca wyniki przez 5 sekund, natomiast oczekiwany czas odpowiedzi jest krótszy niż sekunda.

  • Podczas usuwania produktu z dowolnym z wymienionych powyżej identyfikatorów (od 1 do 3) otrzymujesz komunikat HTTP 500 — Wewnętrzny błąd serwera z poniższym komunikatem, wywołując operację Products_DeleteProduct .

    {
    "Komunikat": "Wystąpił błąd".
    }

  • Products_PutProduct operacji, która aktualizuje produkt jest nieoczekiwanie ograniczana, zgłaszając błąd HTTP 429 — zbyt wiele żądań z poniższym komunikatem o błędzie niezależnie od identyfikatora produktu i treści żądania, które wysyłasz w żądaniu. Jeśli na przykład klient aktualizuje cenę produktu "Pomidorowa zupa" o identyfikatorze produktu = 1 z poniższym treścią Json, otrzymuje kod stanu HTTP 429.

    Identyfikator parametru szablonu: 1
       Treść żądania: {"Name": "Zupa pomidorowa","Kategoria": "Artykuły spożywcze","Cena": 2,45}
       Treść odpowiedzi:
    {
    Przekroczono limit szybkości. Spróbuj ponownie po pewnym czasie.
    }

Kroki rozwiązywania problemów

  • Podczas rozwiązywania problemów z wydajnością najlepszą techniką izolacji błędów jest przechwytywanie [ślad inspektora APIM, który pokazuje czas potrzebny w każdej sekcji (przychodzący/ backend / wychodzący).

  • Jeśli przeanalizujesz ślad inspektora interfejsu API dla pierwszego problemu, zauważysz, że sekcja zaplecza zajmuje większość czasu (około 5 sekund), co oznacza, że w zapleczu odbywa się pewne spowolnienie lub długotrwała operacja.

    "source": "forward-request",
    "sygnatura czasowa": "2018-07-29T16:16:46.6615081Z",
    "upłynęło": "00:00:05.5844430","data": {
    "response": {
    "status": {
    "code": 200,
    "reason": "OK"
    }

  • Po odizolowaniu, że spowolnienie znajduje się w zapleczu, należy zbadać kod aplikacji zaplecza aplikacji internetowego interfejsu API. W przypadku scenariuszy, w których nie masz dostępu do zaplecza, możesz zaimplementować buforowanie na poziomie usługi APIM, jak pokazano poniżej. Dowiedz się, jak można zaimplementować zasady buforowania w celu zwiększenia wydajności w usłudze 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>
    
  • W przypadku drugiego problemu (HTTP 500 — wewnętrzny błąd serwera) wykonaj tę samą procedurę analizowania śledzenia inspektora usługi APIM i powinniśmy zobaczyć kod stanu HTTP 500 w obszarze atrybutu odpowiedzi "forward-request".

  • Oznacza to, że interfejs API zaplecza zwrócił http 500 z powodu nieobsługiwanego wyjątku w kodzie zaplecza, nie ma problemu na poziomie usługi APIM.

    forward-request (841.060 ms)
    {
    "response": {
    "status": {
    "code": 500,
    "reason": "Wewnętrzny błąd serwera"
    }

  • W przypadku trzeciego problemu (HTTP 429 — zbyt wiele żądań) wygląda na to, że osiągasz limit szybkości wywołań interfejsu API. Prawdopodobnie możesz sprawdzić, czy istnieją jakiekolwiek zasady "rate-limit" lub "rate-limit-by-key" zaimplementowane na poziomie operacji.

  • Jeśli nie możesz znaleźć żadnych takich zasad na poziomie operacji, kliknij przycisk Oblicz obowiązujące zasady , który wyświetli wszystkie dziedziczone zasady z różnych poziomów, podobnie jak niektóre zasady na poziomie produktu, które mogą powodować ten problem.

  • W tym miejscu należy zauważyć, że niektóre zasady są implementowane na poziomie interfejsu API, które naprawdę nie ograniczają szybkości wywołań interfejsu API, ale naśladują jej akcję, zwracając dostosowaną odpowiedź z powrotem do klienta przy użyciu zasad "return-response" i "set-status" w sekcji ruchu wychodzącego.

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

Skontaktuj się z nami, aby uzyskać pomoc

Jeśli masz pytania lub potrzebujesz pomocy, utwórz wniosek o pomoc techniczną lub zadaj pytanie w społeczności wsparcia dla platformy Azure. Możesz również przesłać opinię o produkcie do społeczności opinii na temat platformy Azure.