Domain API Hız Limiti, Soft Quota ve Throttling Politikası

Bu sayfadaki her şey iki sayıya bakıyor: 2 ve 200. Saniyede iki istek, dakikada iki yüz kota puanı. Bu ikisini bilirseniz politikayı zaten biliyorsunuz — gerisi dört işlem ve birkaç kod parçası.
Domain Name API her bayi hesabına birbirinden bağımsız iki denetim uyguluyor. Birincisi katı bir hız limiti: aşarsanız HTTP 429 alırsınız. İkincisi soft quota ve birinciye hiç benzemiyor — hiçbir isteği reddetmiyor, yavaşlatıyor. Bu makalenin asıl konusu tam olarak bu fark, çünkü ikisini birbirine karıştıran bir entegrasyon var olmayan bir hatanın peşinde bir öğleden sonra harcıyor.
Saniyede en fazla 2 istek gönderin; daha hızlısı HTTP 429 döner. Bundan bağımsız olarak her çağrının bir puanı var:
/domains/search ve /domains/info 1 puan, diğer tüm endpoint’ler 10 puan. 60 saniyede 200 puan hakkınız var. Bunu doldurduğunuzda hiçbir şey başarısız olmuyor — yanıtlarınız yalnızca yarım saniye kadar geç gelmeye başlıyor, aynı hızda devam ederseniz bu gecikme 5 saniyelik tavana kadar tırmanıyor. Hızınızı düşürdüğünüzde gecikme de geri iniyor. Her iki limit de bayi başına sayılıyor, API anahtarı başına değil.İçindekiler
- Bir bakışta kurallar
- İki katman: hız limiti ve soft quota
- Hangi istek kaç puan?
- Gerçek bütçeniz, sayılarla
- Kota dolduğunda ne oluyor?
- HTTP 429 hatası nasıl çözülür?
- Kod örnekleri: C#, PHP, Python, Node.js
- İstek akış diyagramı
- Gerçekten işe yarayan uygulamalar
- Sık yapılan entegrasyon hataları
- Sıkça sorulan sorular
- Bu limitler neden var?
- Daha yüksek limit nasıl talep edilir?
Bir Bakışta Kurallar
Politikanın söylediği her şey tek tabloda. Bu tabloyu entegrasyon ekibinize iletmeniz çoğu zaman yeterli oluyor.
İki Katman: Hız Limiti ve Soft Quota
Bu iki denetim farklı ölçülüyor, farklı tepki veriyor ve farklı çözülüyor. Bu konudaki neredeyse her destek talebi, ikisinin tek şey sanılmasıyla başlıyor.
Hız limiti — saniyede 2 istek
Bu limit isteği sayıyor, değerini değil. Saniyede iki istek, çalıştırdığınız tüm thread, worker, container ve cron işlerinin toplamı için geçerli tavandır.
- Aşılırsa HTTP 429 döner ve istek çalışmaz
- Anında tepki verir — tek bir yoğun saniye yeterlidir
- Çözümü kodunuzdaki tek bir ortak limiter’dır
Soft quota — 60 saniyede 200 puan
Bu limit değeri sayıyor, isteği değil. Ucuz bir sorgulama ile pahalı bir kayıt işlemi arkadaki sistemler için aynı yük değil; dolayısıyla aynı fiyatı taşımıyorlar.
- Aşılırsa yanıtlarınız geciktirilir — hiçbir şey reddedilmez
- Ceza değil fren; kendiliğinden bırakır
- Çözümü hızı ayarlamak ya da daha az pahalı çağrı yapmaktır
__reseller kimliğinizi taşıdığı için, hangi anahtarla imzalanmış olursa olsun hepsi aynı kovaya düşüyor.Hangi İstek Kaç Puan?
İki endpoint ucuz, çünkü salt okunur ve müşterileriniz neyi satın alacağına karar verirken sitenizde canlı olarak tetikledikleri çağrılar bunlar. Diğer her şey bir registry’ye, bir fatura kaydına ya da bir sertifika otoritesine ulaşıyor; asıl maliyeti onlar taşıyor.
bulk-search kuralı çoğu kişiyi şaşırtıyor. Dizide kaç isim olursa olsun sabit 10 puan. Başabaş noktası on isim: onun altında /domains/search döngüsü daha ucuz, tam onda berabere, onun üstünde bulk-search kazanıyor ve kazanmayı sürdürüyor. 200 ismi tek tek sorgulamak 200 puan, dört toplu çağrıyla sorgulamak 40 puan.Gerçek Bütçeniz, Sayılarla
İki limit birbiriyle etkileşiyor ve hangisine takılacağınız tamamen ne çağırdığınıza bağlı. Masanızın üstüne asmaya değer tablo bu.
Çalışılmış örnek: 500 domain sorgulamak
/domains/search ile tek tek sorgularsanız 500 çağrı ve 500 puan eder. Kota bunu iki buçuk dakikada harcamanıza izin verirdi — ama saniyede 2 istekle duvar saati zaten 250 saniye, yani belirleyici olan hız limiti ve fren hiç devreye girmiyor. bulk-search ile 50’şerlik gruplar hâlinde aynı iş 10 çağrı, 100 puan ve yaklaşık 5 saniye. Aynı cevap, elli kat hızlı ve 500 yerine 100 puan harcıyor.
Çalışılmış örnek: 100 domain kaydetmek
Yüz kayıt işlemi 1.000 puan eder ve kota dakikada 200 puan serbest bırakır. Bu iş en az beş dakika sürer; paralelliğin miktarı bunu değiştirmez. Tam hızla gönderirseniz ilk on saniyede kotayı doldurur, kalan doksan saniyeyi büyüyen bir gecikmenin arkasında sürünerek geçirirsiniz. Üç saniyede bir gönderirseniz aynı beş dakikada bitirir, üstelik her yanıt zamanında gelir. Yavaş sürüm aslında daha yavaş değil — işin gerçekte ne kadar sürdüğü konusunda yalnızca daha dürüst.
Kota Dolduğunda Ne Oluyor?
Dramatik hiçbir şey olmuyor; sorun da tam olarak bu — fren sessiz çalışıyor ve sessiz belirtiler insanın bir öğleden sonrasına mal olan belirtiler.
HTTP 429 Hatası Nasıl Çözülür?
Burada 429 her zaman tek bir anlama gelir: aynı saniye içinde sizin tarafınızdan ikiden fazla istek çıkmıştır. Kotayla ilgisi yoktur, kaç domain yönettiğinizle de ilgisi yoktur. Şu adımları sırayla uygulayın.
- Göndermeyi durdurun. Endpoint’i zorlamaya devam etmek sizi çizginin üstünde tutar ve bir 429’u 429 seline çevirir.
- Yanıtta
Retry-Aftervarsa ona uyun, yoksa en az bir saniye bekleyin. - Bir kez yeniden deneyin. Ani bir yığından sonra tek bir 429 normaldir ve tek deneme genelde yeterli olur.
- Tekrarlıyorsa üstel geri çekilme uygulayın — 1 sn, 2 sn, 4 sn, 8 sn — makul bir tavanla.
- Sonra asıl sebebi bulun. On vakanın dokuzunda sebep, her biri kendi limiter’ını taşıyan paralel worker’lardır; “saniyede 2” diyen dört worker aslında sekiz gönderiyordur.
Kod Örnekleri
İşe yarayan kalıp her zaman aynı: tüm süreç için tek kapı, istekler arasında asgari bir aralık ve ısrar etmek yerine bekleyen bir yeniden deneme. Aşağıdaki örnekler saniyede iki istek hızında ilerliyor; iş yükünüz 10 puanlık çağrılardan oluşuyorsa aralığı 3 saniyeye çıkarın, frene hiç rastlamazsınız.
C# (.NET)
// Tum surec icin tek kapi. Her worker buradan geciyor.
private static readonly SemaphoreSlim Gate = new(1, 1);
private static DateTime _next = DateTime.UtcNow;
// 500 ms -> 1 puanlik cagrilarda saniyede 2. 10 puanlik cagrilarda 3000 ms.
private static readonly TimeSpan MinInterval = TimeSpan.FromMilliseconds(500);
async Task<HttpResponseMessage> SendAsync(Func<HttpRequestMessage> build)
{
var backoff = TimeSpan.FromSeconds(1);
for (var attempt = 1; attempt <= 6; attempt++)
{
await Gate.WaitAsync();
try
{
var wait = _next - DateTime.UtcNow;
if (wait > TimeSpan.Zero) await Task.Delay(wait);
_next = DateTime.UtcNow + MinInterval;
}
finally { Gate.Release(); }
// HttpRequestMessage tek kullanimliktir, her denemede yenisini uretin.
var response = await _http.SendAsync(build());
if ((int)response.StatusCode != 429) return response;
var after = response.Headers.RetryAfter?.Delta ?? backoff;
response.Dispose();
await Task.Delay(after);
backoff = TimeSpan.FromSeconds(Math.Min(backoff.TotalSeconds * 2, 30));
}
throw new HttpRequestException("Hiz limiti 6 denemede acilmadi.");
} PHP (WHMCS, WordPress, cPanel)
<?php
// 500000 mikrosaniye = 0,5 sn -> saniyede 2. 10 puanlik cagrilarda 3000000.
const DNA_MIN_INTERVAL_US = 500000;
function dna_request(string $method, string $path, ?array $body = null) {
static $next = 0;
$backoff = 1;
for ($attempt = 1; $attempt <= 6; $attempt++) {
$now = (int) (microtime(true) * 1000000);
if ($now < $next) usleep($next - $now);
$next = (int) (microtime(true) * 1000000) + DNA_MIN_INTERVAL_US;
$ch = curl_init('https://api.domainresellerapi.com/api/v1' . $path);
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30, // 10'un altina asla inmeyin
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'__reseller: ' . DNA_RESELLER_ID,
'X-API-KEY: ' . DNA_API_KEY,
],
CURLOPT_POSTFIELDS => $body === null ? null : json_encode($body),
]);
$raw = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
if ($status !== 429) return json_decode($raw, true);
sleep($backoff);
$backoff = min($backoff * 2, 30);
}
throw new RuntimeException('Hiz limiti 6 denemede acilmadi.');
} Python (script ve otomasyon)
import threading, time, requests
BASE = "https://api.domainresellerapi.com/api/v1"
HEADERS = {"__reseller": RESELLER_ID, "X-API-KEY": API_KEY}
# 0,5 sn -> 1 puanlik cagrilarda saniyede 2. 10 puanlik cagrilarda 3.0.
MIN_INTERVAL = 0.5
_lock, _next = threading.Lock(), 0.0
def dna_request(method, path, **kwargs):
global _next
backoff = 1.0
for _ in range(6):
with _lock: # tek kapi, butun thread'ler
wait = _next - time.monotonic()
if wait > 0:
time.sleep(wait)
_next = time.monotonic() + MIN_INTERVAL
# timeout, 5 sn'lik soft quota tavanini rahatca asmali
r = requests.request(method, BASE + path, headers=HEADERS,
timeout=30, **kwargs)
if r.status_code != 429:
return r.json()
time.sleep(float(r.headers.get("Retry-After", backoff)))
backoff = min(backoff * 2, 30)
raise RuntimeError("Hiz limiti 6 denemede acilmadi.") Node.js (JavaScript / TypeScript)
const BASE = 'https://api.domainresellerapi.com/api/v1';
const MIN_INTERVAL = 500; // saniyede 2; 10 puanlik cagrilarda 3000
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
// Node'da en basit tek kapi bir promise zinciridir: `tail`i beklemek
// kac cagiran paralel baslamis olursa olsun hepsini siraya sokar.
let tail = Promise.resolve();
function pace() {
const turn = tail.then(() => sleep(MIN_INTERVAL));
tail = turn;
return turn;
}
export async function dnaRequest(method, path, body) {
let backoff = 1000;
for (let attempt = 1; attempt <= 6; attempt++) {
await pace();
const res = await fetch(BASE + path, {
method,
headers: {
'Content-Type': 'application/json',
__reseller: process.env.DNA_RESELLER_ID,
'X-API-KEY': process.env.DNA_API_KEY,
},
body: body ? JSON.stringify(body) : undefined,
signal: AbortSignal.timeout(30000), // 10000'in altina asla inmeyin
});
if (res.status !== 429) return res.json();
const after = Number(res.headers.get('Retry-After')) * 1000 || backoff;
await sleep(after);
backoff = Math.min(backoff * 2, 30000);
}
throw new Error('Hiz limiti 6 denemede acilmadi.');
} İstek Akış Diyagramı
Her çağrı aynı yoldan geçiyor. İki kontrol noktası birbirinden bağımsız ve yalnızca biri sizi reddedebiliyor.
1. Sizin kuyruğunuz
Tek bir ortak kapı bir isteği serbest bırakır. Sürecinizdeki başka hiçbir şeyin bunu atlamasına izin verilmez.
2. Hız kontrolü
Bu saniyede 2 istekten fazla mı? Yanıt HTTP 429’dur ve istek burada durur.
3. Kota kontrolü
Puanlar dakikanıza eklenir. 200’ün üstünde mi? Yanıt bekletilir, sonra yine de gönderilir.
4. Sizin işleyiciniz
429 “geri çekil ve tekrar dene” demektir. Yavaş gelen bir 200 ise “yavaşla” demektir — bozulan bir şey yok.
Gerçekten İşe Yarayan Uygulamalar
- Süreç başına tek limiter, worker başına değil. Her thread kendi limiter’ını taşıyorsa gerçek hızınız limit çarpı thread sayınızdır. 429’ların çoğunun tek sebebi bu.
- On ismin üstünde
bulk-search’e geçin. Tek çağrı, 10 puan, tek gidiş dönüş. Uzun listelerde tasarruf hızla katlanıyor. - Agresif önbellekleyin ve göndermeden önce tekrarları ayıklayın. Dört saniye önce sorguladığınız isim değişmedi ve uzun girdi listeleri tekrarlarla dolu.
- İstemci zaman aşımını 10 saniye ya da üstünde tutun. 5 saniyelik tavanı rahatça aşması gerekiyor; yoksa fren size ağ hatası kılığında ulaşır.
- Zamanlanmış işlerinizi dağıtın. Filonuzdaki her cron dakikanın başında başlıyorsa ani yığını bilerek inşa etmişsiniz demektir. Birkaç saniyelik rastgele kaydırma bedava ve sorunu çözüyor.
- Kendi 429 oranınızı izleyin. Elinizdeki en erken sinyal budur ve müşteri bir şey fark etmeden çok önce tırmanır.
- Kuyruklarınızı sayıya göre değil maliyete göre ayırın. Kayıt ve yenilemelere kendi yavaş şeridini verin, canlı müsaitlik sorguları tam hızda aksın. İkisini tek hızın arkasında karıştırmak, toplu işleriniz yüzünden sitenizi cezalandırır.
Sık Yapılan Entegrasyon Hataları
- Her biri kendi başına “saniyede 2” uygulayan paralel worker’lar çalıştırmak; sekiz worker on altı istek gönderir.
- Dört
bulk-searchçağrısının aynı soruyu yanıtlayacağı yerde 500 isimlik listede/domains/searchdöngüsü kurmak. - Soft quota gecikmesini ağ arızası sanıp zaman aşımını düşürmek; bu, yavaş bir başarıyı kesin bir hataya çevirir.
- 429 sonrası anında yeniden denemek; bu, bir 429 daha almayı garantiler.
- Aynı domain’i kısa bir pencere içinde defalarca yeniden sorgulamak.
- Ek hak bekleyerek fazladan API anahtarı oluşturmak — sayaç anahtarı değil bayiyi takip ediyor.
async’in, thread’lerin ya da ayrı container’ların ayrı bütçe aldığını varsaymak. Almıyorlar; hepsi aynı__resellerbaşlığını taşıyor.
Sıkça Sorulan Sorular
Bu Limitler Neden Var?
Sizi yavaşlatmak için değil — her şeyi otomatikleştirmeniz bizim için sorun değil, en büyük bayilerimizin çoğu da zaten öyle yapıyor. Kısıt daha yukarıda. API’mizin arkasında registry’ler var ve birkaçı bizden epey daha az hoşgörülü. Ani bir yığın bir registry’ye istediğinden hızlı ulaştığında kibarca yavaşlatmıyor; hata döndürmeye başlıyor. O hatalar da sizin müşterinizin kayıt denemesine düşüyor ve arıza registry’nin değil sizin görünüyor.
Soft quota, o basıncı size aktarmak yerine kendimiz soğurabilelim diye var. Yarım saniyelik ek gecikme, başarısız bir kayıttan çok daha iyi bir sonuç; çoğu API’nin tercih ettiği alternatiften, yani isteği doğrudan reddetmekten ise kat kat iyi. Toplu işinizin beş dakika sürmesini, iki dakika sürüp yolda on bir domain kaybetmesine tercih ederiz.
Ayrıca API’yi açık tutuyor. Freni olmayan ortak bir platform, sonunda otomasyona geçmek isteyen herkesin önüne onay kapıları ve manuel incelemeler koymak zorunda kalıyor. Fren, bizim “evet” demeyi sürdürebilmemizi sağlayan şey.
