Yanıt kaybolduğunda işlem bitmiş olabilir.
Ağ hatası, sunucunun işlemi yapmadığını kanıtlamaz. Tekrar deneme tasarımı tam da bu belirsizlikte başlar.
Bir cümle seçip kopyala: kaynak adresi alıntıya eklenir. Seçim yoksa yazının adresi kopyalanır.
Bu yazının haritası · 5 bölüm
Kullanıcı bir kez gönderir. Sunucu kaydı oluşturur ama yanıt kullanıcıya ulaşmaz. Ekranda hata görünür ve kullanıcı yeniden dener. Sunucu ikinci isteği yeni bir işlem sayarsa, tek niyet iki kayda dönüşebilir. Bu durum için yalnızca düğmeyi gri yapmak yeterli değildir.
Niyet ile isteği ayırmak
Bir iş niyeti birden fazla HTTP isteğiyle gelebilir. İdempotent davranış, aynı niyet tekrarlandığında istenmeyen ek etki üretmemeyi hedefler. HTTP yöntemlerinin tanımlanmış özellikleri vardır; fakat bir POST işleminin tekrar davranışını uygulamanın ayrıca tasarlaması gerekir. Ağdaki belirsizlik arayüz sınırında çözülemez.
İşlem anahtarı bir başlangıçtır
Uygun işlemlerde aynı niyet için tek bir anahtar üretilebilir. Sunucu anahtarı, işlemin sahibi ve istek içeriğiyle ilişkilendirir. Aynı anahtar farklı veriyle gelirse ne yapılacağı açık olmalıdır. Anahtarı kontrol edip sonra kayıt eklemek, iki eşzamanlı istek arasında yarış bırakabilir; veritabanı kısıtı ve işlem sınırı birlikte düşünülür.
Sonucu hatırlamak
Tekrar gelen isteğe 'zaten var' demek her zaman yeterli değildir. İlk işlemin sonucu veya durumunu döndürebilmek kullanıcının ne olduğunu anlamasını sağlar. Bekleyen, tamamlanan ve başarısız işlemlerin ömrü de tanımlanmalıdır. Sonsuza kadar tutulan anahtarların maliyetiyle kısa sürede silinenlerin tekrar riski arasında karar gerekir.
Yan etkiler ayrı bir sınırdır
Veritabanına bir kayıt yazıp ardından e-posta göndermek iki ayrı etkidir. Kayıt tekilleştirilse bile gönderim tekrar edebilir. Kuyruk veya işlem günlüğü gibi yaklaşımlar bu sınırı daha açık hâle getirebilir. Buradan her sistem için tek bir teknoloji sonucu çıkarmam; önce hangi etkinin tekrarının kabul edilemez olduğunu belirlerim.
Kabul sorusu
Bir kullanıcının aynı niyeti art arda ve eşzamanlı geldiğinde hangi durum oluşacak? Yanıt kaybolursa kullanıcı işlemin durumuna nasıl ulaşacak? Başarılı bir tekrar tasarımı, yalnızca ikinci kaydı engellemez; belirsizliği de açıklanabilir bir duruma dönüştürür. Bu yazıdaki yaklaşım bu sitede uygulanmış bir idempotency altyapısı iddiası değildir.
Kaynak: Resmî kaynak ↗