Sessiz Tedarikçi Yasak Tehlikesi
<p>Yüksek performanslı bir B2B SaaS platformunu Smart Tech Devs'de tasarlarken, sisteminiz sıklıkla harici üçüncü taraf servis uç noktalarına bağımlı hale gelir. Kurumsal GST/VAT ID'lerini doğrulama, gerçek zamanlı gümrük verilerini alma veya günlükleri kurumsal CRM merkezlerine gönderme gibi işlemlerinizde arka plan görevleriniz bu bağlantıları eşzamanlı olarak paralel kuyruk işçi havuzları aracılığıyla yönetir.</p>
<p>Temel yapısal tehlike, birdenbire 20 farklı kuyruk işçi ipinde eşzamanlı olarak çok sayıda görev çalıştırıldığında ortaya çıkar. Her bir işçi tedarikçi API'sine aynı anda HTTP istekleri göndermeye başladığında, bu hızla onların katı API eşiği kurallarını ihlal edecektir. Verinizle ilgilenmek yerine, tedarikçinin geçidi sunucu IP'nizi işaretler, <code>429 Too Many Requests</code> kodunu iade eder ve bağlantılarınızı engeller. Kuyruklarınız darboğaza girer, yeniden denemeler tükenir ve kritik senkronizasyon entegrasyonlarınız tamamen bozulur. Sisteminizi tedarikçi bloklarından korumak için, dağıtılmış bir Token Bucket Rate Limiter uygulamanız gerekmektedir.</p>
<h2>Token Bucket Algoritmasının Fiziği</h2>
<p>Temel zaman penceresi sınırlayıcılarının (bir sınır aşıldığında bir saat boyunca erişimi tamamen engelleyen) aksine, Token Bucket algoritması sürekli bir akış kontrol borusu sağlar.</p>
<p>Bir makara, maksimum sayıda sanal erişim jetonu tutan bir kova olarak hayal edin. Arka planda bir zamanlayıcı, sabit ve öngörülebilir bir hızda (örneğin, saniyede 5 jeton) taze jetonları kovaya bırakır. Bir uygulama işçisi harici bir API çağrısı yapmak istediğinde, kovadan tam olarak bir jeton çekmek zorundadır. Eğer kova boşsa, işçi durmalı ve beklemelidir. Bu algoritma, ani kısa trafik patlamalarını hoş bir şekilde karşılar ve uzun vadeli bağlantı hacminizin tedarikçi sınırları içinde kalmasını garanti eder.</p>
<h3>Adım 1: Laravel'de Redis Üzerinden Dağıtılmış Token Bucket Uygulaması</h3>
<p>Laravel uygulamanız birden fazla web sunucusunda veya paralel işçi düğümlerinde çalıştığından, jeton sayımlarını yerel PHP belleğinde takip edemezsiniz. Redis 'i, global olarak atomik bir merkezi jeton denge havuzu sürdürmek için kullanmalıyız.</p>
<pre><code>namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Redis;
class SyncVendorCrmRecord implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public array $payload;
public function __construct(array $payload)
{
$this->payload = $payload;
}
public function handle(): void
{
$limiterName="crm-api-token-bucket";
// Tedarikçi API'si ile tüm sunucular arasında atomik Token Bucket kuralını uygulayın
// Kova Kapasitesi: Max 30 jeton. Yenileme Hızı: Saniyede 5 jeton.
Redis::throttle($limiterName)
->allow(30) // Kovada maksimum patlama kapasitesi
->every(1) // Saniye cinsinden zaman penceresi
->releaseAfter(10) // Hata üzerinde iş kilidinin bırakılacağı gecikme süresi
->block(5) // Kova boşsa, işçiyi 5 saniye bekletin
->then(function () {
// Jeton başarıyla alındı! Harici ağ değişikliğini güvenle gerçekleştir
$response = Http::withToken(config('services.vendor.key'))
->post('https://api.externalcrm.com/v2/records', $this->payload);
if ($response->failed()) {
$this->release(now()->addMinutes(2)); // Uygulama hatalarında nazikçe geri çekilin
}
}, function () {
// 5 saniye içinde bir jeton alınamadı.
// Görevi otomatik olarak daha sonra yeniden deneme için kuyruk havuzuna bırakın.
return $this->release(now()->addSeconds(15));
});
}}
<h2>Mühendislik Yatırım Getirisi (ROI)</h2>
<p>Üçüncü taraf entegrasyonlar için Redis destekli bir Token Bucket mimarisine geçerek, işleme hızınızı tedarikçi sınırlamalarından ayırırsınız. Büyük bir iç kuyruk yedeği, artık zincirleme 429 istisnalarını veya IP yasaklarını tetiklemeyecek. Arka plan işçileriniz, otomatik olarak dış HTTP trafik döngülerini düzgün bir şekilde düzenleyerek, harici veri boru hatlarınızı korur ve kesintisiz iş operasyonlarını sürdürür.</p>Kaynak: Orijinal Makale


