Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Tip
Kısıtlamaya yeni misiniz? Kısıtlamanın ne olduğunu ve bununla nasıl başa çıkacağınızı öğrenin.
Bir bakışta
Hedef: Uygulamanızın GitHub REST API hız sınırlarını nasıl işlediğini test edin
Süre: 15 dakika
Eklentiler:RateLimitingPlugin, GenericRandomErrorPlugin, RetryAfterPlugin
Önkoşullar:Geliştirme Ara Sunucusunu Ayarlama
Uygulamanız GitHub API'sini çağırır. Kendi makinenizde çalışır; sonra bir CI görevi, büyük bir kuruluş ya da yoğun bir gün onun oran sınırını aşmasına neden olur ve hata vermeye başlar. Bunu gerçek API üzerinde test etmek için önce oran limitinizi tüketmeniz, ardından tekrar deneyebilmeniz için bir saate kadar beklemeniz gerekir. Dev Proxy, seçtiğiniz bir sınır ve zaman penceresiyle yerel olarak GitHub hız sınırlarının simülasyonunu oluşturur.
GitHub ne döndürdüğüne bakın
GitHub REST API için 2 tür oran sınırı vardır.
Birincil hız sınırları, saatte kaç istek gönderebileceğinizi sınırlar. Örneğin, kimliği doğrulanmamış istekler için 60 ve kişisel erişim belirteci olan istekler için 5.000. Her yanıt, bulunduğunuz yeri gösteren üstbilgiler içerir:
| Header | Meaning |
|---|---|
x-ratelimit-limit |
Saat başına maksimum istek sayısı |
x-ratelimit-remaining |
Geçerli pencerede kalan istek sayısı |
x-ratelimit-reset |
Pencerenin sıfırlandığı zaman, UTC epoch saniyesi cinsinden |
Birincil sınırı aştığınızda GitHub, 403 değeri x-ratelimit-remaining olarak ayarlanmış şekilde 0 veya 429 döndürür.
x-ratelimit-reset içindeki zamana kadar yeniden denemeyin.
İkincil oran sınırlamaları, çok sayıda eşzamanlı istek veya çok kısa sürede aşırı miktarda içerik oluşturulması gibi ani yoğunluk artışlarına karşı GitHub’ı korur. Birini aştığınızda, GitHub ikincil hız sınırıyla ilgili bir iletiyle birlikte 403 veya 429 döndürür. Yanıtın retry-after üst bilgisi varsa, bu kadar saniye bekleyin. Aksi takdirde, en az bir dakika bekleyin ve istek başarısız olursa bekleme süresini artırın.
GitHub, hız sınırına takılmışken istek göndermeye devam eden entegrasyonları yasaklayabilir. Daha fazla bilgi için GitHub belgelerinde REST API için hız sınırları bölümüne bakın.
Birincil oran sınırını simüle etmek
İstekleri saymak ve GitHub hız sınırı başlıklarını döndürmek için RateLimitingPlugin kullanın. Bir saat beklemeden test etmek için küçük bir eşik ve kısa bir zaman aralığı kullanın.
Dosya: devproxyrc.json
{
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/rc.schema.json",
"plugins": [
{
"name": "RetryAfterPlugin",
"enabled": true,
"pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll"
},
{
"name": "RateLimitingPlugin",
"enabled": true,
"pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
"configSection": "githubRateLimit"
}
],
"urlsToWatch": [
"https://api.github.com/*"
],
"githubRateLimit": {
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/ratelimitingplugin.schema.json",
"headerLimit": "x-ratelimit-limit",
"headerRemaining": "x-ratelimit-remaining",
"headerReset": "x-ratelimit-reset",
"resetFormat": "UtcEpochSeconds",
"costPerRequest": 1,
"rateLimit": 5,
"resetTimeWindowSeconds": 60,
"warningThresholdPercent": 0,
"whenLimitExceeded": "Custom",
"customResponseFile": "github-rate-limit-exceeded.json"
}
}
Caution
Yapılandırma dosyanıza RetryAfterPlugin'ı RateLimitingPlugin'in önüne ekleyin. Daha sonra eklerseniz, RateLimitingPlugin, RetryAfterPlugin denetleyemeden önce isteği işler.
Özel yanıt dosyasında, birincil hız sınırını aştığınızda GitHub'ın döndürdüğü yanıtı tanımlayın.
Dosya: github-rate-limit-exceeded.json
{
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/ratelimitingplugin.customresponsefile.schema.json",
"statusCode": 429,
"headers": [
{
"name": "content-type",
"value": "application/json; charset=utf-8"
}
],
"body": {
"message": "API rate limit exceeded for user ID 1.",
"documentation_url": "https://docs.github.com/rest/overview/rate-limits-for-the-rest-api"
}
}
Geliştirme Proxy'sini başlatın ve uygulamanızı çalıştırın.
devproxy --config-file devproxyrc.json
Geliştirme Proxy'si her dakikadaki ilk 5 isteği GitHub'a iletir ve x-ratelimit-* üstbilgilerini yanıtlara ekler. 6. istekten itibaren Dev Proxy, x-ratelimit-reset değeri 0 olarak ve x-ratelimit-remaining değeri pencerenin sonu olarak ayarlanmış hız sınırı yanıtını döndürür. Uygulamanız pencere sıfırlanmasından önce API'yi yeniden çağırırsa, RetryAfterPlugin bunu bildirir ve isteği kısıtlar.
Uygulamanızın aşağıdakileri karşıladığını denetleyin:
-
x-ratelimit-remainingokur ve0öğesine ulaşmadan önce yavaşlar. - Hız sınırı yanıtını aldıktan sonra API'yi çağırmayı durdurur ve
x-ratelimit-resetolana kadar bekler. - Kullanıcıya neler olduğunu bildirir; örneğin, sessizce başarısız olmak yerine "GitHub hız sınırına ulaşıldı, 14:05'te yeniden deneniyor" mesajını gösterir.
Note
GitHub, hız sınırını aştığınızda 429 veya 403 döndürür. Uygulamanızın 403 öğesini de işlediğini test etmek için 403 öğesini statusCode olarak değiştirin.
RetryAfterPlugin yalnızca 429 yanıtlarını izler, bu nedenle bir 403 sonrasında erken yeniden denemeleri raporlamaz.
Tip
Dev Proxy, simüle edilen sınıra ulaşılana kadar istekleri GitHub'a iletir. Bu istekler, gerçek GitHub hız sınırınızdan da düşer.
İkincil oran sınırlarını simüle et
İkincil hız sınırları ani artışlarla gelir ve bir retry-after başlık içerir.
GenericRandomErrorPlugin kullanarak bunları rastgele döndürebilirsiniz.
Dosya: devproxyrc.json
{
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/rc.schema.json",
"plugins": [
{
"name": "RetryAfterPlugin",
"enabled": true,
"pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll"
},
{
"name": "GenericRandomErrorPlugin",
"enabled": true,
"pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
"configSection": "githubSecondaryRateLimit"
}
],
"urlsToWatch": [
"https://api.github.com/*"
],
"githubSecondaryRateLimit": {
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/genericrandomerrorplugin.schema.json",
"errorsFile": "github-secondary-rate-limit.json",
"rate": 50,
"retryAfterInSeconds": 60
}
}
Dosya: github-secondary-rate-limit.json
{
"$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/genericrandomerrorplugin.errorsfile.schema.json",
"errors": [
{
"request": {
"url": "https://api.github.com/*"
},
"responses": [
{
"statusCode": 429,
"headers": [
{
"name": "content-type",
"value": "application/json; charset=utf-8"
},
{
"name": "retry-after",
"value": "@dynamic"
}
],
"body": {
"message": "You have exceeded a secondary rate limit. Please wait a few minutes before you try again.",
"documentation_url": "https://docs.github.com/rest/overview/rate-limits-for-the-rest-api#about-secondary-rate-limits"
}
}
]
}
]
}
Geliştirme Proxy'sini başlatın ve uygulamanızı çalıştırın. Uygulamanızın API'yi yeniden çağırmadan önce retry-after üst bilgisindeki saniye sayısı kadar bekleyip beklemediğini denetleyin. Olmazsa, RetryAfterPlugin bunu rapor eder.
Kısıtlama eklentisiyle Octokit kullanıyorsanız, onSecondaryRateLimit ve onRateLimit işleyicilerinizin çalıştığını ve beklediğiniz sonucu döndürdüğünü denetleyin.
Sonraki adım
RateLimitingPlugin hakkında daha fazla bilgi edinin.
Ayrıca bkz.
- Rate-Limit API yanıtlarının simülasyonunu gerçekleştirme - Herhangi bir API için hız sınırlamaları
- Uygulamamın kısıtlamayı düzgün işlediğini test etme - Herhangi bir API'de kısıtlama
- RetryAfterPlugin - Yeniden deneme davranışını doğrulama
- CI/CD'de Geliştirme Proxy'si kullanma - İşlem hattınızda dayanıklılık testini otomatikleştirme