İçeriğe geç
Can Uğurlu
Geri dön

Pazaryeri stok senkronunda hız limiti

Beş bin ürünün stoğunu her saat başı güncelliyorsanız ve bunu ürün başına bir istekle yapıyorsanız, saatte beş bin istek atıyorsunuz. Pazaryeri bunu kabul etmez.

Çözüm daha hızlı istek atmak değil. Daha az istek atmak.

Üç şeyi karıştırmayın

Hız limitine takıldığınızda genelde üç ayrı problem aynı anda var:

  1. Gereksiz istek. Değişmemiş ürünü de gönderiyorsunuz.
  2. Tek tek istek. Toplu uç nokta varken kullanmıyorsunuz.
  3. Kontrolsüz eşzamanlılık. Yirmi worker aynı anda aynı API’ye vuruyor.

Üçünü ayrı ayrı çözün. Sadece backoff ekleyip devam ederseniz problem gitmez, yavaşlar.

Delta senkron

En büyük kazanç burada. Ürünün son gönderilen stok değerini kendi tarafınızda tutun ve sadece değişeni gönderin.

$changed = Product::query()
    ->whereColumn('stock', '!=', 'synced_stock')
    ->orWhereColumn('price', '!=', 'synced_price')
    ->limit(1000)
    ->get();

Tipik bir katalogda saatlik değişen ürün oranı %2-5 civarında. Beş bin ürünün beş bini değil, yüz ellisi gidiyor. İstek sayısı otuzda bire düşüyor.

Gönderim başarılı olduğunda synced_stock alanını güncelleyin. Başarısız olursa dokunmayın; bir sonraki turda tekrar denenir. Ekstra retry mantığı yazmanıza gerek kalmaz.

Toplu uç noktayı kullanın

Pazaryerlerinin çoğunda toplu stok/fiyat güncelleme uç noktası var. Tek istekte yüzlerce kalem gönderebiliyorsunuz.

Bunu kullanmıyorsanız sebebi genelde şu: toplu uç nokta senkron cevap dönmüyor, bir toplu iş numarası dönüyor ve sonucu ayrı bir uç noktadan sorguluyorsunuz. İki adım, daha fazla kod.

Yazın. Beş bin isteği elli isteğe indiriyor.

Eşzamanlılığı tek yerden kısın

Worker sayısını artırmak entegrasyonu hızlandırmaz, sadece limite daha çabuk çarptırır.

Pazaryerine giden isteklerin hepsini tek bir kuyruk üzerinden geçirin ve o kuyruğun worker sayısını sabitleyin:

php artisan queue:work --queue=marketplace --sleep=1

Bir worker. Limit yükselirse ikiye çıkarsınız. Uygulamanın geri kalanı ayrı kuyrukta çalışmaya devam eder.

429 geldiğinde

Gelecek. Beklemeniz gereken süreyi tahmin etmeyin, cevaptan okuyun. Çoğu API Retry-After başlığı dönüyor.

if ($response->status() === 429) {
    $wait = (int) $response->header('Retry-After') ?: 60;
    $this->release($wait);
    return;
}

release() işi kuyruğa geri koyar ve o kadar saniye bekletir. Worker’ı sleep ile bloklamayın; o worker o sürede başka iş yapabilirdi.

Başlık yoksa üstel geri çekilme kullanın: 1, 2, 4, 8 saniye. Üzerine rastgele bir sapma ekleyin. Aynı anda limite takılan yirmi iş, aynı anda tekrar denerse yine takılır.

Ölçün

Her senkron turunda üç sayıyı loglayın: gönderilen kalem, atılan istek, alınan 429.

Bu üç sayı olmadan optimizasyon yaptığınızı sanırsınız. Sayılar varsa delta senkronun istek sayısını gerçekten düşürüp düşürmediğini görürsünüz.

Özet

Değişmeyeni gönderme. Toplu uç noktayı kullan. Eşzamanlılığı sabitle. 429’da cevabın söylediği kadar bekle.

Bu dördü olmadan hız limiti bir hata değil, sisteminizin normal çalışma durumudur.


Bu yazıyı paylaş:

Önceki Yazı
Webhook'u önce kabul edin, sonra işleyin
Sonraki Yazı
Sipariş durum eşlemesini tek yerde tutun