Eşzamanlı Zamanlanmış Çalıştırmaları Önleme¶
Amaç¶
Önceki bir çalıştırma hâlâ etkin durumdayken, zamanlanmış çalıştırmalardan kritik bölüme aynı anda yalnızca birinin girmesini sağlayın.
Neler Öğreneceksiniz¶
- zamanlanmış çalışmayı önbellek kilidiyle korumayı
- kilidi / ile güvenilir biçimde serbest bırakmayı
try/finally - karşılıklı dışlamayı yeniden denemeye güvenli iş yazma işlemlerinden ayırmayı
Zorluk ve Tahmini Süre¶
- Zorluk: İleri
- Tahmini süre: 20 dakika
Varsayılan Bilgiler¶
Zamanlanmış görevleri, otomasyon komutlarını, özel durumları ve idempotency kavramını anlamanız gerekir.
Gerekli Okumalar¶
Ön Koşullar¶
- süreç tanımlarını içe aktarma ve zamanlama izni
- kısa zamanlama aralığının güvenli olduğu temiz bir test alanadı
Örneğe Genel Bakış¶
Tanım, zamanlanmış bir otomasyon görevi içerir. İş öncesi, adlandırılmış bir kilit alır, korunan işi gerçekleştirir ve kilidi finally.
Adımlar¶
Zamanlamayı Yapılandırma¶
Zamanlanmış bir görev oluşturun ve kısa aralığı yalnızca test sırasında kullanın. Hedef ortamın saat dilimini doğrulayın.
Kritik Bölümü Koruma¶
1 2 3 4 5 6 7 | |
Korunan bölümü kısa tutun. Kilit işleminin döndürdüğü belirtecin aynısını her zaman serbest bırakın.
Korelasyon ve Hata Durumunu Kaydetme¶
Kritik bölümden önce bir çalıştırma kimliği runId oluşturun ve bunu o çalıştırmanın ürettiği tüm kalıcı kayıtlara, giden isteklere ve tanılama iletilerine ekleyin. , , veya gibi genel durumları kaydedin Started, Completed; ancak sırları veya tam iş yüklerini günlüğe kaydetmeyin Failed. Daha sonraki bir adım başarısız olursa, hatayı kaydettikten sonra yeniden fırlatın ve yeniden denemenin devam edip etmeyeceğine, telafi işlemi uygulayıp uygulamayacağına veya tamamlanmış etkileri atlayıp atlamayacağına karar vermek için aynı çalıştırma kimliğini kullanın.
Çok adımlı bir işlem için sınırı açıkça belirleyin:
- ilk yan etkiden önce tüm girdileri doğrulayın
- desteklendiğinde ilişkili veritabanı değişikliklerini tek işlemde tamamlayın
- harici bir hizmeti çağırmadan önce kararlı bir idempotency/correlation anahtar kaydedin
- yalnızca güvenli biçimde geri alınabilen etkileri telafi edin
- otomatik telafi güvenli olmadığında elle kurtarma için başarısız durumu belirtin
Nasıl Çalışır¶
Aynı önbellek anahtarını kullanan çalıştırmalar, korunan bölüme erişimi sıraya koyar. Gövde başarılı olduğunda veya hata fırlattığında finally bloğu çalışır; böylece normal bir komut hatası nedeniyle kilidin tutulması önlenir. Kilit, veritabanına yazma işlemlerini idempotent hâle getirmez; art arda tekrarlanan çalıştırmalar yine de yinelenen veriler oluşturabilir.
Sonucu Doğrulama¶
- Tanımı içe aktarın ve test zamanlamasını etkinleştirin.
- Korunan gövdenin çalışma süresini geçici olarak zamanlama aralığından uzun hâle getirin.
- Tanılama kayıtlarından iki çalıştırmanın aynı anda kritik bölüme girmediğini doğrulayın.
- Bir hata oluşturun ve daha sonraki bir çalıştırmanın kilidi alabildiğini doğrulayın.
Hata ve Sınır Durumları¶
- Farklı kilit anahtarları kullanın ve bunların aynı işlemi korumadığını doğrulayın.
- Başarısız bir iş yazma işleminin yinelenen kayıt oluşturmadan yeniden denenebildiğini doğrulayın.
- İlk yan etkiden sonra hata oluşturun; çalıştırma kimliğinin kısmi çalıştırmayı belirlediğini ve yeniden denemenin tamamlanmış etkiyi yinelemediğini doğrulayın.
- Testten sonra üretim aralığını geri yükleyin.
Güvenlik ve Taşınabilirlik Notları¶
- İşleme özgü bir anahtar seçin; bunu asla güvenilmeyen girdilerden türetmeyin.
- Kullanıcı girdisini veya yavaş bir harici hizmeti beklerken dağıtık kilidi tutmayın.
- Yeniden denenebilir yazma işlemleri için ayrı bir idempotency anahtarı veya upsert stratejisi ekleyin.
- Korelasyon, hatanın izlenebilir olmasını sağlar; tek başına atomiklik veya yetkilendirme sağlamaz.
İndirin ve Kendiniz Deneyin¶
Zamanlanmış kilit tanımını indirin.
Sorun Giderme¶
- Sonraki çalıştırmalar hiç girmiyor: Serbest bırakma işleminin
finallybloğunda olduğunu ve eşleşen anahtarı ve belirteci kullandığını doğrulayın. - Yinelenen kayıtlar hâlâ oluşuyor: Kilit çakışmayı önler; art arda yinelenen yazma işlemlerini değil. Idempotency ekleyin.