Laravel 8’de Duplicate Job ve Observer Çakışmaları
Laravel 8 projelerinde Job Queue’lar, Observer’lar ve dış API entegrasyonları sıkça kullanılır. Ama bazı senaryolarda aynı job birden fazla kez tetiklenebilir ve bu durum Google Indexing API, sitemap güncellemeleri veya diğer webhook işlemlerinde çakışmalara yol açabilir. Çoğu rehber bu senaryoya değinmez, ama büyük projelerde ciddi performans ve indeksleme sorunlarına sebep olur.
Hata Senaryosu
Bir PostObserver
’da yeni yazı oluşturulduğunda:
-
Sitemap güncelleniyor.
-
Google’a sitemap ping gönderiliyor.
-
Google Indexing API’ye URL gönderiliyor.
Eğer aynı anda birden fazla event tetiklenirse veya job queue düzgün yapılandırılmamışsa, duplicate job oluşur ve aynı URL API’ye tekrar tekrar gönderilir. Bu durum:
Google Indexing API hatası: Quota exceeded
veya
Observer loglarında aynı post için birden fazla “Indexing API başarılı” mesajı
şeklinde kendini gösterir.
Çözüm: Singleton Job ve Debounce Mantığı
Laravel Job’larında unique identifiers kullanmak ve job’ları debounce etmek çözümün anahtarıdır.
Örnek Singleton Job
<?php
namespace App\Jobs;
use App\Services\GoogleIndexingService;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class SubmitPostToGoogle implements ShouldQueue
{
use InteractsWithQueue, Queueable, SerializesModels;
protected $postUrl;
public function __construct($postUrl)
{
$this->postUrl = $postUrl;
}
public function handle(GoogleIndexingService $indexingService)
{
// Job duplicate ise atla
if (cache()->has('submitted_'.$this->postUrl)) {
return;
}
$indexingService->submitUrl($this->postUrl);
cache()->put('submitted_'.$this->postUrl, true, now()->addMinutes(10));
}
}
Observer’da Kullanım
public function created(Post $post)
{
if ($post->isPublishable()) {
SubmitPostToGoogle::dispatch($post->getUrl());
}
}
Bu sayede aynı post için aynı anda birden fazla indexing job’ı gitmez, Google API ve sitemap güncellemeleri çakışmaz.
Ekstra İpuçları
-
Queue’da retry ve delay kullanarak spam tetiklemeleri önleyin.
-
Sitemap güncellemelerini job ile asenkron yapın.
-
Logları debounce mantığı ile filtreleyin; böylece aynı post için tekrar eden loglar oluşmaz.
-
Google Indexing API için rate limit’i göz önünde bulundurun.
Laravel 8’de duplicate job ve observer çakışmaları, özellikle indexing ve sitemap işlemlerinde gözden kaçan ama kritik bir hatadır. Singleton job ve debounce mantığı ile hem performans kazanır hem de API hatalarını önlersiniz.