Rozwiązywanie problemów dotyczących błędów ograniczania przepływności interfejsu API

Dotyczy: ✔️ Maszyny wirtualne z systemem Linux maszyny wirtualne z ✔️ systemem Windows

Żądania usługi Azure Compute mogą być ograniczane w ramach subskrypcji i dla poszczególnych regionów, aby wesprzeć ogólną wydajność usługi. Pilnujemy, aby wszystkie wywołania do dostawcy zasobów usługi Azure Compute (CRP), który zarządza zasobami w przestrzeni nazw Microsoft.Compute, nie przekraczały maksymalnej dozwolonej liczby żądań interfejsu API. W tym dokumencie opisano ograniczanie interfejsu API, szczegółowe informacje na temat rozwiązywania problemów z ograniczaniem oraz najlepsze rozwiązania, które pozwalają uniknąć ograniczania.

Ograniczanie przepustowości przez usługę Azure Resource Manager a dostawcy zasobów

Jako drzwi wejściowe do platformy Azure usługa Azure Resource Manager wykonuje uwierzytelnianie i walidację pierwszej kolejności oraz ogranicza wszystkie przychodzące żądania interfejsu API. Limity szybkości wywołań usługi Azure Resource Manager i powiązane nagłówki HTTP odpowiedzi diagnostycznej zostały opisane tutaj.

Gdy klient interfejsu API platformy Azure otrzymuje błąd ograniczania przepustowości, stan HTTP to 429 Zbyt wiele żądań. Aby dowiedzieć się, czy ograniczanie żądań jest wykonywane przez usługę Azure Resource Manager lub bazowego dostawcę zasobów, takiego jak CRP, sprawdź x-ms-ratelimit-remaining-subscription-reads nagłówki żądań GET i x-ms-ratelimit-remaining-subscription-writes odpowiedzi dla żądań innych niż GET. Jeśli pozostała liczba wywołań zbliża się do 0, osiągnięto ogólny limit wywołań subskrypcji zdefiniowany przez usługę Azure Resource Manager. Działania wszystkich klientów subskrypcji są liczone razem. W przeciwnym razie ograniczanie przepływności pochodzi z docelowego dostawcy zasobów (ten adresowany przez /providers/<RP> segment adresu URL żądania).

Nagłówki odpowiedzi informacyjnej liczby wywołań

Nagłówek Format wartości Przykład opis
x-ms-ratelimit-remaining-resource <source RP>/<policy or bucket>;<count> Microsoft.Compute/HighCostGet; 159 Pozostała liczba wywołań interfejsu API dla zasad ograniczania przepustowości obejmujących zasobnik lub grupę operacji, w tym element docelowy tego żądania
x-ms-request-charge <count> 1 Liczba wywołań zlicza opłaty za to żądanie HTTP w kierunku limitu odpowiednich zasad. Jest to najczęściej 1. Żądania wsadowe, takie jak skalowanie zestawu skalowania maszyn wirtualnych, mogą pobierać wiele opłat.

Należy pamiętać, że żądanie interfejsu API może być objęte wieloma zasadami ograniczania przepustowości. Dla każdej zasady będzie dostępny oddzielny x-ms-ratelimit-remaining-resource nagłówek.

Oto przykładowa odpowiedź na żądanie usunięcia zestawu skalowania maszyn wirtualnych.

x-ms-ratelimit-remaining-resource: Microsoft.Compute/DeleteVMScaleSet;107 
x-ms-ratelimit-remaining-resource: Microsoft.Compute/DeleteVMScaleSet;587 
x-ms-ratelimit-remaining-resource: Microsoft.Compute/VMScaleSetBatchedVMRequests;3704 
x-ms-ratelimit-remaining-resource: Microsoft.Compute/VmssQueuedVMOperations;4720 

Szczegóły błędu ograniczania przepustowości

Stan HTTP 429 jest często używany do odrzucania żądania, ponieważ osiągnięto limit liczby wywołań. Typowa odpowiedź o błędzie ograniczania z dostawcy zasobów obliczeniowych będzie wyglądać podobnie do poniższego przykładu (wyświetlane są tylko odpowiednie nagłówki):

HTTP/1.1 429 Too Many Requests
x-ms-ratelimit-remaining-resource: Microsoft.Compute/HighCostGet;0
Retry-After: 1200
Content-Type: application/json; charset=utf-8
{
  "code": "OperationNotAllowed",
  "message": "The server rejected the request because too many requests have been received for this subscription.",
  "details": [
    {
      "code": "TooManyRequests",
      "target": "HighCostGet",
      "message": "{\"operationGroup\":\"HighCostGet\",\"startTime\":\"2018-06-29T19:54:21.0914017+00:00\",\"endTime\":\"2018-06-29T20:14:21.0914017+00:00\",\"allowedRequestCount\":300,\"measuredRequestCount\":1238}"
    }
  ]
}

