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ı
- Hızlı yanıt verin — Siparişi alın, 200 döndürün, arka planda işleyin
- Idempotent olun — Aynı siparişi iki kez alabilirsiniz,
providerOrderIdile kontrol edin - Loglayın — Her gelen webhook'u loglayın, sorun olursa analiz edin
- 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' });
});