Skip to main content
Ağ kesintisi, timeout veya istemci tarafı hata durumlarında bir isteği iki kez göndermiş olabilirsiniz. Idempotency, aynı işlemin iki kez gerçekleştirilmemesini garanti eder.

Nasıl çalışır?

Yazma işlemi yapan tüm POST endpoint’leri Idempotency-Key header’ını kabul eder. Aynı anahtarla gönderilen ikinci istek, ilk yanıtın birebir aynısını döner — yeni bir işlem oluşmaz.
Replay edilen yanıtlarda Payven Idempotent-Replayed: true header’ını ekler:

Anahtar kuralları

Anahtar tenant düzeyinde scope’lanır — farklı bir tenant aynı anahtarla başka bir işlem oluşturabilir, bu beklenen davranıştır.

Senaryolar

  1. İstemci POST /payments gönderir, Idempotency-Key: order-1001-payment.
  2. Payven işlemi başarıyla yapar, 200 OK döner.
  3. İstemci network timeout aldığını sanıp aynı isteği aynı anahtarla tekrar gönderir.
  4. Payven yeni ödeme oluşturmaz; ilk yanıtı döner ve Idempotent-Replayed: true header’ı ekler.
  1. İki istek aynı anda atılır, ikisinde de Idempotency-Key: ABC123.
  2. Birinci istek işlenmeye başlar — cache’e eklenir.
  3. İkinci istek cache’e ulaştığında ilk yanıt henüz hazırsa onu döner; değilse (race) backend’in deduplication mantığı devreye girer.
  1. İstemci Idempotency-Key: ABC123 ile 15000 kuruşluk ödeme atar.
  2. Aynı anahtarla 25000 kuruşluk ödeme atar.
  3. Payven 409 Conflict döner — anahtar farklı body için kullanılmış:
Çözüm: ya farklı bir anahtar kullanın, ya da bilinçli retry için aynı body’yi gönderin.
  1. Saklama süresi dolmuş bir anahtar (ödemeler için 24 saat, diğer endpoint’ler için 3 dakika).
  2. Aynı anahtar tekrar kullanılırsa yeni bir işlem oluşur — cache temizlenmiş.
  3. Bu nedenle uzun süreli retry mantığında her seferinde anahtar üretmek değil, üst seviye iş kimliğini (örn. order_id) anahtar olarak kullanmak daha güvenlidir.

Önerilen kullanım

İstemci tarafında yüksek seviye iş kimliğini anahtar olarak kullanın. Böylece aynı sipariş için yapılan tüm tekrar denemeler aynı işleme yönlendirilir.

Hangi endpoint’lerde kullanın

Sınırlar ve dikkat

Idempotency-Key’i mantıksız geniş ölçekte kullanmayın. Saatler önceki bir işlemin yanıtını “replay” amacıyla almak için anahtar saklamak yerine, gerçek durumu GET /api/v1/payments/{id} ile sorgulayın. Idempotency-Key sadece istemci taraflı tekrar gönderim korumasıdır, kalıcı bir “transaction lookup” mekanizması değildir.
Refund ve void gibi hassas işlemleri deterministik anahtar ile gönderin (örn. refund-{transaction_id}-{slot}) — operatörün UI’da iki kez butona basması durumunda da sadece tek iade oluşur.