Ana içeriğe geç

Retry Mekanizması

MuditaPOS, webhook delivery'de güvenilirlik sağlamak için otomatik retry mekanizması kullanır.

Nasıl Çalışır?

flowchart TD
    A[Webhook Gönder] --> B{HTTP 200?}
    B -->|Evet| C[✅ Başarılı — İşlem tamam]
    B -->|Hayır| D[Attempt +1]
    D --> E{3. Deneme mi?}
    E -->|Hayır| F[1 dk bekle]
    F --> A
    E -->|Evet| G[❌ Kalıcı Hata]
    G --> H[📱 Telegram Bildirim]

Retry Kuralları

Parametre Değer
Maksimum deneme 3
Denemeler arası bekleme 60 saniye
HTTP timeout 10 saniye
Başarı kabul kodu HTTP 200

Başarı Kriterleri

Webhook'un başarılı sayılması için:

  • HTTP status kodu 200 olmalı
  • Yanıt 10 saniye içinde dönmeli
  • Bağlantı hatası olmamalı

Dikkat: Sadece 200!

201, 202, 204 gibi diğer başarı kodları retry'ı tetikler. Mutlaka 200 döndürün.

Hata Durumları

Durum Davranış
HTTP 4xx Retry yapılır (3 deneme)
HTTP 5xx Retry yapılır (3 deneme)
Timeout (>10s) Retry yapılır
Connection refused Retry yapılır
DNS resolution fail Retry yapılır
3x başarısız Telegram bildirimi gönderilir

Telegram Bildirimi

3 başarısız denemeden sonra, müşteri hesabına tanımlı Telegram bot'una bildirim gönderilir:

🔴 Webhook Delivery Hatası

Müşteri: Acme Restoran
Sipariş: f47ac10b-...
Platform: GETIR
URL: https://api.acme.com/webhooks/new-order
Son Hata: HTTP 502 Bad Gateway
Deneme: 3/3

Öneriler

Endpoint Tasarımı

  1. Hızlı yanıt verin — Siparişi alın, 200 döndürün, arka planda işleyin
  2. Idempotent olun — Aynı siparişi iki kez alabilirsiniz, providerOrderId ile kontrol edin
  3. Loglayın — Her gelen webhook'u loglayın, sorun olursa analiz edin
  4. Health check — Endpoint'inizin ayakta olduğundan emin olun
// ✅ Doğru — hızlı yanıt, arka plan işleme
app.post('/webhook', async (req, res) => {
  res.json({ status: 'received' }); // Hemen 200 dön
  processOrderAsync(req.body);      // Arka planda işle
});

// ❌ Yanlış — uzun işlem, timeout riski
app.post('/webhook', async (req, res) => {
  await saveToDb(req.body);          // 5 saniye
  await notifyCourier(req.body);     // 3 saniye
  await sendSMS(req.body);           // 2 saniye = 10s timeout!
  res.json({ status: 'received' });
});