Rozwiązywanie problemów z wydajnością wywołań interfejsu API
Odwołując się do bloga w usłudze Azure API Management Troubleshooting Series, jest to czwarty scenariusz laboratorium. Upewnij się, że zostały wykonane instrukcje konfiguracji laboratorium zgodnie z tym, aby ponownie utworzyć problem.
Oryginalna wersja produktu: API Management Service
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 w razie potrzeby łatwo tworzyć, odczytywać, aktualizować i usuwać rekordy. Mogą jednak wystąpić pewne problemy z wydajnością i wyjątki podczas wywoływania operacji interfejsu API wymienionych poniżej. Aby ułatwić testowanie, zachowaj tylko trzy produkty o identyfikatorach od 1 do 3.
Jedna z funkcji interfejsu API Products_GetAllProducts zwraca wyniki przez 5 sekund, podczas gdy oczekiwany czas odpowiedzi wynosi mniej niż sekundę.
Podczas usuwania produktu o dowolnym z powyższych identyfikatorów (od 1 do 3) otrzymujesz protokół HTTP 500 — wewnętrzny błąd serwera z poniższym komunikatem, wywołując operację Products_DeleteProduct .
{
"Komunikat": "Wystąpił błąd".
}Products_PutProduct operacja, która aktualizuje produkt, jest nieoczekiwanie ograniczana, zgłaszając protokół 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 zaktualizuje cenę produktu "Zupa pomidorowa" o identyfikatorze produktu = 1 z poniższą treścią kodu JSON, otrzyma kod stanu HTTP 429.
Identyfikator parametru szablonu: 1
Treść żądania: {"Nazwa": "Zupa pomidorowa","Kategoria": "Artykuły spożywcze",Cena": 2.45}
Treść odpowiedzi:
{
Przekroczono limit szybkości. Spróbuj ponownie po pewnym czasie.
}
Czynności umożliwiające rozwiązywanie problemów
Podczas rozwiązywania problemów z wydajnością najlepszą techniką izolacji błędów jest przechwytywanie [śledzenia inspektora usługi APIM, który pokazuje czas potrzebny w każdej sekcji (przychodzące/zaplecze/ruch wychodzący).
Jeśli przeanalizujesz ślad Inspektora interfejsu API pod kątem pierwszego problemu, zauważysz, że sekcja Zaplecze zajmuje większość czasu (około 5 sekund), co oznacza, że w zapleczu jest wykonywana pewna powolność lub długotrwała operacja.
"source": "forward-request",
"sygnatura czasowa": "2018-07-29T16:16:46.6615081Z",
"elapsed": "00:00:05.5844430","data": {
"odpowiedź": {
"status": {
"kod": 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 poniżej. Przeczytaj o tym, jak 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 powinien zostać wyświetlony kod stanu HTTP 500 w atrybucie odpowiedzi "forward-request".
Oznacza to, że interfejs API zaplecza zwrócił protokół HTTP 500 z powodu pewnego nieobsługiwanego wyjątku w kodzie zaplecza, nie ma problemu na poziomie usługi APIM.
forward-request (841.060 ms)
{
"odpowiedź": {
"status": {
"kod": 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źć 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, co tak naprawdę nie ogranicza szybkości wywołań interfejsu API, ale naśladuje jego działanie, 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 platformy Azure.