API Hız Sınırlama Sorunu
<p>Modern B2B SaaS geliştirmelerinde, uygulamanız nadiren yalnız yaşar. Sürekli olarak dış hizmetlerle iletişim halindesiniz: Stripe üzerinden faturalama, Salesforce ile CRM senkronizasyonu veya Resend üzerinden e-posta kampanyaları gibi. Mimari tuzak, Laravel Queues'ın muazzam hızı ile bu üçüncü taraf API'lerin sıkı hız sınırlamaları birleştiğinde meydana gelir.</p>
<p>Eğer 5,000 "Müşteri Senkronizasyonu" arka plan işi başlatırsanız, Laravel Horizon işçileri bunları CPU'nuzun izin verdiği kadar hızlı bir şekilde yürütmeye çalışacaktır. Ancak üçüncü taraf API yalnızca dakikada 50 isteğe izin veriyorsa, ilk 50 iş başarılır ve sonraki 4,950 iş hemen <code>HTTP 429: Too Many Requests</code> hatasıyla çöker. Bu, başarısız işler tablonuzu doldurur, Sentry'de yanlış alarmlar tetikler ve veri senkronizasyonunuzu bozar.</p>
<h2>Kurumsal Çözüm: Redis İş Middleware’i</h2>
<p>Sürdürülebilir arka plan işleme mimarisi oluşturmak için, kuyruk çalışanlarımıza dış sınırları saygı göstermeyi öğretmeliyiz. Bunu, Redis kullanarak kuyruklu işlerimize <strong>Hız Sınırlama Middleware’i</strong> uygulayarak başarırız.</p>
<p>Bir API sınırına ulaşıldığında işin çökmesi yerine, middleware güvenli bir şekilde işi durdurur, duraklatır ve daha sonra hız limiti sıfırlandığında yeniden denemek üzere kuyruğa geri bırakır.</p>
<h3>Adım 1: Hız Sınırlayıcıyı Tanımlama</h3>
<p>Öncelikle, dış API’nizin sıkı hız limitini <code>AppServiceProvider</code> sınıfının <code>boot</code> yönteminde tanımlıyoruz.</p>
<pre><code>namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Cache\RateLimiting\Limit;
class AppServiceProvider extends ServiceProvider
{
public function boot(): void
{
// Sıkı bir limit tanımlayın: Dakikada en fazla 50 isteğe izin ver
RateLimiter::for(‘salesforce-api’, function ($job) {
return Limit::perMinute(50);
});
}
}
<h3>Adım 2: Middleware’i İşe Uygulama</h3>
<p>Daha sonra, bu belirli hız sınırlayıcıyı <code>middleware()</code> yöntemi ile İş sınıfımıza ekliyoruz. Ayrıca, işin yavaşlatıldığında ne kadar süre beklemesi gerektiğini de yapılandırıyoruz.</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\Queue\Middleware\RateLimited;
class SyncCustomerToSalesforce implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $tenant;
// İşin en fazla 12 saat boyunca yeniden denenebilmesi
public $retryUntil;
public function __construct($tenant)
{
$this->tenant = $tenant;
$this->retryUntil = now()->addHours(12);
}
/
* İşin geçeceği middleware'i al.
*/
public function middleware(): array
{
// 1. Sağlayıcıda tanımladığımız Redis sınırlayıcıyı uygula
// 2. Yavaşlatılırsa, işin kuyruğa geri bırakılması, 60 saniyelik gecikme ile
return [
(new RateLimited('salesforce-api'))->dontRelease()->releaseAfterMinutes(1)
];
}
/
* İşi gerçekleştir (429 hatalarından güvenli!)
*/
public function handle(): void
{
// Dış API HTTP isteğini burada gerçekleştirin...
// Bunun yalnızca dakikada 50 kez global olarak yürütüleceğini garanti ediyoruz.
}}
<h2>Mimari ROI</h2>
<p>Redis destekli iş throttling'i uygulayarak, kaotik API entegrasyonlarını mükemmel bir hızda, dayanıklı veri boru hatlarına dönüştürürsünüz. 429 hata gürültüsünü loglarından ortadan kaldırır, sağlayıcı API itibarınızı korur ve büyük veri senkronizasyonlarının başarılı bir şekilde tamamlanmasını garanti edersiniz; bu süreç saatler alabilir.</p>Kaynak: Orijinal Makale


