Skip to content

Webhook Desenleri ​

Webhook, bir servisin başka bir sisteme olay gerçekleştiğinde HTTP çağrısı yapmasıdır. Gönderici ile alıcı aynı anda ayakta olmak zorunda değildir; bu nedenle teslim garantisi, imza, tekrar işleme ve gözlemlenebilirlik webhook sözleşmesinin parçasıdır.

Hızlı Karar ​

İhtiyaçYaklaşımDikkat
Dış sisteme olay bildirimiSigned webhookReceiver timeout'u kısa tutulmalı
Teslim garantisiPersistent delivery record + retrySonsuz retry yapılmamalı
Aynı event'in tekrarıEvent ID + idempotent consumerSadece timestamp'e güvenme
Uzun işlem sonucuWebhook + status endpointSonucu tek HTTP isteğine sığdırma

Üretim Kontrol Listesi ​

  • Problem: Alıcı hangi olayları ve hangi teslim seviyesini bekliyor?
  • Çözüm: Event schema, signature, timeout, retry, replay ve disable politikası yazılı mı?
  • Trade-off: At-least-once teslim güvenlidir; duplicate, ordering ve storage maliyeti doğurur.
  • Hata durumu: 4xx, 5xx, timeout, DNS failure ve geçersiz imza ayrı sınıflandırılmalı.
  • Ölçüm: Delivery success, latency, retry count, oldest pending event, DLQ ve receiver disable rate izlenmeli.
  • Güvenlik/maliyet: Secret rotation, replay window, SSRF koruması, payload minimization ve PII masking uygulanmalı.

Event Sözleşmesi ​

Her teslimde stable id, type, version, occurredAt, producer, subject ve data alanları bulunmalıdır:

json
{
  "id": "evt_01J9...",
  "type": "order.completed",
  "version": 1,
  "occurredAt": "2026-09-03T10:15:00Z",
  "producer": "order-service",
  "subject": "order/ord_123",
  "data": { "orderId": "ord_123", "total": 125.50 }
}

Schema değişiklikleri additive ve geriye uyumlu tutulmalı; breaking değişiklikte yeni event type/version kullanılmalıdır. Receiver event type ve version allowlist'i uygulamalıdır.

İmza Doğrulama ve Replay Koruması ​

Gönderici, canonical body üzerinde HMAC imzası üretir ve header'da imza, timestamp ve key ID taşır. Alıcı ham body üzerinden sabit-zamanlı karşılaştırma yapmalı; JSON'u parse edip tekrar serialize ederek imza doğrulamamalıdır.

text
signature = HMAC-SHA256(secret, timestamp + "." + raw_body)

Timestamp kabul penceresi, event ID deduplication ve key rotation birlikte uygulanır. Secret hiçbir zaman URL, log veya hata mesajına yazılmaz. Webhook endpoint'i SSRF için outbound çağrı başlatmamalı ve kaynak/tenant doğrulamasını imzadan sonra da yapmalıdır.

Retry, Backoff ve Teslim Durumu ​

Başarılı kabul için receiver'ın 2xx cevabı yeterlidir; response body işlenmiş sonuç olarak kullanılmamalıdır. Timeout ve 5xx için exponential backoff + jitter, 4xx için sınırlı veya hiç retry uygulanmalıdır. Maksimum deneme ve toplam süre dolunca event DLQ/review durumuna geçer.

Her event için pending, delivered, retrying, failed, disabled gibi durumlar ve son hata nedeni saklanmalıdır. Manuel replay aynı event ID ile yapılabilir; consumer idempotent değilse yeni delivery ID üretmek güvenli çözüm değildir.

Ordering, Fan-out ve Operasyon ​

Global ordering yerine subject veya aggregate key bazında ordering garanti et. Aynı receiver'a ait teslimler bounded concurrency ile gönderilmeli; bir alıcının yavaşlığı diğer tenant'ları bloke etmemelidir.

Provider için endpoint health, failure streak, retry queue age ve circuit state tutulur. Alıcı geçici olarak kapatıldığında olaylar retention sınırları içinde saklanır; retention dolmadan uyarı ve güvenli replay prosedürü çalıştırılır.

Webhook, arka plan işleri ve API güvenliği ile birlikte tasarlanmalıdır.

Eren Demir tarafından oluşturulmuştur.