Dijital Dönüşüm

Ödeme Webhook'larında Çift Kaydı Önleme: Idempotency ve Yeniden Deneme Mimarisi

11 Oct 2026
10 dakika okuma
Ininia Teknoloji

Bir ödeme sağlayıcısından gelen webhook'un ağ sorunları, gecikmeler veya sistem hataları nedeniyle aynı işlemi birden fazla kez bildirmesi, siparişin iki kez oluşturulması, müşteriden fazla ücret alınması veya envanterin yanlış güncellenmesi gibi ciddi tutarsızlıklara yol açabilir. Bu sorunu çözmenin anahtarı, sisteminizi idempotent işlemlerle tasarlamak ve webhook'ları tüketen bileşenlerinizde güvenilir yeniden deneme mekanizmaları kullanmaktır. Bu yaklaşım, aynı isteğin birden çok kez alınsa bile sistem durumunda yalnızca bir kez değişiklik yapmasını sağlar, böylece veri tutarlılığı garanti altına alınır.

Idempotency: Aynı İşlemin Tekrar Tekrar Güvenle Yürütülmesi

Idempotency, bir operasyonun birden çok kez çağrılmasına rağmen sistemde yalnızca bir kez etkili olmasını sağlayan bir özelliktir. Özellikle ödeme sistemleri ve finansal işlemler gibi kritik alanlarda veri tutarlılığını sağlamak için vazgeçilmezdir. Bir ödeme webhook'u durumunda, ödeme sağlayıcı genellikle bir HTTP isteği gönderir ve bu istek başarıyla işlense bile, ağ kesintileri veya zaman aşımları nedeniyle sağlayıcı tarafından tekrar gönderilebilir. Idempotent bir tasarım, bu tekrar eden isteklerin güvenle göz ardı edilmesini veya ilk işlemin sonucunun tekrar döndürülmesini mümkün kılar.

Idempotency'yi sağlamak için her işleme benzersiz bir kimlik (idempotency anahtarı) atamak esastır. Bu anahtar genellikle ödeme sağlayıcının kendi sisteminden gelir (örneğin, bir işlem kimliği veya webhook olay kimliği) veya alıcı sistem tarafından üretilir. Webhook'u işleyen sunucu, bu anahtarı kullanarak daha önce aynı anahtarla bir işlem yapılıp yapılmadığını kontrol eder. Eğer işlem daha önce başarıyla tamamlanmışsa, sunucu işlemi tekrar yürütmek yerine ilk işlemin sonucunu döndürür. Bu kontrol mekanizması genellikle bir veritabanı veya dağıtılmış bir önbellek (örneğin, Redis) üzerinde gerçekleştirilir.

İşte bir sözde kod örneği:

function islemWebhook(webhookData):
  idempotencyKey = webhookData.idempotencyKey
  
  // Idempotency anahtarını kontrol et
  if idempotencyKey exists in processed_requests_cache:
    return processed_requests_cache.get(idempotencyKey) // İlk işlemin sonucunu döndür

  // Yeni işlemse, veritabanı işlemi başlat
  beginTransaction()
  try:
    // Sipariş oluşturma, envanter güncelleme gibi iş mantığını burada yürüt
    order = createOrder(webhookData)
    updateInventory(order.items)
    
    // İşlem başarılı, sonucu önbelleğe kaydet
    processed_requests_cache.set(idempotencyKey, successResult)
    commitTransaction()
    return successResult
  catch error:
    rollbackTransaction()
    // Hata durumunda, idempotency anahtarını kaydetme, böylece tekrar denenebilir
    throw error

Bu yaklaşım, ödeme sağlayıcının webhook'u tekrar göndermesi durumunda dahi sisteminizin tutarlı kalmasını garanti eder. Idempotency sadece ödeme sistemleri için değil, GİB e-Fatura entegrasyonu gibi diğer API entegrasyonlarında da veri tutarlılığını sağlamak için kritik bir tasarım prensibidir.

Güvenilir Yeniden Deneme Mekanizmalarının Tasarımı

Webhook'ları gönderen tarafta yeniden deneme mekanizmaları, ağ sorunları veya geçici hizmet kesintileri nedeniyle ilk denemede başarılı olamayan isteklerin tekrar gönderilmesini sağlar. Ancak bu yeniden denemelerin doğru tasarlanması, idempotency ile birlikte çalışırken sistemin tutarlılığını sürdürmesi için temeldir. Ödeme sağlayıcılar genellikle kendi yeniden deneme stratejilerini uygularlar; bu da alıcı tarafın idempotent olacak şekilde tasarlanmasını zorunlu kılar. Alıcı tarafta da, webhook'u işleyen servisin geçici hatalarla karşılaşması durumunda kendi içinde yeniden deneme yapması gerekebilir.

