İşlem Sınırları
API hız sınırlarını, eşzamanlılığı ve bunlar dahilinde nasıl çalışılacağını anlama
Genel Bakış
Hız sınırları, API’yi kötüye kullanıma karşı korur ve tüm kullanıcılar için adil kullanım sağlar. Moknah; hem HTTP hem de WebSocket uç noktalarımızda istek sıklığı, kredi tüketimi ve eşzamanlı bağlantılar konusunda sınırlar uygular.
Moknah tam olarak işler Kullanıcı başına aynı anda tek bir işlem.
• HTTP: Başka bir istek göndermeden önce mevcut isteğin tamamlanmasını bekleyin. Eşzamanlı istekler 409 Conflict veya 429 Too Many Requests yanıtı alır.
• WebSocket: Aynı anda yalnızca 1 aktif WebSocket bağlantısı açık tutabilirsiniz. İkinci bir bağlantı açılması durumunda, bu bağlantı 4290 koduyla anında kapatılacaktır.
Varsayılan Limitler
| Limit Türü | Değer | Şunlar için geçerlidir | Açıklama |
|---|---|---|---|
| Dakika Başına İstek (RPM) | 60 |
Sadece HTTP | Dakika başına maksimum standart API POST isteği sayısı. |
| Dakika Başına Kredi (CPM) | 10,000 |
HTTP ve WebSocket | Dakika başına tüketilen maksimum kredi. |
| Etkin Bağlantılar | 1 |
Yalnızca WebSocket | Kullanıcı başına eşzamanlı WSS akışlarının maksimum sayısı. |
WebSocket Sınırları ve Kapatma Kodları
WebSocket’ler kalıcı bir bağlantı sürdürdükleri için, hız sınırlaması amacıyla HTTP başlıklarını kullanmazlar. Bunun yerine, sınırlamalar bağlantının sonlandırılması ve JSON kontrol mesajları aracılığıyla uygulanır:
| Sınıra Ulaşıldı | Davranış / Çıktı |
|---|---|
| Eşzamanlılık Sınırı | Bağlantı, 4290 koduyla anında kapanıyor. |
| Krediler Tükendi | JSON hatası alır ve kapanır. |
| Parça Boyutu Sınırı | Tek bir metin parçası 2.000 karakteri aşarsa JSON hatası alınır. |
| Mesaj Hızı Sınırı | Metin parçalarını kuyruğun işleyebileceğinden daha hızlı gönderirseniz JSON hatası alırsınız. |
Not: WebSocket bağlantınız beklenmedik bir şekilde kesilirse, sunucu tarafındaki kilidin tamamen kalktığından emin olmak için yeniden bağlanmadan önce en az 15 saniye bekleyin.
HTTP İstek Sınırı Başlıkları
Standart REST uç noktaları için, her API yanıtı durumunuzu takip etmenize yardımcı olacak başlıklar içerir:
| Üst Bilgi | Açıklama | Örnek |
|---|---|---|
RateLimit-Limit |
Devir sınırınız | 60 |
RateLimit-Remaining |
Bu dakika içinde kalan istekler | 45 |
RateLimit-Reset |
Limitlerin sıfırlandığı Unix zaman damgası | 1699574460 |
Moknah-Credits-Remaining |
Bu dakikada kalan krediler | 10000 |
Moknah-Credits-Used |
Bu dakika kullanılan krediler | 5000 |
HTTP Hız Sınırına Takılındığında
HTTP hız sınırını aşarsanız, şu ek başlıkları içeren bir ”429 Too Many Requests” yanıtı alırsınız:
| Üst Bilgi | Açıklama | Örnek |
|---|---|---|
Retry-After |
Yeniden denemeden önce beklenecek saniye sayısı | 45 |
RateLimit-Reset |
Yeniden deneyebileceğiniz Unix zaman damgası | 1699574460 |
Kredi Hesaplaması
Krediler, metin uzunluğu ve işleme seçenekleri temel alınarak hesaplanır. WebSocket’lerde ise krediler, veriler akış halindeyken her bir parça (chunk) için dinamik olarak düşülür.
| Faktör | Çarpan | Açıklama |
|---|---|---|
| Temel maliyet | 1x |
Karakter başına 1 kredi |
| Yapay Zeka Destekli Normalizasyon | 2x |
Harekeli Arapça için gelişmiş işleme |
| Premium Ses | +% |
Premium sesler için ek yüzde |
Örnek: Yapay zeka destekli normalleştirme içeren 500 karakterlik bir metin:
500 characters × 2 (AI-Enhanced) = 1,000 credits
En İyi Uygulamalar
1. Yüksek Hacimli Ardışık Metinler için WebSocket Kullanın
Sohbet tabanlı yapay zeka yanıtları oluşturuyorsanız veya uzun belgeleri ayrıştırıyorsanız, art arda 50 adet HTTP POST isteği göndermeyin. Bunun yerine tek bir WebSocket bağlantısı açın ve veri parçalarını bu kalıcı bağlantı üzerinden akış (stream) şeklinde iletin. Bu yöntem, (kredi limitleri geçerliliğini korusa da) dakikada 60 istek (RPM) şeklindeki HTTP sınırını tamamen aşmanızı sağlar.
2. İstek Kuyruklama (HTTP) Uygula
Moknah eşzamanlı istekleri desteklemediğinden, HTTP isteklerinizi sıraya alın ve bunları sırayla işleyin:
import queue
import threading
import time
class TTSQueue:
def __init__(self, api_key):
self.api_key = api_key
self.queue = queue.Queue()
self.worker = threading.Thread(target=self._process_queue, daemon=True)
self.worker.start()
def _process_queue(self):
while True:
text, voice_id, callback = self.queue.get()
try:
result = self._generate(text, voice_id)
callback(result, None)
except Exception as e:
callback(None, e)
finally:
self.queue.task_done()
def _generate(self, text, voice_id):
# Your API call here
pass
def add(self, text, voice_id, callback):
self.queue.put((text, voice_id, callback))
# Usage
tts = TTSQueue("your_api_key")
tts.add("Hello world", "voice_123", lambda r, e: print(r or e))
class TTSQueue {
constructor(apiKey) {
this.apiKey = apiKey;
this.queue = [];
this.processing = false;
}
async add(text, voiceId) {
return new Promise((resolve, reject) => {
this.queue.push({ text, voiceId, resolve, reject });
this.processNext();
});
}
async processNext() {
if (this.processing || this.queue.length === 0) return;
this.processing = true;
const { text, voiceId, resolve, reject } = this.queue.shift();
try {
const result = await this.generate(text, voiceId);
resolve(result);
} catch (error) {
reject(error);
} finally {
this.processing = false;
this.processNext(); // Process next in queue
}
}
async generate(text, voiceId) {
// Your API call here
}
}
// Usage
const tts = new TTSQueue("your_api_key");
const audio = await tts.add("Hello world", "voice_123");
2. İstek Kuyruklama (HTTP) Uygula
Moknah eşzamanlı istekleri desteklemediğinden, HTTP isteklerinizi sıraya alın ve bunları sırayla işleyin:
import time
import random
def request_with_backoff(func, max_retries=5):
retries = 0
while retries < max_retries:
try:
response = func()
if response.status_code == 429:
retry_after = int(response.headers.get("Retry-After", 60))
# Add jitter to prevent thundering herd
wait_time = retry_after + random.uniform(0, 1)
print(f"Rate limited. Waiting {wait_time:.1f}s...")
time.sleep(wait_time)
retries += 1
continue
return response
except Exception as e:
# Exponential backoff for other errors
wait_time = (2 ** retries) + random.uniform(0, 1)
print(f"Error: {e}. Retrying in {wait_time:.1f}s...")
time.sleep(wait_time)
retries += 1
raise Exception("Max retries exceeded")
async function requestWithBackoff(func, maxRetries = 5) {
let retries = 0;
while (retries < maxRetries) {
try {
const response = await func();
if (response.status === 429) {
const retryAfter = parseInt(response.headers.get("Retry-After") || 60);
// Add jitter to prevent thundering herd
const waitTime = retryAfter + Math.random();
console.log(`Rate limited. Waiting ${waitTime.toFixed(1)}s...`);
await new Promise(r => setTimeout(r, waitTime * 1000));
retries++;
continue;
}
return response;
} catch (error) {
// Exponential backoff for other errors
const waitTime = Math.pow(2, retries) + Math.random();
console.log(`Error: ${error.message}. Retrying in ${waitTime.toFixed(1)}s...`);
await new Promise(r => setTimeout(r, waitTime * 1000));
retries++;
}
}
throw new Error("Max retries exceeded");
}
3. Üstel Geri Çekilme (Exponential Backoff) Uygulayın
İstek hızı (HTTP 429) veya bağlantı sayısı (WebSocket 4290) sınırına takıldığınızda, sunucuya spam yapmadan güvenli bir şekilde yeniden denemek için üstel geri çekilme (exponential backoff) yöntemini kullanın:
Özet
HTTP sınırları: Dakikada 60 istek, 1 eşzamanlı istek.
WebSocket sınırları: 1 eşzamanlı bağlantı, parça başına 2.000 karakter.
Genel sınırlar: 10.000 CPM (Dakika Başına Kredi).
Daha fazla kapasiteye mi ihtiyacınız var? E-posta sales@moknah.io
API ile ilgili soru veya sorunlarınız için bizimle şu adresten iletişime geçin: api@moknah.io.