Müşteri "Ödeme yap" düğmesine bastı, internet bağlantısı bir an koptu ve tekrar bastı. Sonuç: iki ödeme, iki sipariş ve mutsuz bir müşteri. Idempotency (aynı sonuç ilkesi), bir işlemin birden fazla kez tekrarlansa bile yalnızca bir kez etkili olmasıdır.
Neden önemli?
Dağıtık sistemlerde tekrarlar kaçınılmazdır:
- Kullanıcı düğmeye iki kez basar.
- Mobil uygulama zaman aşımında isteği tekrar gönderir.
- Ödeme kuruluşu veya kargo firması aynı webhook bildirimini birden fazla kez iletir.
- Zamanlanmış bir görev yarıda kesilip yeniden çalışır.
Sistem bu tekrarlara dayanıklı değilse çift kayıt, çift ödeme ve tutarsız stok oluşur.
HTTP metotları
- GET, PUT ve DELETE doğası gereği idempotent tasarlanmalıdır.
- POST ise genellikle yeni bir kayıt oluşturur; idempotent olması için ek önlem gerekir.
Idempotency anahtarı
İstemci, her işlem için benzersiz bir anahtar üretip istekle birlikte gönderir:
POST /api/odemeler
Idempotency-Key: 6f1c2b7e-...
Sunucu:
- Bu anahtarı daha önce gördü mü kontrol eder.
- Görmediyse işlemi yapar, sonucu anahtarla birlikte saklar.
- Gördüyse işlemi tekrar yapmaz, saklanan sonucu döndürür.
Birçok ödeme kuruluşu da kendi API'lerinde bu yöntemi destekler.
Veritabanı düzeyinde koruma
Uygulama kontrolleri eşzamanlı isteklerde atlanabilir. En güvenli ek katman, veritabanı kısıtlarıdır:
- Sipariş numarası veya dış işlem kimliği için benzersizlik kısıtı.
- Webhook olay kimliklerini kaydedip aynı kimliğin ikinci kez işlenmesini engellemek.
Bkz. veritabanı tasarımı ve normalizasyon.
Arayüz tarafında
- Gönder düğmesini istek sürerken devre dışı bırakın.
- Ödeme sonrası sayfayı yenilemenin işlemi tekrarlamadığından emin olun.
Bunlar kullanıcı deneyimini iyileştirir; ancak sunucu tarafı korumanın yerini tutmaz.
Güvenli yeniden deneme
Idempotent işlemler, hata durumunda gönül rahatlığıyla yeniden denenebilir. Bu da sistemleri geçici ağ sorunlarına karşı dayanıklı kılar. Mesaj kuyruklarıyla çalışan sistemlerde de mesajların en az bir kez teslim edildiği varsayılarak işleyicilerin idempotent yazılması önerilir.
Sık sorulan sorular
Idempotency anahtarı ne kadar süre saklanmalı?
İşlemin tekrar gelme ihtimalinin olduğu süre boyunca; örneğin 24 saat. Süre sonunda temizlenebilir.
Küçük bir site için de gerekli mi?
Ödeme ve sipariş oluşturma gibi parasal sonucu olan her işlemde gereklidir; sitenin büyüklüğünden bağımsızdır.
Sonuç
Idempotency, "aynı istek iki kez gelirse ne olur?" sorusunun cevabıdır. Ödeme ve entegrasyon altyapınızın güvenilirliği için iletişime geçebilirsiniz.