Yeniden Deneme Stratejileri

  1. Üstel Geri Çekilme (Exponential Backoff): Yeniden denemeler arasındaki bekleme süresini her başarısız denemede katlayarak artırır (örneğin, 1 saniye, 2 saniye, 4 saniye, 8 saniye). Bu, alıcı servisin yükünü hafifletir ve geçici sorunların kendi kendine çözülmesi için zaman tanır.
  2. Jitter (Rastgelelik): Üstel geri çekilmeye rastgele bir gecikme ekleyerek, birçok istemcinin aynı anda yeniden deneme yapıp sunucuyu tekrar boğmasını engeller. Bu, özellikle yüksek hacimli sistemlerde önemlidir.
  3. Maksimum Deneme Sayısı ve Zaman Aşımı: Sonsuz döngüleri önlemek için belirli bir maksimum deneme sayısı veya toplam yeniden deneme süresi tanımlanmalıdır. Bu sınıra ulaşıldığında, işlem başarısız olarak işaretlenmeli ve manuel müdahale veya alternatif bir iş akışı tetiklenmelidir.

Webhook İşleyici Tarafında Yeniden Deneme

Webhook'u alan ve işleyen sisteminizde de geçici hatalarla başa çıkmak için yeniden deneme mekanizmaları bulunmalıdır. Ancak bu, webhook sağlayıcının yeniden denemelerinden farklıdır. Örneğin, webhook işleyiciniz bir veritabanına bağlanırken geçici bir ağ hatası yaşarsa, işlemi tekrar denemesi gerekebilir. Bu tür iç yeniden denemeler, aynı idempotency anahtarını kullanarak yapılmalı ve işlem yalnızca bir kez başarılı olduğunda kesinleştirilmelidir. Bu, açık bankacılık entegrasyonları gibi kritik finansal sistemlerde güvenilirliği artırır.

Webhook işleyicinizin kendi iç yeniden deneme mantığı genellikle kuyruk sistemleri (örneğin, RabbitMQ, Kafka) veya arka plan işleme çerçeveleri (örneğin, Celery, Hangfire) aracılığıyla uygulanır. İşlem başarısız olduğunda, mesaj tekrar kuyruğa alınır ve belirli bir gecikmenin ardından tekrar denenir. Bu, işlemeyi ağ hatalarından veya bağımlı hizmetlerin geçici kesintilerinden izole etmeye yardımcı olur.

Çift Kayıt Tuzakları ve İşlemlerin Atomikliği

Idempotency tek başına çift kayıt sorununu tamamen çözmeyebilir; özellikle işlem birden fazla adımdan oluşuyorsa veya dağıtık bir ortamda gerçekleşiyorsa. Örneğin, bir ödeme başarılı olduğunda hem sipariş oluşturup hem de envanteri güncellemeniz gerekiyorsa, bu iki adımın atomik (bölünemez) olarak yürütülmesi kritik öneme sahiptir. Eğer sipariş oluşturulur ancak envanter güncellemesi başarısız olursa ve webhook tekrar gelirse, idempotent tasarım siparişin tekrar oluşturulmasını engelleyebilir, ancak envanter hala yanlış kalabilir.

Bu tür senaryolarda "Outbox Pattern" veya "Transactional Outbox" gibi yaklaşımlar devreye girer. Bu desen, bir veritabanı işlemi içindeki değişikliklerle birlikte, bu değişikliklerin sonucunda gönderilmesi gereken tüm dış olayları (webhook'lar dahil) aynı veritabanı işlemi içinde bir "outbox" tablosuna kaydetmeyi içerir. Veritabanı işlemi başarıyla kesinleştiğinde, ayrı bir servis (örneğin, bir "Relay" veya "Message Forwarder") outbox tablosunu izler ve bekleyen olayları harici sistemlere (webhook'lar, mesaj kuyrukları) gönderir.

Outbox Pattern'in Faydaları

  • Atomiklik: Uygulama durumu değişikliği (sipariş oluşturma) ve ilgili olayın (webhook gönderimi) aynı veritabanı işlemi içinde gerçekleşmesi, ikisinin birlikte başarılı olmasını veya birlikte başarısız olmasını garanti eder.
  • Güvenilirlik: Olaylar veritabanında kalıcı olarak saklandığı için, harici servise gönderim sırasında yaşanabilecek geçici hatalar (ağ sorunları, webhook alıcısının kapalı olması) sorun teşkil etmez. Relay servisi daha sonra tekrar deneyebilir.
  • Tutarlılık: Sisteminizin iç durumu ile dış dünyaya bildirilen olaylar arasında tutarlılık sağlar. Eğer bir webhook gönderilemezse, outbox tablosunda beklemeye devam eder ve sistem yöneticileri tarafından izlenebilir.

Bu desen, özellikle MEDULA entegrasyonu gibi yüksek güvenilirlik gerektiren sistemlerde, entegrasyon mesajlarının kaybını önlemek için kullanılabilir. Gelişmiş entegrasyon senaryolarında, bu tür mimariler maliyet ve çaba açısından daha öngörülebilir bir yapı sunar, zira hata durumları daha kolay yönetilir ve izlenir.

