Idempotency (eş kuvvetlilik): bir işlemi tekrarlamanın sonucu değiştirmemesi
Idempotency nedir, aynı işlemi tekrar çalıştırmak neden sonucu değiştirmemelidir? İdempotent API, idempotency anahtarı ve veri hattı örnekleriyle anlatım.
Idempotency nedir?
Idempotency (Türkçede eş kuvvetlilik ya da tekrarlanabilirlik de denir), bir işlemin aynı girdiyle bir kez veya birçok kez çalıştırıldığında sistemde aynı sonucu bırakması özelliğidir. İşlem tekrarlansa bile etki yalnızca bir kez gerçekleşmiş gibidir. Bu özelliği taşıyan işleme idempotent denir.
Kavramın matematikteki karşılığı, bir fonksiyonu art arda uygulamanın tek uygulamayla aynı sonucu vermesidir. Yazılımda aynı fikir şöyle gündeme gelir: istek ağda kaybolduysa ya da cevap geç geldiyse istemci isteği yeniden gönderir; sunucu için bunun zarar vermemesi gerekir.
Neden gereklidir?
Dağıtık sistemlerde ağ hataları, zaman aşımları ve yeniden başlatmalar olağandır. İstemci bir isteğin sonucunu alamazsa gerçekte işlemin yapılıp yapılmadığını bilemez. Güvenli tek seçenek yeniden denemektir. İşlem idempotent değilse yeniden deneme mükerrer ödeme, mükerrer sipariş ya da yinelenen e-posta gibi sonuçlar doğurur.
Mesaj kuyruklarında da benzer durum geçerlidir. Birçok kuyruk sistemi mesajı en az bir kez teslim etme garantisi verir; yani aynı mesaj tekrar gelebilir. Alıcı tarafın bunu zararsız karşılaması idempotent tasarıma bağlıdır.
Nasıl sağlanır?
Doğal olarak idempotent işlemler vardır: "kullanıcının adresini şu değere ayarla" ifadesi kaç kez çalışırsa çalışsın aynı durumu bırakır. Ancak "bakiyeye tutar ekle" gibi artış işlemleri doğal olarak idempotent değildir. Bunları idempotent hale getiren yöntemler şunlardır:
- Idempotency anahtarı: İstemci her mantıksal işlem için benzersiz bir anahtar üretip isteğe ekler. Sunucu bu anahtarı daha önce işlediyse işlemi yeniden yapmaz, önceki sonucu döndürür.
- Benzersizlik kısıtı: Veritabanında anahtar sütununa benzersiz kısıt konur, yinelenen kayıt reddedilir.
- Üzerine yazma (upsert): Ekleme yerine, kayıt varsa güncelleyen yazma biçimi kullanılır.
- Durum makinesi: İşlemin yalnızca belirli bir durumdayken geçerli olması sağlanır; tamamlanmış işlem tekrar uygulanamaz.
- Mesaj tekilleştirme: Alıcı işlediği mesaj kimliklerini saklar ve tekrar geleni yok sayar.
Küçük bir örnek
Örneğin bir ödeme isteğinde müşteri "öde" düğmesine basar; ağ yavaşladığı için istemci cevap alamaz ve isteği tekrar gönderir. Her istek aynı idempotency anahtarını taşıyorsa sunucu ilk isteği işler ve sonucu anahtarla birlikte kaydeder. Tekrar gelen istek aynı anahtarı görünce kartı yeniden çekmez, önceki cevabı döndürür.
Anahtar saklanmasaydı müşteri kartından mükerrer tahsilat yapılabilirdi. Burada ayrıntı önemlidir: anahtar ile işlem sonucunun aynı atomik adımda kaydedilmesi gerekir; yoksa çökme anında yine boşluk oluşur.
HTTP yöntemleri ve veri hattı bağlamı
HTTP standardında bazı yöntemler tanım gereği idempotent kabul edilir: GET, PUT ve DELETE gibi. PUT aynı kaynağa aynı içeriği yazar, DELETE aynı kaynağı silmeyi hedefler. POST ise varsayılan olarak idempotent değildir; yeni kayıt oluşturur. Bu yüzden POST ile çalışan kritik uçlarda idempotency anahtarı kullanımı yaygındır.
Veri mühendisliğinde idempotency, bir veri hattı aynı gün için yeniden çalıştığında çıktıyı çoğaltmaması demektir. Hat arıza sonrası yeniden çalıştırılırken ya da geçmiş dönem yeniden yüklenirken (backfill) sonuç aynı kalmalıdır. Bunun için hedefe ekleme yerine bölüm bazlı üzerine yazma ya da anahtara göre birleştirme (merge) tercih edilir.
Yakın kavramlarla farkı
Idempotency, güvenlik (safe) kavramıyla karıştırılır. Güvenli bir işlem durumu hiç değiştirmez (okuma gibi). Idempotent işlem durumu değiştirebilir ama tekrar edildiğinde ek değişiklik yapmaz. Her güvenli işlem idempotenttir, tersi doğru değildir.
İşlem bütünlüğü (transaction) ile de aynı değildir. Transaction bir grup adımın ya hep ya hiç tamamlanmasını sağlar; idempotency ise tekrarın zararsız olmasını. Saga gibi dağıtık işlem desenlerinde her adımın tekrar çalıştırılabilmesi için idempotency zorunlu bir yapı taşıdır.
Mindset programlarında nerede karşınıza çıkar?
Idempotency ve Dağıtık Tutarlılık Desenleri eğitimi, tekrar problemi ve idempotency temelleri, idempotency anahtarı tasarımı, veritabanı seviyesinde tutarlılık, mesajlaşmada tekilleştirme, outbox ve değişiklik verisi yakalama ile mutabakat, test ve operasyon modüllerini içerir. Idempotent ve Yeniden Çalıştırılabilir Pipeline Tasarımı eğitiminde ise idempotency kavramı ve sorunlu desenler, yazma stratejileri ve anahtar tasarımı, hata kurtarma, backfill ve doğrulama işlenir.
İlgili Mindset programı
Idempotency ve Dağıtık Tutarlılık Desenleri
Sık sorulan sorular
Idempotent işlem ile aynı sonucu döndüren işlem aynı şey mi?
Tam olarak değil. Idempotency, sistemin durumu üzerindeki etkiyle ilgilidir, dönen cevabın birebir aynı olmasıyla değil. Örneğin silme işleminin ilk çağrısı başarı, sonraki çağrısı kayıt bulunamadı dönebilir; yine de sistemde bırakılan durum aynıdır. Uygulamada tutarlı cevap da çoğu zaman tercih edilir.
Idempotency anahtarı ne kadar süre saklanmalı?
İstemcinin makul biçimde yeniden deneme yapabileceği süre boyunca saklanmalıdır. Çok kısa tutulursa geç gelen tekrar isteği yeni işlem sanılır; çok uzun tutulursa depolama büyür. Süre, iş akışına ve yeniden deneme politikasına göre belirlenir ve süresi dolan anahtarlar temizlenir.
Her API idempotent olmak zorunda mı?
Zorunlu değildir, ama yeniden denemenin zarar verebileceği yazma işlemlerinde güçle önerilir: ödeme, sipariş, stok düşümü, bildirim gönderimi. Salt okuma uçları zaten güvenlidir. Hangi uçların kritik olduğunu belirlemek için yeniden deneme senaryolarını ve olası mükerrer işlem maliyetini birlikte değerlendirmek gerekir.
Veri hattında idempotency nasıl test edilir?
Aynı girdi bölümü hattı tekrar çalıştırarak karşılaştırılır; çıktıdaki kayıt sayısı ve toplamlar değişmemelidir. Ayrıca arıza ortasında hattın kesilip yeniden başlatılması senaryosu denenir. Tekrarlanan çalıştırmada fark çıkması, ekleme tabanlı yazma gibi sorunlu bir desene işaret eder.
İlgili rehberler
İlgili eğitimler
Kategori: Yazılım Geliştirme, Veri Mühendisliği ve MLOps