Ograniczenia liczby żądań

Interfejs Google Ads API wymusza ograniczenie liczby żądań na sekundę (QPS) zarówno w przypadku identyfikatorów klienta, jak i projektów Google Cloud. Oprócz limitów żądań na minutę (które mierzą częstotliwość wywołań interfejsu API) interfejs Google Ads API wymusza też limity operacji na minutę (które mierzą łączną liczbę operacji interfejsu API we wszystkich żądaniach). Interfejs Google Ads API używa algorytmu zasobnika tokena do pomiaru żądań i określania odpowiedniego limitu QPS, więc dokładny limit różni się w zależności od ogólnego obciążenia serwera w danym momencie.

Ograniczenia liczby żądań mają na celu zapobieganie zakłócaniu działania usługi przez jednego użytkownika, który (celowo lub nie) przeciąża serwery interfejsu Google Ads API dużą liczbą żądań.

Żądania, które naruszają limity liczby żądań, są odrzucane z błędem: RESOURCE_TEMPORARILY_EXHAUSTED.

Możesz przejąć kontrolę nad aplikacją i złagodzić ograniczenia liczby żądań, aktywnie zmniejszając liczbę żądań i ograniczając liczbę zapytań na sekundę po stronie klienta.

Istnieje kilka sposobów na zmniejszenie prawdopodobieństwa przekroczenia limitu liczby żądań. Zapoznanie się z pojęciami związanymi ze wzorcami integracji przedsiębiorstwa (EIP), takimi jak przesyłanie wiadomości, ponowne dostarczanie i ograniczanie przepustowości, może pomóc w utworzeniu bardziej niezawodnej aplikacji klienckiej.

Poniższe sprawdzone metody są uporządkowane według złożoności – od prostszych strategii po bardziej rozbudowane, ale zaawansowane architektury:

Wzrastający czas do ponowienia

Gdy aplikacja otrzyma błąd RESOURCE_TEMPORARILY_EXHAUSTED, przed ponowną próbą wykonania nieudanego żądania użyj zasady wzrastającego czasu do ponowienia z losowym jitterem. Wzrastający czas do ponowienia stopniowo wydłuża czas oczekiwania między próbami (na przykład 2 sekundy, potem 4 sekundy, potem 8 sekund, plus niewielkie losowe opóźnienie), co pozwala na odzyskanie obciążenia serwera i zasobników limitów, a jednocześnie zapobiega zsynchronizowanym skokom liczby ponownych prób w instancjach klienta.

Ogranicz równoczesne działania

Jedną z głównych przyczyn przekroczenia limitów liczby żądań jest to, że aplikacja kliencka generuje nadmierną liczbę zadań równoległych. Chociaż nie ograniczamy liczby żądań równoległych, które może wysyłać aplikacja kliencka, może to przekroczyć limit żądań na sekundę na poziomie projektu Google Cloud.

Zalecamy ustawienie rozsądnej górnej granicy łącznej liczby równoczesnych zadań, które będą wysyłać żądania (we wszystkich procesach i na wszystkich maszynach), i dostosowanie jej w górę, aby zoptymalizować przepustowość bez przekraczania limitu liczby żądań.

Możesz też rozważyć ograniczenie liczby zapytań na sekundę po stronie klienta (patrz Ograniczanie i limity liczby żądań).

Grupowanie żądań

Rozważ połączenie wielu operacji w jedno żądanie. Dotyczy to głównie połączeń Mutate z różnymi usługami. Jeśli na przykład aktualizujesz stan wielu instancji AdGroupAd, możesz wywołać MutateAdGroupAds raz i przekazać wiele operations zamiast wywoływać MutateAdGroupAds raz dla każdego AdGroupAd. Więcej przykładów znajdziesz w naszych wskazówkach dotyczących operacji zbiorczych.

Chociaż grupowanie żądań zbiorczych zmniejsza łączną liczbę wywołań interfejsu API i ogranicza limity żądań na minutę, może spowodować przekroczenie limitu operacji na minutę, jeśli wykonujesz dużą liczbę operacji na jednym koncie.

Ograniczanie przepustowości i liczby żądań

Oprócz ograniczenia łącznej liczby wątków w aplikacji możesz też wdrożyć ograniczniki liczby żądań po stronie klienta. Dzięki temu wszystkie wątki w procesach lub klastrach podlegają określonemu limitowi zapytań na sekundę po stronie klienta.

Zobacz Guava RateLimiter lub zaimplementuj własny algorytm zasobnika tokena dla środowiska klastrowego. Możesz na przykład zarządzać tokenami w rozproszonym magazynie danych w pamięci o małych opóźnieniach, takim jak Redis lub Memcached, gdzie każdy klient uzyskuje i wykorzystuje token przed przetworzeniem żądania. Jeśli tokeny się wyczerpią, klient czeka, aż zostanie uzupełniona kolejna partia tokenów.

Kolejkowanie

Kolejka wiadomości to rozwiązanie do dystrybucji obciążenia operacyjnego, które jednocześnie kontroluje liczbę żądań i konsumentów. Dostępnych jest wiele opcji kolejek wiadomości – niektóre są open source, inne są zastrzeżone, a wiele z nich może działać z różnymi językami.

Podczas korzystania z kolejek wiadomości możesz mieć wielu producentów przesyłających wiadomości do kolejki i wielu konsumentów przetwarzających te wiadomości. Ograniczenia można wdrożyć po stronie konsumenta, ograniczając liczbę jednoczesnych konsumentów lub wdrażając ograniczniki liczby żądań lub ograniczniki przepustowości dla producentów lub konsumentów.

Jeśli na przykład konsument wiadomości napotka błąd związany z ograniczeniem liczby żądań, może zwrócić żądanie do kolejki ze standardowym opóźnieniem ponowienia (przy użyciu wzrastającego czasu do ponowienia) i zaktualizować wspólną pętlę informacji zwrotnych ogranicznika liczby żądań, aby wszyscy konsumenci automatycznie zmniejszyli szybkość przetwarzania podczas przywracania po błędzie.