Google Ads API menerapkan pembatasan kapasitas berdasarkan kueri per detik (QPS) pada ID pelanggan dan project Google Cloud secara terpisah. Selain permintaan per menit (yang mengukur frekuensi panggilan API), Google Ads API juga menerapkan batas pada operasi per menit (yang mengukur jumlah total operasi API di seluruh permintaan). Google Ads API menggunakan algoritma bucket token untuk mengukur permintaan dan menentukan batas QPS yang sesuai, sehingga batas pastinya bervariasi bergantung pada beban server keseluruhan 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 batas kapasitas dengan mengurangi jumlah permintaan secara aktif dan membatasi QPS dari sisi klien.
Ada beberapa cara untuk mengurangi kemungkinan melampaui batas kapasitas. Mempelajari konsep Enterprise Integration Patterns (EIP) seperti pesan, pengiriman ulang, dan throttling dapat membantu Anda membuat aplikasi klien yang lebih andal.
Praktik yang direkomendasikan berikut diurutkan berdasarkan kompleksitas, dengan strategi yang lebih sederhana di bagian atas dan arsitektur yang lebih andal tetapi canggih setelahnya:
- Backoff eksponensial
- Membatasi tugas serentak
- Permintaan pembuatan batch
- Throttling dan pembatas kapasitas
- Antrean
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 antar-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 melampaui pembatasan kapasitas adalah aplikasi klien membuat terlalu banyak tugas paralel. Meskipun kami tidak membatasi jumlah permintaan paralel yang dapat dimiliki aplikasi klien, hal ini dapat melampaui batas permintaan per detik di tingkat 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 melampaui batas kapasitas.
Selain itu, Anda dapat mempertimbangkan untuk membatasi QPS dari sisi klien (lihat Throttling dan pembatas kapasitas).
Permintaan pembuatan batch
Pertimbangkan untuk membuat batch beberapa operasi menjadi 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, hal ini dapat memicu pembatasan 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 pembatas 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 di-cluster. Misalnya, Anda dapat mengelola token dalam datastore dalam memori latensi rendah terdistribusi seperti Redis atau Memcached, tempat setiap klien mendapatkan 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 permintaan dan tarif konsumen. Ada beberapa opsi antrean pesan yang tersedia—beberapa open source, beberapa proprietary—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 throttler untuk produsen atau konsumen.
Misalnya, jika konsumen pesan mengalami error pembatasan kapasitas, konsumen tersebut dapat menampilkan permintaan ke antrean dengan penundaan percobaan ulang standar (menggunakan backoff eksponensial) dan memperbarui feedback loop pembatas kapasitas bersama sehingga semua konsumen otomatis mengurangi kecepatan pemrosesan saat pulih dari error.