Webhook Yeniden Denemesi: Başarısız İstekleri Güvenli Şekilde İşleme
Webhook entegrasyonlarında ağ arızaları, zaman aşımları ve geçici sunucu hataları kaçınılmazdır. Başarısız istekleri kör körüne yeniden denemek yerine akıllı bir strateji izlemek gerekir.
Bir ödeme servisi webhook'u gönderirken bağlantı kopabilir. İstek kaydedilmezse müşteri paranın çekilip ürünü almadığını düşünür. Fakat hızlı yeniden denemeler sunucuyu aşırı yükleyebilir ya da aynı işlem iki kez işlenebilir.
Başarısız webhook'u hemen yeniden denemeyin. İlk deneme başarısız olursa 2 saniye bekleyin, sonra 4, 8, 16 saniye... şeklinde süre uzatın. Bu yönteme exponential backoff denir.
Bir webhook alıcısı sunucusu kurup başarısız istekleri güvenli şekilde yeniden deneyelim:
1const express = require('express');2const app = express();34app.use(express.json());56const webhookQueue = [];7const maxRetries = 5;89app.post('/webhook', async (req, res) => {10const { id, event, data } = req.body;1112// Idempotency: aynı webhook iki kez işlenmesin13const webhookKey = `${id}-${event}`;1415// İstek alındı, hemen cevap ver16res.status(202).json({ received: true });1718// Arka planda işle19processWebhook({20key: webhookKey,21payload: data,22retries: 0,23timestamp: Date.now()24});25});2627async function processWebhook(webhook) {28try {29// Webhook'u işle (örn: veritabanına yaz)30console.log(`İşleniyor: ${webhook.key}`);3132// Simüle edilmiş hata: %30 ihtimalle başarısız ol33if (Math.random() < 0.3 && webhook.retries < maxRetries) {34throw new Error('Geçici hata');35}3637console.log(` Başarılı: ${webhook.key}`);38} catch (error) {39if (webhook.retries < maxRetries) {40webhook.retries++;41// Exponential backoff: 2^retries saniye42const delay = Math.pow(2, webhook.retries) * 1000;4344console.log(`⟳ ${webhook.key} - ${webhook.retries}. deneme, ${delay}ms sonra`);4546setTimeout(() => processWebhook(webhook), delay);47} else {48console.error(` Başarısız: ${webhook.key} - ${maxRetries} denemeden sonra`);49// Hata günlüğüne yaz veya uyarı gönder50}51}52}5354app.listen(3000, () => console.log('Webhook alıcısı çalışıyor: 3000'));1Webhook alıcısı çalışıyor: 30002İşleniyor: order-123-created3⟳ order-123-created - 1. deneme, 2000ms sonra4⟳ order-123-created - 2. deneme, 4000ms sonra5Başarılı: order-123-createdIdempotency: Aynı webhook'u iki kez işlemeyin. Webhook'a benzersiz ID verin, işlenmiş ID'leri veritabanında tutun.
Hızlı Cevap: Webhook gönderene hemen 202 (Accepted) döndürün. Ağır işlemleri arka planda yapın.
Maksimum Deneme Sınırı: Sonsuz döngüye girmeyin. 5-10 deneme yeterlidir; sonra hata günlüğüne geçin.
Zaman Aşımı: Her denemeye timeout ekleyin (örn: 10 saniye). Sonsuz beklemeyin.
0 yorum