Uygulama Adımları ve Karar Kriterleri

Ödeme webhook'larında çift kayıt sorununu çözmek için aşağıdaki adımları ve karar kriterlerini göz önünde bulundurun:

  1. Idempotency Anahtarını Belirleyin: Ödeme sağlayıcınızın webhook'unda benzersiz bir işlem kimliği (transaction ID, event ID) olup olmadığını kontrol edin. Eğer yoksa, kendi sisteminizde benzersiz bir anahtar (UUID) oluşturup bunu takip etmeniz gerekecektir. Birçok ödeme sistemleri sağlayıcısı, bu tür bir anahtar sunar ve ödeme sistemi entegrasyonlarında bu anahtarı kullanmak yaygın bir pratiktir.
  2. Idempotency Kontrol Mekanizması Uygulayın:
    • Gelen her webhook için belirlenen idempotency anahtarını kullanarak bir önbellek (Redis) veya veritabanı tablosunda (örneğin, processed_webhook_events) bu anahtarın daha önce işlenip işlenmediğini kontrol edin.
    • Eğer işlenmişse, ilk işlemin sonucunu döndürün (başarı kodu 200/202).
    • Eğer yeni bir anahtarsa, işlemi başlatın ve işlem tamamlandığında anahtarı ve sonucu kalıcı olarak kaydedin.
  3. İşlemleri Atomik Hale Getirin:
    • Tek bir veritabanı işlemi içinde birden fazla adım gerçekleştiriyorsanız (örneğin, sipariş oluşturma, envanter güncelleme), tüm bu adımları tek bir ACID işlemi olarak yürütün.
    • Eğer işlem dağıtık adımlar içeriyorsa veya dış sistemlere olay göndermeyi gerektiriyorsa, Outbox Pattern gibi desenleri değerlendirin.
  4. Hata İşleme ve İzleme Tasarlayın:
    • Webhook işleyicinizde oluşabilecek hataları (geçici ağ sorunları, veritabanı kilitlenmeleri) yakalayın.
    • Geçici hatalar için üstel geri çekilme ve jitter içeren iç yeniden deneme mekanizmaları uygulayın (genellikle bir kuyruk sistemi ile).
    • Kalıcı hatalar için uyarı sistemleri kurun ve manuel müdahale gerektirecek durumları izleyin.
  5. Sağlayıcı Dokümantasyonunu İnceleyin: Her ödeme sağlayıcının webhook davranışı ve idempotency desteği farklılık gösterebilir. Kullandığınız sağlayıcının dokümantasyonunu dikkatlice okuyarak en doğru entegrasyonu sağlayın.
Senaryo / İhtiyaç Önerilen Yaklaşım Neden
Basit tek adımlı işlemler (örneğin, sadece bir veritabanı kaydı) Temel idempotency anahtarı kontrolü (önbellek/veritabanı tablosu) En basit ve hızlı çözüm, çoğu temel webhook için yeterli.
Çok adımlı veya dağıtık işlemler (örneğin, sipariş + envanter + bildirim) Outbox Pattern ile idempotency İşlemlerin atomikliğini ve olayların güvenilir bir şekilde gönderilmesini sağlar.
Yüksek hacimli webhook'lar ve geçici hatalar Kuyruk sistemleri ve üstel geri çekilmeli yeniden denemeler Sistem yükünü dengeler, geçici hatalardan kurtulma yeteneğini artırır.
Webhook sağlayıcının idempotency anahtarı sağlamaması Kendi sisteminizde benzersiz bir işlem kimliği üretin ve takip edin Alıcı tarafın sorumluluğundadır, ancak yine de idempotency sağlanabilir.

Bu adımları izleyerek ve doğru mimari desenleri uygulayarak, ödeme webhook'larından kaynaklanan çift kayıt sorunlarını etkin bir şekilde önleyebilir, sistemlerinizin güvenilirliğini ve veri tutarlılığını artırabilirsiniz. Eğer bu karmaşık entegrasyonları kendi ekibinizle yönetmekte zorlanıyorsanız, dışarıdan bu yetkinliği alarak süreçleri hızlandırabilirsiniz.

Bu konuda bir yazılım projesi mi planlıyorsunuz?

Projenizi birlikte analiz edip teknik yol haritasını çıkarabiliriz. Ücretsiz keşif görüşmesi için hemen yazın.

İlgili Hizmetlerimiz

Ininia Teknoloji

İstanbul Teknik Üniversitesi ARI Teknokent'te kurulu Ininia Teknoloji, 12+ yıllık deneyimle AR/VR, yapay zeka ve mobil uygulama alanlarında yenilikçi çözümler sunmaktadır.

Projeniz için profesyonel destek mi arıyorsunuz?

12+ yıllık deneyimimizle dijital dönüşümünüzü hızlandıralım.

Ücretsiz Görüşme Talep Et