Batas kapasitas

Google Ads API menerapkan pembatasan kapasitas berdasarkan kueri per detik (QPS) pada ID pelanggan dan project Google Cloud secara independen. Selain permintaan per menit (yang mengukur frekuensi panggilan API), Google Ads API juga menerapkan batas operasi per menit (yang mengukur jumlah total operasi API di seluruh permintaan). Google Ads API menggunakan algoritma token bucket untuk mengukur permintaan dan menentukan batas QPS yang sesuai, sehingga batas pastinya bervariasi bergantung pada keseluruhan beban server pada waktu tertentu.

Tujuan penerapan batas kapasitas adalah untuk mencegah satu pengguna mengganggu layanan bagi pengguna lain dengan (baik secara sengaja maupun tidak sengaja) membebani server Google Ads API dengan volume permintaan yang tinggi.

Permintaan yang melanggar pembatasan kapasitas akan ditolak dengan error: RESOURCE_TEMPORARILY_EXHAUSTED.

Anda dapat mengontrol aplikasi dan mengurangi pembatasan kapasitas dengan secara aktif mengurangi jumlah permintaan dan membatasi QPS dari sisi klien.

Ada beberapa cara untuk mengurangi kemungkinan terlampauinya batas kapasitas. Mengenal konsep Pola Integrasi Enterprise (EIP) seperti pengiriman pesan, pengiriman ulang, dan throttling dapat membantu Anda membangun aplikasi klien yang lebih tangguh.

Praktik yang direkomendasikan berikut diurutkan berdasarkan kompleksitas, dengan strategi yang lebih sederhana di bagian atas dan arsitektur yang lebih kuat, tetapi canggih setelahnya:

Backoff eksponensial

Saat aplikasi Anda menerima error RESOURCE_TEMPORARILY_EXHAUSTED, gunakan kebijakan backoff eksponensial dengan jitter acak sebelum mencoba lagi permintaan yang gagal. Backoff eksponensial secara progresif meningkatkan waktu tunggu di antara percobaan ulang (misalnya, menunggu 2 detik, lalu 4 detik, lalu 8 detik, ditambah penundaan acak kecil), sehingga beban server dan bucket kuota dapat pulih sekaligus mencegah lonjakan percobaan ulang yang disinkronkan di seluruh instance klien.

Membatasi tugas serentak

Salah satu penyebab utama terlampauinya pembatasan kapasitas adalah aplikasi klien memunculkan jumlah tugas paralel yang berlebihan. Meskipun kami tidak membatasi jumlah permintaan paralel yang dapat dimiliki aplikasi klien, hal ini dapat melebihi batas permintaan per detik di level project Google Cloud.

Sebaiknya tetapkan batas atas yang wajar untuk jumlah total tugas serentak yang akan membuat permintaan (di semua proses dan mesin), dan sesuaikan ke atas untuk mengoptimalkan throughput tanpa melebihi batas kapasitas.

Selain itu, Anda dapat mempertimbangkan untuk melakukan throttling QPS dari sisi klien (lihat Throttling dan pembatas kapasitas).

Permintaan pembuatan batch

Pertimbangkan untuk mengelompokkan beberapa operasi ke dalam satu permintaan. Hal ini paling berlaku pada panggilan Mutate untuk berbagai layanan. Misalnya, jika Anda memperbarui status untuk beberapa instance AdGroupAd, Anda dapat memanggil MutateAdGroupAds sekali, dan meneruskan beberapa operations, bukan memanggil MutateAdGroupAds sekali untuk setiap AdGroupAd. Lihat panduan operasi batch kami untuk beberapa contoh tambahan.

Meskipun permintaan batch mengurangi jumlah total panggilan API dan mengurangi pembatasan kapasitas pada permintaan per menit, permintaan batch dapat memicu batas kapasitas operasi per menit jika Anda melakukan sejumlah besar operasi terhadap satu akun.

Throttling dan pembatas kapasitas

Selain membatasi jumlah total thread dalam aplikasi, Anda juga dapat menerapkan pembatasan kapasitas di sisi klien. Hal ini memastikan semua thread di seluruh proses, cluster, atau keduanya diatur oleh batas QPS tertentu dari sisi klien.

Lihat Guava RateLimiter, atau terapkan algoritma token bucket Anda sendiri untuk lingkungan yang dikelompokkan. Misalnya, Anda dapat mengelola token di datastore dalam memori terdistribusi dan berlatensi rendah seperti Redis atau Memcached, tempat setiap klien memperoleh dan menggunakan token sebelum memproses permintaan. Jika token habis, klien akan menunggu hingga batch token berikutnya diisi ulang.

Antrean

Antrean pesan adalah solusi untuk distribusi beban operasi, sekaligus mengontrol rasio permintaan dan konsumen. Ada sejumlah opsi antrean pesan yang tersedia—beberapa open source, beberapa eksklusif—dan banyak di antaranya dapat berfungsi dengan berbagai bahasa.

Saat menggunakan antrean pesan, Anda dapat memiliki beberapa produsen yang mengirim pesan ke antrean dan beberapa konsumen yang memproses pesan tersebut. Throttling dapat diterapkan di sisi konsumen dengan membatasi jumlah konsumen serentak, atau dengan menerapkan pembatas kapasitas atau throttling untuk produsen atau konsumen.

Misalnya, jika konsumen pesan mengalami error batas kapasitas, konsumen tersebut dapat mengembalikan permintaan ke antrean dengan penundaan percobaan ulang standar (menggunakan backoff eksponensial) dan memperbarui feedback loop pembatas kapasitas bersama sehingga semua konsumen secara otomatis mengurangi tingkat pemrosesan mereka saat pulih dari error.