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:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1const express = require('express');
2const app = express();
3
4app.use(express.json());
5
6const webhookQueue = [];
7const maxRetries = 5;
8
9app.post('/webhook', async (req, res) => {
10const { id, event, data } = req.body;
11
12// Idempotency: aynı webhook iki kez işlenmesin
13const webhookKey = `${id}-${event}`;
14
15// İstek alındı, hemen cevap ver
16res.status(202).json({ received: true });
17
18// Arka planda işle
19processWebhook({
20key: webhookKey,
21payload: data,
22retries: 0,
23timestamp: Date.now()
24});
25});
26
27async function processWebhook(webhook) {
28try {
29// Webhook'u işle (örn: veritabanına yaz)
30console.log(`İşleniyor: ${webhook.key}`);
31
32// Simüle edilmiş hata: %30 ihtimalle başarısız ol
33if (Math.random() < 0.3 && webhook.retries < maxRetries) {
34throw new Error('Geçici hata');
35}
36
37console.log(` Başarılı: ${webhook.key}`);
38} catch (error) {
39if (webhook.retries < maxRetries) {
40webhook.retries++;
41// Exponential backoff: 2^retries saniye
42const delay = Math.pow(2, webhook.retries) * 1000;
43
44console.log(`⟳ ${webhook.key} - ${webhook.retries}. deneme, ${delay}ms sonra`);
45
46setTimeout(() => 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önder
50}
51}
52}
53
54app.listen(3000, () => console.log('Webhook alıcısı çalışıyor: 3000'));
1Webhook alıcısı çalışıyor: 3000
2İşleniyor: order-123-created
3⟳ order-123-created - 1. deneme, 2000ms sonra
4⟳ order-123-created - 2. deneme, 4000ms sonra
5Başarılı: order-123-created

Idempotency: 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.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz