API'de Bulk Operasyonlar: Batch Boyutu Optimizasyonu
Bulk operasyonlar (toplu işlemler) sırasında batch boyutunu yanlış seçmek, ya sunucuyu çökertir ya da işlemi gereksiz yavaşlatır. Doğru boyut, API'nin kapasitesi, ağ bant genişliği ve bellek sınırlarına bağlıdır.
Eğer 100 bin kaydı birer birer gönderirsen, 100 bin HTTP isteği yaparsın. Her istek başlık, bağlantı kurma ve sunucu işlemesi maliyeti taşır. Bunun yerine 1000 kaydı bir istekte göndersen, istek sayısı 100'e düşer. Ama çok büyük batch seçersen, mesela 50 bin kayıt, sunucu belleği yetersiz kalır, zaman aşımı (timeout) oluşur ya da isteği reddeder.
Doğru batch boyutu, ağ gecikmesi ile sunucu yükü arasındaki dengeyi sağlar.
Çoğu API'nin batch limiti 1000 ile 10000 kayıt arasındadır. Belgeleri oku; eğer belirtilmemişse 1000'den başla. Örneğin, bir e-ticaret API'sine 10 milyon ürünü güncellemek istiyorsun.
1# Yanlış: Birer birer gönder2for product in products:3api.update_product(product) # 10 milyon istek!45# Doğru: Batch'le gönder6batch_size = 10007for i in range(0, len(products), batch_size):8batch = products[i:i + batch_size]9api.bulk_update(batch)Bu kod 10 milyon isteği 10 bine düşürür.
Batch boyutu seçtikten sonra, gerçek veride test et. Başla, ölç, uyarla.
1import time2import requests34batch_sizes = [100, 500, 1000, 5000]5results = {}67for batch_size in batch_sizes:8start = time.time()9for i in range(0, len(products), batch_size):10batch = products[i:i + batch_size]11response = requests.post(12'https://api.example.com/bulk-update',13json={'items': batch}14)15if response.status_code!= 200:16print(f"Hata (batch {batch_size}): {response.status_code}")17break18elapsed = time.time() - start19results[batch_size] = elapsed20print(f"Batch {batch_size}: {elapsed:.2f}s")2122# Çıktı örneği:23# Batch 100: 125.34s24# Batch 500: 28.45s25# Batch 1000: 15.22s26# Batch 5000: 18.91s (timeout riskine giriyor)Gördüğün gibi, batch 1000 en hızlı. 5000'de zaman aşımı başlıyor. Optimal batch 1000 seçilir.
Bir batch başarısız olunca tüm işi tekrarlamak verimsiz. Başarısız batch'i küçültüp yeniden dene.
1def bulk_update_with_retry(items, batch_size=1000, max_retries=3):2failed_items = []3current_batch = items4retry_count = 056while current_batch and retry_count < max_retries:7for i in range(0, len(current_batch), batch_size):8batch = current_batch[i:i + batch_size]9try:10response = requests.post(11'https://api.example.com/bulk-update',12json={'items': batch},13timeout=3014)15if response.status_code == 200:16print(f" {len(batch)} kayıt başarılı")17elif response.status_code == 413: # Payload çok büyük18# Batch'i yarıya indir19smaller_batch = batch[:len(batch)//2]20current_batch.extend(smaller_batch)21print(f" Batch çok büyük, küçültüldü")22else:23failed_items.extend(batch)24except requests.Timeout:25# Zaman aşımında retry listesine ekle26failed_items.extend(batch)27print(f" Timeout, {len(batch)} kayıt retry listesine eklendi")2829current_batch = failed_items30failed_items = []31retry_count += 132batch_size = max(batch_size // 2, 100) # Batch'i küçült3334return len(current_batch) == 0, current_batch3536success, remaining = bulk_update_with_retry(products)37if success:38print("Tüm ürünler güncellendi")39else:40print(f"{len(remaining)} ürün başarısız")Bu yaklaşım, batch başarısız olunca boyutu yarıya indirir ve yeniden dener. Çoğu durumda çalışır.
Eğer API'nin rate limit'i dakikada 100 bin istek ise, 1000'lik batch'le dakikada 100 batch = 100 bin kayıt gönderebilirsin. Ama rate limit'i görmezden gelemezsin. Batch boyutunu rate limit'e göre ayarla.
1# Rate limit: 100 bin istek/dakika = 1666 istek/saniye2# Her batch 1000 kayıt = 1 istek3# Güvenli batch: 1000 kayıt, her istekten sonra 0.001s bekle45time.sleep(0.001) # 1 milisaniye6response = requests.post(...)Batch boyutu, API'nin yanıt hızı ve sunucu kapasitesiyle uyumlu seçilirse, işlem süresi dramatik düşer. Test et, ölç, uyarla.
3 yorum
hepsi ama önce response timea bak timeout olmuyorsa memory de sorun yok demektir
evet ama başta neye bakacaksın bilmiyorsan o 1000i de nasıl seçersin response time mi memory mi error rate mi hepsine birden mi bakılıyor
sonuçta deneme yanılma ile bulunuyor ya başlayacaksan 1000 5000 arası bir sayıdan başla sonra metriklere bak ve ayarla çok teorik konuşmanın anlamı yok APInin davranışını görmeden boyutu söylemek saçma