Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Retry-After adalah header respons HTTP yang memberi tahu aplikasi Anda berapa lama menunggu sebelum mengirim permintaan berikutnya. Nilainya dapat berupa sejumlah detik atau tanggal HTTP. Ketika API mengirimkannya, ini adalah jawaban yang paling dapat diandalkan untuk "kapan saya dapat mencoba lagi?" karena berasal dari server yang menolak permintaan Anda. Untuk informasi selengkapnya, lihat RFC 9110, bagian 10.2.3.
Seperti apa tampilan Retry-After
Header memiliki 2 format. Aplikasi Anda perlu menangani keduanya.
| Format | Example | Apa artinya |
|---|---|---|
| Seconds | Retry-After: 120 |
Tunggu 120 detik (2 menit) dari saat Anda mendapatkan respons. Nilainya adalah bilangan bulat non-negatif. |
| Tanggal HTTP | Retry-After: Fri, 31 Dec 1999 23:59:59 GMT |
Jangan kirim permintaan lagi sebelum waktu ini. Tanggal selalu menggunakan GMT. |
Server mengirim Retry-After dengan kode status ini:
| Status | Apa Retry-After artinya |
Source |
|---|---|---|
429 Too Many Requests |
Berapa lama menunggu sebelum Anda mengirim permintaan baru. Server mungkin menyertakannya. | RFC 6585, bagian 4 |
503 Service Unavailable |
Berapa lama layanan diharapkan tidak tersedia. Server mungkin menyertakannya. | RFC 9110, bagian 15.6.4 |
413 Content Too Large |
Jika kondisi bersifat sementara, server harus menyatakan kapan kondisi tersebut akan berakhir. | RFC 9110, bagian 15.5.14 |
Pengalihan 3xx apa saja |
Waktu minimum untuk menunggu sebelum Anda mengikuti pengalihan. | RFC 9110, bagian 10.2.3 |
Header bersifat opsional. Beberapa API menggunakan header mereka sendiri sebagai gantinya. Misalnya, GitHub memberi tahu Anda kapan batas Anda diatur ulang melalui x-ratelimit-reset. Untuk informasi selengkapnya, lihat batas laju API GitHub terlampaui.
Cara menangani Retry-After
- Baca kedua format. Jika nilainya berupa angka, satuannya adalah detik. Jika tidak, parse sebagai tanggal dan kurangi waktu saat ini. Jika tanggal sudah ada di masa lalu, Anda dapat segera mencoba kembali.
- Tunggu setidaknya selama yang tertera pada header. Mencoba lagi lebih awal biasanya akan menampilkan yang lain
429atau503. Beberapa API terus menghitung permintaan Anda saat menerapkan throttling pada permintaan Anda, sehingga percobaan ulang awal dapat membuat penantian lebih lama. Misalnya, lihat panduan pembatasan Microsoft Graph. - Gunakan backoff dengan jitter sebagai cadangan ketika header hilang. Gandakan penantian setelah setiap upaya gagal, tambahkan jumlah acak sehingga banyak klien tidak mencoba kembali pada saat yang sama, dan batasi waktu tunggu maksimum.
- Batasi percobaan ulang Anda. Setelah beberapa upaya, kembalikan eror ke pemanggil.
- Periksa apakah mencoba lagi dapat membantu. Beberapa API mengembalikan
429saat kredit atau batas pengeluaran Anda habis. Menunggu tidak akan memperbaiki masalah-masalah itu. Misalnya, lihat insufficient_quota dan credit_balance_exhausted OpenAI.
function retryDelayMs(response, attempt) {
const value = response.headers.get('retry-after');
if (value) {
const seconds = Number(value);
const ms = Number.isNaN(seconds) ? Date.parse(value) - Date.now() : seconds * 1000;
if (!Number.isNaN(ms)) {
return Math.max(ms, 0);
}
}
// No usable header: exponential backoff with jitter, capped at 30 seconds
return Math.random() * Math.min(30_000, 1_000 * 2 ** attempt);
}
Apa yang dilakukan SDK populer
Banyak SDK yang menangani Retry-After untuk Anda, tetapi hanya sampai kehabisan percobaan ulang. Kemudian kode Anda mengalami error.
| SDK | Apa yang dilakukannya secara default |
|---|---|
| .NET penangan ketahanan standar | Mencoba ulang respons 408, 429, dan 5xx hingga 3 kali dengan backoff eksponensial dan jitter. Ini menggunakan Retry-After untuk penundaan karena ShouldRetryAfterHeader default ke true. |
| SDK untuk Microsoft Graph | Gunakan Retry-After saat ada, dan beralih ke backoff eksponensial saat tidak. Permintaan di dalam batch JSON tidak dicoba ulang secara otomatis. |
| OpenAI Python SDK | Mencoba ulang saat terjadi kesalahan koneksi dan respons 408, 409, 429, dan 5xx sebanyak 2 kali dengan backoff eksponensial singkat. Atur max_retries untuk mengubahnya. |
Periksa dokumentasi SDK Anda untuk kebijakan yang tepat, dan uji apa yang terjadi setelah upaya percobaan ulang terakhir gagal.
Cara menguji bahwa aplikasi Anda menangani Retry-After
Anda jarang mendapatkan Retry-After saat Anda mengembangkan, dan ketika Anda melakukannya, Anda tidak dapat mengontrol nilainya. Jadi cara Anda menguji ini menentukan apakah Anda menemukan bug sebelum pengguna Anda melakukannya.
| Approach | Apa yang Anda temukan | Yang Anda lewatkan |
|---|---|---|
| Tunggu hingga siap produksi | Kegagalan aktual | Semuanya, sampai pengguna mengkliknya |
| Mock API dalam pengujian Anda, atau biarkan agen coding Anda menulis mock | Apakah kode Anda mengurai header | Apakah klien HTTP atau SDK asli Anda menunggu cukup lama, dan apa yang benar-benar dikirim oleh API. Aplikasi Anda juga memerlukan sakelar khusus pengujian untuk mengakses mock. |
| Panggil API nyata sampai membatasi laju permintaan Anda | Perilaku riil | Anda tidak dapat memicu respons yang terkena pembatasan laju sesuai permintaan, dan Anda menghabiskan kuota aktual Anda |
| Mencegat lalu lintas nyata aplikasi Anda dan mengembalikan respons yang diperlambat sesuai permintaan | Apakah SDK asli Anda dan kebijakan percobaan ulang Anda menunggu selama yang dinyatakan header | Tidak ada yang berubah pada aplikasi Anda, sehingga tidak menguji kode Anda secara terisolasi. Gunakan pengujian unit untuk itu. |
Coba ini di aplikasi Anda
Dev Proxy mencegat permintaan aplikasi Anda ke API yang Anda pilih dan mengembalikan 429 respons dengan Retry-After header, sementara aplikasi Anda terus memanggil URL nyata.
RetryAfterPlugin mengingat ketika setiap permintaan yang dibatasi dapat dicoba kembali. Jika aplikasi Anda memanggil URL yang sama sebelum waktu tersebut, Dev Proxy melaporkannya dan membatasi permintaan lagi. Plugin hanya melacak 429 respons saja.
Dalam file kesalahan Anda untuk GenericRandomErrorPlugin, atur nilai Retry-After dari respons 429 ke @dynamic, dan Dev Proxy mengisi jumlah detik dan melacaknya untuk Anda.
Untuk mencobanya, unduh preset yang menggunakan kedua plugin, dan mulai Dev Proxy dengannya:
devproxy config get openai-throttling
devproxy --config-file "~dataFolder/configs/openai-throttling/.devproxy/devproxyrc.json"
Kemudian jalankan aplikasi Anda seperti biasa dan tonton apa yang dilakukannya. Untuk menginstal Dev Proxy, lihat Menyiapkan Dev Proxy.