429 berarti sebuah batas telah tersentuh. Pertanyaan yang berguna adalah: batas milik siapa — server web Anda sendiri, perantara atau jaringan pengiriman di depan, API yang Anda panggil, atau aplikasinya sendiri. Masing-masing punya perbaikan berbeda, dan tajuk jawabannya biasanya menyebut yang mana.
Bacalah jawabannya dulu
curl -sSI https://yourdomain.com/api/thing | grep -i -E 'retry-after|ratelimit|x-'
Retry-After memberi tahu berapa lama Anda harus menunggu. Tajuk RateLimit menyebut batas atasnya dan sisanya. 429 tanpa tajuk-tajuk itu biasanya berasal dari server Anda sendiri, atau dari perantara yang tidak disetel untuk menjelaskan dirinya.
Kalau itu Nginx Anda sendiri
grep "limiting requests" /var/log/nginx/error.log | tail
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
location /api/ {
limit_req zone=api burst=20 nodelay;
limit_req_status 429;
}
Di belakang jaringan pengiriman atau penyeimbang beban, $binary_remote_addr adalah PERANTARANYA, sehingga semua pengunjung berbagi satu ember dan segelintir dari mereka menyentuh batas itu untuk semua orang. Siapkan dulu alamat klien yang sebenarnya — lihat Cloudflare dan IP pengunjung yang sebenarnya.
Kalau Andalah yang dibatasi
- Hormati Retry-After. Mencoba lagi seketika justru memperpanjang kebanyakan pemblokiran.
- Mundurlah secara eksponensial dengan sedikit keacakan, supaya sepasukan pekerja tidak mencoba lagi serentak.
- Singgahkan apa yang Anda ambil. Kebanyakan batas laju tersentuh karena pertanyaan yang sama diajukan berulang-ulang.
- Gabungkan bila API-nya mendukung — satu panggilan untuk lima puluh catatan, bukan lima puluh panggilan.
for i in 1 2 3 4 5; do
curl -fsS "$URL" && break
sleep $(( (2 ** i) + RANDOM % 3 ))
done
Kalau itu titik masuk untuk log masuk
Berarti ia bekerja sebagaimana mestinya. Lihat Membatasi laju pada titik masuk log masuk.