Ograniczenia liczby żądań

Interfejs Google Ads API egzekwuje ograniczenie liczby zapytań na sekundę (QPS) niezależnie w przypadku identyfikatorów klientów i projektów Google Cloud. Oprócz limitu liczby żądań na minutę (który mierzy częstotliwość wywołań interfejsu API) interfejs Google Ads API egzekwuje też limity liczby operacji na minutę (które mierzą łączną liczbę operacji interfejsu API w ramach żądań). Interfejs Google Ads API używa algorytmu zasobnik tokena do pomiaru żądań i określania odpowiedniego limitu zapytania/s, dlatego dokładny limit zależy od ogólnego obciążenia serwera w danym momencie.

Celem nałożenia limitów jest uniemożliwienie jednemu użytkownikowi zakłócania działania usługi innym użytkownikom przez (świadome lub nieświadome) przeciążanie serwerów interfejsu Google Ads API dużą liczbą żądań.

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

Możesz przejąć kontrolę nad aplikacją i ograniczyć limity, aktywnie zmniejszając liczbę żądań i ograniczając QPS po stronie klienta.

Istnieje kilka sposobów na zmniejszenie prawdopodobieństwa przekroczenia limitu. Zapoznanie się z koncepcjami wzorców integracji przedsiębiorstw (EIP) takimi jak przesyłanie wiadomości, ponowne dostarczanie i ograniczanie, może pomóc w tworzeniu bardziej niezawodnej aplikacji klienckiej.

Te sprawdzone metody są uporządkowane według złożoności – od najprostszych strategii po bardziej złożone architektury:

Wzrastający czas do ponowienia

Gdy aplikacja otrzyma błąd RESOURCE_TEMPORARILY_EXHAUSTED, przed ponowieniem nieudanego żądania użyj zasady wycofywania wykładniczego z losowym opóźnieniem. Wycofywanie wykładnicze stopniowo zwiększa czas oczekiwania między ponownymi próbami (na przykład czekanie 2 sekundy, potem 4 sekundy, potem 8 sekund plus niewielkie losowe opóźnienie), co pozwala na odzyskanie obciążenia serwera i limitów, a jednocześnie zapobiega synchronizowaniu się ponownych prób w instancjach klienta.

Ogranicz równoczesne działania

Jedną z głównych przyczyn przekraczania limitów jest to, że aplikacja kliencka tworzy zbyt dużą liczbę równoległych zadań. Nie ograniczamy liczby równoległych żądań, które może mieć aplikacja kliencka, ale może to spowodować przekroczenie limitu liczby żądań na sekundę na poziomie projektu Google Cloud.

Zalecamy ustawienie rozsądnego górnego limitu łącznej liczby równoczesnych zadań, które będą wysyłać żądania (we wszystkich procesach i na wszystkich maszynach), oraz zwiększenie tego limitu w celu optymalizacji przepustowości bez przekraczania limitu.

Możesz też ograniczyć QPS po stronie klienta (patrz Ograniczanie i ograniczniki).

Żądania zbiorcze

Rozważ łączenie wielu operacji w jedno żądanie. Najlepiej sprawdza się to w przypadku wywołań Mutate w różnych usługach. Jeśli na przykład aktualizujesz stan wielu instancji AdGroupAd, możesz wywołać MutateAdGroupAds tylko raz i przekazać wiele operations zamiast wywoływać MutateAdGroupAds raz dla każdej AdGroupAd. Dodatkowe przykłady znajdziesz w naszych wskazówkach dotyczących operacji zbiorczych.

Łączenie żądań w pakiety zmniejsza łączną liczbę wywołań interfejsu API i ogranicza limity liczby żądań na minutę, ale może spowodować przekroczenie limitu liczby operacji na minutę, jeśli wykonasz dużą liczbę operacji na jednym koncie.

Ograniczanie i ograniczniki

Oprócz ograniczenia łącznej liczby wątków w aplikacji możesz też zaimplementować ograniczniki po stronie klienta. Dzięki temu wszystkie wątki w procesach, klastrach lub w obu tych elementach będą podlegać określonemu limitowi QPS po stronie klienta.

Zapoznaj się z Guava RateLimiter lub zaimplementuj własny token bucket algorytm w środowisku klastrowym. Możesz na przykład zarządzać tokenami w rozproszonym, o niskim opóźnieniu magazynie danych w pamięci, takim jak Redis lub Memcached, gdzie każdy klient pobiera i zużywa token przed przetworzeniem żądania. Jeśli tokeny się wyczerpią, klient czeka, aż zostanie uzupełniona następna partia tokenów.

Kolejkowanie

Kolejka komunikatów to rozwiązanie do dystrybucji obciążenia operacjami, a także do kontrolowania liczby żądań i konsumentów. Dostępnych jest wiele opcji kolejki komunikatów – niektóre są open source, inne zastrzeżone – i wiele z nich może działać w różnych językach.

W przypadku korzystania z kolejek komunikatów możesz mieć wielu producentów wysyłających wiadomości do kolejki i wielu konsumentów przetwarzających te wiadomości. Ograniczenia można zaimplementować po stronie konsumenta, ograniczając liczbę równoczesnych konsumentów lub implementując ograniczniki liczby żądań dla producentów lub konsumentów.

Jeśli na przykład konsument wiadomości napotka błąd ograniczania 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, aby wszyscy konsumenci automatycznie zmniejszali szybkość przetwarzania podczas odzyskiwania po błędzie.