Zasady z pozostałą liczbą wywołań 0 to ta, z powodu której zwracany jest błąd ograniczania przepustowości. W tym przypadku jest to HighCostGet. Ogólny format treści odpowiedzi to ogólny format błędu interfejsu API usługi Azure Resource Manager (zgodny z OData). Głównym kodem błędu jest OperationNotAllowedten, którego dostawca zasobów obliczeniowych używa do zgłaszania błędów ograniczania przepustowości (między innymi typami błędów klienta). Właściwość message błędów wewnętrznych zawiera serializowaną strukturę JSON ze szczegółami naruszenia ograniczania przepustowości.

Jak pokazano powyżej, każdy błąd ograniczania zawiera Retry-After nagłówek, który zapewnia minimalną liczbę sekund, które klient powinien czekać przed ponowieniu próby żądania.

Współczynnik wywołań interfejsu API i analizator błędów ograniczania przepustowości

Wersja zapoznawcza funkcji rozwiązywania problemów jest dostępna dla interfejsu API dostawcy zasobów obliczeniowych. Te polecenia cmdlet programu PowerShell udostępniają statystyki dotyczące szybkości żądań interfejsu API na interwał czasu na operację i naruszenia ograniczania przepustowości dla grupy operacji (zasady):

Statystyki wywołań interfejsu API mogą zapewnić doskonały wgląd w zachowanie klientów subskrypcji i umożliwić łatwą identyfikację wzorców wywołań, które powodują ograniczanie przepustowości.

Ograniczeniem analizatora jest to, że nie liczy żądań dla typów zasobów dysku i migawek (w obsłudze dysków zarządzanych). Ponieważ zbiera dane z danych telemetrycznych CRP, nie może również pomóc w identyfikowaniu błędów ograniczania przepustowości z usługi ARM. Można je jednak łatwo zidentyfikować na podstawie charakterystycznych nagłówków odpowiedzi arm, jak opisano wcześniej.

Polecenia cmdlet programu PowerShell korzystają z interfejsu API usługi REST, który można łatwo wywoływać bezpośrednio przez klientów (choć nie ma jeszcze formalnej pomocy technicznej). Aby wyświetlić format żądania HTTP, uruchom polecenia cmdlet z przełącznikiem -Debug lub snoop podczas wykonywania za pomocą programu Fiddler.

Najlepsze rozwiązania

  • Nie ponawiaj próby błędów interfejsu API usługi platformy Azure bezwarunkowo i/lub natychmiast. Typowym wystąpieniem jest przejście kodu klienta do pętli szybkiej ponawiania prób podczas napotkania błędu, który nie jest w stanie ponowić próby. Ponowne próby w końcu wyczerpują dozwolony limit wywołań dla grupy operacji docelowej i będą wpływać na innych klientów subskrypcji.
  • W przypadku automatyzacji interfejsu API o dużej ilości rozważ zaimplementowanie proaktywnego samoobsługowego ograniczania po stronie klienta, gdy dostępna liczba wywołań dla docelowej grupy operacji spadnie poniżej pewnego niskiego progu.
  • Podczas śledzenia operacji asynchronicznych należy przestrzegać wskazówek nagłówka Po ponowieniu próby.
  • Jeśli kod klienta potrzebuje informacji o określonej maszynie wirtualnej, wykonaj zapytanie bezpośrednio względem tej maszyny wirtualnej, zamiast wyświetlać listę wszystkich maszyn wirtualnych w grupie zasobów lub całej subskrypcji, a następnie wybierając wymaganą maszynę wirtualną po stronie klienta.
  • Jeśli kod klienta wymaga maszyn wirtualnych, dysków i migawek z określonej lokalizacji platformy Azure, użyj formularza opartego na lokalizacji zapytania zamiast wykonywania zapytań względem wszystkich maszyn wirtualnych subskrypcji, a następnie filtrowania według lokalizacji po stronie klienta: GET /subscriptions/<subId>/providers/Microsoft.Compute/locations/<location>/virtualMachines?api-version=2017-03-30 zapytania do regionalnych punktów końcowych dostawcy zasobów obliczeniowych.
  • Podczas tworzenia lub aktualizowania zasobów interfejsu API w szczególności maszyn wirtualnych i zestawów skalowania maszyn wirtualnych znacznie wydajniejsze jest śledzenie zwróconej operacji asynchronicznej do ukończenia niż sondowanie na samym adresie provisioningStateURL zasobu (na podstawie ).

Następne kroki

Aby uzyskać więcej informacji na temat ponawiania prób dla innych usług na platformie Azure, zobacz Wskazówki dotyczące ponawiania prób dla określonych usług.

Skontaktuj się z nami, aby uzyskać pomoc

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