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.
GitHub membatasi berapa banyak permintaan REST API yang dapat dikirim aplikasi Anda. Saat Anda melewati batas, GitHub menolak permintaan Anda dengan status 403 atau 429 hingga batas diatur ulang atau waktu tunggu berlalu. GitHub memiliki 2 jenis batas: batas utama pada permintaan per jam, dan batas sekunder yang melindungi dari lonjakan. Jika aplikasi Anda terus mengirim permintaan saat dikenai pembatasan laju, GitHub dapat melarang integrasi Anda. Untuk informasi selengkapnya, lihat Batas laju untuk REST API.
Seperti apa batas laju GitHub terlihat
| Limit | Value | Saat Anda meninjaunya |
|---|---|---|
| Utama, tidak terautentikasi | 60 permintaan per jam, per alamat IP |
403 atau 429, dan x-ratelimit-remaining adalah 0 |
| Token akses utama, pribadi | 5.000 permintaan per jam | Sama seperti di atas |
Utama, GITHUB_TOKEN dalam GitHub Actions |
1.000 permintaan per jam, per repositori | Sama seperti di atas |
| Secondary | Misalnya, tidak lebih dari 100 permintaan bersamaan, 900 poin per menit untuk titik akhir REST, dan sekitar 80 permintaan pembuatan konten per menit |
403 atau 429 dengan pesan kesalahan.
retry-after mungkin ada. |
GitHub dapat mengubah batas sekunder tanpa pemberitahuan, dan tidak ada cara untuk memeriksa seberapa dekat Anda dengan batas tersebut.
Setiap respons menyertakan header yang memberi tahu Anda di mana Anda berdiri pada batas utama:
| Header | Apa yang diberitahukannya |
|---|---|
x-ratelimit-limit |
Jumlah permintaan maksimum yang dapat Anda kirim per jam |
x-ratelimit-remaining |
Berapa banyak permintaan yang tersisa di jendela saat ini |
x-ratelimit-used |
Berapa banyak permintaan yang Anda kirim di periode saat ini |
x-ratelimit-reset |
Saat jendela direset, dalam detik epoch UTC |
x-ratelimit-resource |
Batas yang digunakan untuk menghitung permintaan ini |
Cara menangani batas laju GitHub
- Bedakan batas laju dari kesalahan izin. GitHub juga mengembalikan
403saat token Anda tidak memiliki akses. Jika respons tidak memilikiretry-after,x-ratelimit-remainingbukan0, dan pesan tidak menyebutkan batas tarif, itu adalah masalah izin. Jangan coba ulang. - Ikuti
retry-afterdulu. Jika header ada, tunggu selama jumlah detik tersebut. - Jika tidak, tunggu reset. Jika
x-ratelimit-remainingadalah0, jangan coba lagi sampai waktu dix-ratelimit-reset. - Jika tidak, tunggu setidaknya 1 menit. Untuk batas sekunder tanpa kedua header tersebut, GitHub meminta Anda untuk menunggu setidaknya 1 menit dan menunggu lebih lama setelah setiap percobaan ulang yang gagal. Berhenti setelah sejumlah percobaan ulang yang ditetapkan dan munculkan kesalahan.
-
Pelan-pelan sebelum Anda kehabisan. Gunakan
x-ratelimit-remainingdanx-ratelimit-resetuntuk mengatur laju permintaan Anda. Jangan membangun logika di sekitar jumlah sisa yang persis, karena GitHub dapat mengubah batas. Headerx-ratelimit-*adalah sumber kebenaran, bukanGET /rate_limittitik akhir.
async function githubWaitMs(response, attempt) {
if (response.status !== 403 && response.status !== 429) {
return null;
}
const retryAfter = response.headers.get('retry-after');
if (retryAfter) {
return Number(retryAfter) * 1000;
}
if (response.headers.get('x-ratelimit-remaining') === '0') {
const resetMs = Number(response.headers.get('x-ratelimit-reset')) * 1000;
return Math.max(resetMs - Date.now(), 0);
}
const { message = '' } = await response.clone().json().catch(() => ({}));
if (response.status === 429 || /rate limit/i.test(message)) {
return 60_000 * 2 ** attempt;
}
// A 403 without rate limit signals is a permission problem: don't retry
return null;
}
Penelepon Anda mencoba kembali saat fungsi mengembalikan angka, dan berhenti setelah beberapa upaya.
Cara menguji bahwa aplikasi Anda menangani batas laju GitHub
Anda jarang mencapai rate limit GitHub saat Anda mengembangkan. Anda mengirim beberapa permintaan, dan 5.000 per jam terasa tidak ada habisnya. Jadi cara Anda menguji penanganan rate limit memutuskan apakah Anda menemukan bug sebelum pengguna Anda melakukannya.
| Approach | Apa yang Anda temukan | Yang Anda lewatkan |
|---|---|---|
| Tunggu hingga produksi siap | Kegagalan aktual | Semuanya, sampai pengguna menekannya |
| Mock API dalam pengujian Anda, atau biarkan agen pengkodan Anda menulis mock | Apakah cabang percobaan ulang Anda berjalan | Header asli GitHub dan isi body error, serta kebijakan retry SDK Anda. Aplikasi Anda juga memerlukan sakelar khusus pengujian untuk mengakses mock. |
| Panggil API nyata hingga API tersebut membatasi Anda | Perilaku sebenarnya | Dibutuhkan hingga 5.000 permintaan, Anda tidak dapat memicu batas sekunder sesuai permintaan, dan integrasi Anda berisiko diblokir |
| Mencegat lalu lintas nyata aplikasi Anda dan mengembalikan respons pembatasan laju sesuai permintaan | URL nyata, SDK nyata Anda dan kebijakan percobaan ulang, serta header dan format kesalahan GitHub sendiri | Tidak ada perubahan dalam aplikasi Anda, sehingga tidak menguji kode Anda dalam isolasi. Gunakan unit test untuk itu. |
Coba ini di aplikasi Anda
Dev Proxy mencegat permintaan aplikasi Anda ke api.github.com dan mengembalikan respons batas laju gaya GitHub, sementara aplikasi Anda terus memanggil URL nyata.
github-rate-limiting preset menghitung permintaan Anda terhadap batas 60 per jam, mengirim header x-ratelimit-*, dan mengembalikan 429 dengan API rate limit exceeded saat Anda kehabisan. Sampai saat itu, permintaan Anda masuk ke GitHub dan juga dihitung terhadap batas Anda yang sebenarnya.
Unduh preset, dan mulai Dev Proxy dengannya:
devproxy config get github-rate-limiting
devproxy --config-file "~dataFolder/configs/github-rate-limiting/.devproxy/devproxyrc.json"
Untuk menguji batas sekunder, mulai Dev Proxy dengan devproxyrc-secondary.json dari folder yang sama sebagai gantinya. Ini secara acak menghasilkan batas tarif sekunder dengan header retry-after429
Kemudian jalankan aplikasi Anda seperti biasa dan tonton apa yang dilakukannya. Untuk menginstal Dev Proxy, lihat Menyiapkan Dev Proxy.