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.