Alışveriş Sepeti

Sepetiniz boş

Veritabanı & Önbellek · 15 dk

BullMQ & Redis ile Arka Plan İş Kuyruğu Mimarisi: Asenkron İşlemlerde Sıfır Kayıp

Checkout sırasında fatura, SMS, kargo ve e-posta servislerini senkron bekleterek müşteriyi bekletmeyin. BullMQ sandboxed worker'lar, Dead-Letter Queue (DLQ) ve Exponential Backoff mimarimiz.

Yazar: Stilgen Core Engineering

BullMQ & Redis ile Arka Plan İş Kuyruğu Mimarisi: Asenkron İşlemlerde Sıfır Kayıp

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.