1. Senkron İşlemler Neden Yüksek Trafikte Sistemi Tıkar?
Müşteri siparişi onayladığında yapılması gereken işler yalnızca veritabanına kayıt atmakla bitmez:
- E-Fatura entegratörüne XML/SOAP isteği iletmek (~1.2s - 2.5s)
- Kargo firmasının API'sine bağlanıp takip barkodu oluşturmak (~800ms)
- Müşteriye ve mağaza sahibine e-posta, SMS ve WhatsApp bildirimi göndermek (~900ms)
- Pazaryeri ve muhasebe programına webhook fırlatmak (~600ms)
Eğer tüm bunlar tek bir HTTP isteğinde senkron yürütülürse müşteri 4-5 saniye boyunca döner. Daha vahimi; kargo firmasının API'si o anda arızalıysa tüm HTTP isteği 500 hatası verir ve para çekilmiş olmasına rağmen sipariş tamamlanamaz!
2. Stilmerce Asenkron Kuyruk Topolojisi
Stilmerce'te checkout uç noktası yalnızca siparişi oluşturur ve anında 200 OK yanıtı döner (<120ms). Geri kalan tüm yan görevler BullMQ aracılığıyla bağımsız kuyruklara paylaştırılır:
+-------------------------------------------------------------------------------+
| BULLMQ ARKA PLAN İŞ KUYRUĞU MİMARİSİ |
| |
| [Müşteri: "Siparişi Onayla"] ──► [HTTP 200 OK: Sipariş Alındı! (<120ms)] |
| │ |
| ▼ |
| [BullMQ Producer: Redis Kuyruğuna Görevleri Bırakır] |
| │ |
| ┌──────────────────────────────┼──────────────────────────────┐ |
| ▼ ▼ ▼ |
| [Kuyruk: Invoices] [Kuyruk: Shipping] [Kuyruk: Alerts] |
| │ │ │ |
| ▼ (Worker 1) ▼ (Worker 2) ▼ (Worker 3) |
| [E-Fatura Kesilir] [Kargo Barkodu Üretilir] [SMS / Email Gider] |
| │ │ │ |
| └─── Hata Olursa? ─────────────┴──────┬───────────────────────┘ |
| ▼ |
| [Exponential Backoff ile Yeniden Dene] |
| (1 dk -> 5 dk -> 15 dk sonra) |
| │ |
| ▼ (3 Deneme de Başarısızsa) |
| [Dead-Letter Queue (DLQ)] |
| (Admin Paneline İnceleme Bildirimi) |
+-------------------------------------------------------------------------------+3. Kod İncelemesi: Dayanıklı Worker ve DLQ Yönetimi
Aşağıdaki NestJS BullMQ işçisi, kargo servisi geçici olarak çökse bile hiçbir siparişi kaybetmez:
// shipping.worker.ts
import { Processor, WorkerHost, OnWorkerEvent } from '@nestjs/bullmq';
import { Job } from 'bullmq';
@Processor('shipping-queue', { concurrency: 5 })
export class ShippingWorker extends WorkerHost {
async process(job: Job<{ orderId: string }>) {
const { orderId } = job.data;
// Kargo API entegrasyonu
await this.carrierService.createConsignment(orderId);
}
@OnWorkerEvent('failed')
onJobFailed(job: Job, error: Error) {
if (job.attemptsMade >= 3) {
// 3 deneme de başarısız oldu: Dead-Letter Queue'ya aktar ve alarm ver
this.alertService.notifyDevOps(`Sipariş #${job.data.orderId} kargo kaydı açılamadı!`, error);
}
}
}
Sıfır Veri Kaybı
Herhangi bir dış servis 2 saat boyunca kapalı kalsa bile, dış servis ayağa kalktığı anda BullMQ kuyruktaki binlerce görevi sıralı bir şekilde tüketir ve sistemi otomatik olarak dengeler.