English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

konuk
1 / ?
derslere geri dön

Biçim 1: Durum Onarımı. Biçim 2: İsraf Edici Rapor.

Ölçülü Kalp bir saatle atar. İhtiyaca göre değil. Değişime göre değil. Bir zamanlayıcıyla.

İki biçim, tek kök neden: doğru tasarımın yerine geçen zamanlanmış bir iş.

Biçim 1: Durum Onarımı

Bir durum geçişi atomik olarak tamamlanamaz. Geçişi düzeltmek yerine, bir arka plan işi gecikmeli olarak çalışır ve uzlaştırır. Kullanıcılar uzlaştırma penceresi sırasında bozuk durumu görür.

GitHub örneği (2026-04-08): Bir pull request'in upstream deposu private yapıldı. GitHub bir durum geçişi denedi: PR'yi kapat, dal durumunu güncelle, birleştirme durumunu temizle. Geçiş atomik olarak tamamlanmadı. PR durumu aynı anda 'branch-forced-closed' ve 'Merge status cannot be loaded' olarak göründü. Bir Sidekiq arka plan işi birkaç dakika sonra çalıştı ve uzlaştırmayı tamamladı. Gözlemciler bu süre boyunca bozuk durumu gördü.

The Metered Heart: Sidekiq işi bir zamanlamaya göre çalıştı. Kırık durumu tespit ettiği için değil, zamanlayıcı tetiklendiği için çalıştı. PR'yi gerçek zamanlı izleyen bir kullanıcı, bir sonraki iş çalışana kadar kendi içinde çelişen bir PR gördü.

Form 2: Savurgan Rapor

Bir rapor veya toplama, sabit aralıklarla sıfırdan yeniden hesaplanır. Önbellek kontrolü yok. İdempotens koruması yok. Artımlı güncelleme yok. Her çalıştırmada: tam tarama.

Örnekler: her kullanıcının toplam satın alma tutarını zamanın başlangıcından itibaren tüm siparişleri tarayarak yeniden hesaplayan gece cron işi. Ham olay günlüklerinden panoyu her gün yeniden oluşturan analitik işi. Etkinlik tablosundaki her satırı sorgulayan haftalık özet e-postası.

Her biri, son çalıştırmadan beri veri değişip değişmediğine bakılmaksızın tetiklenir. Sadece son 24 saatte yeni veri olsa bile her biri tam geçmişi tarar. Her biri artımlı tasarım yerine zamanlanmış tekrarı tercih eder.

Ortak Kök

A Metered Heart kendi durumu hakkında doğru bilgi veremez. Sadece saati bilir. Form 1: durum onarım işi, durum T+0 anında bozuk olsa da olmasa da T+5 dakikada çalışır. Form 2: rapor işi, dün ile bugün arasında veri değişip değişmediğine bakılmaksızın her gün saat 02:00'de çalışır.

Saat, ne yapılması gerektiği hakkında bilgi taşımaz. Bir olay bu bilgiyi taşır: 'bir durum geçişi az önce başarısız oldu,' 'yeni siparişler az önce geldi.' Ölçülü Kalp bu bilgiyi atar ve yerine bir zamanlama koyar.

Sermaye Tüketimi

Ölçülü Kalp canlı sermayeyi tüketir: arızalı durum olayları için çağrıda bekleyen mühendisleri. Sosyal güveni aşındırır: kullanıcılar tutarsız veriler görür ve kendiliğinden düzelen hataları rapor eder. Diğer MOAD'ları güçlendirir: kırık durumu bulmak için tüm kayıtları tarayan bir durum onarım işi genellikle MOAD-0001 (O(N²) tarama) içerir. Soğuk veriyi yeniden hesaplayan bir rapor işi MOAD-0005'i (önbellek hücumu) tetikleyebilir. MOAD-0009 diğer kusurları katlar.

Ortak Kök

Form 1 ve Form 2 yüzeyde farklı görünür: biri durumu onarır, diğeri veriyi yeniden hesaplar. Kök neden onları birbirine bağlar.

Form 1 ve Form 2 ortak bir kök nedene sahiptir. Bunu tek cümleyle tanımlayın. Ardından kullandığınız yazılımlardan her bir forma birer örnek verin.

Değişimde Tetikle, Saatte Değil

Olay güdümlü tasarım, bir şey değiştiğinde tetiklenir. Durum değişikliği olaydır. Olay tetikleyicidir.

Form 1: atomik geçiş, onarım işinin yerini alır.

Eğer bir durum geçişi sistemi kırık bir ara durumda bırakabiliyorsa, kusur geçişin kendisindedir, onarım işinin yokluğunda değil. Geçişi atomik (veya işlemsel) olarak tamamlanacak şekilde düzeltin. Geçiş atomik olarak tamamlandığında kırık durum hiç oluşmaz. Onarım işinin onaracağı bir şey kalmaz.

# KUSUR: atomik olmayan geçiş kırık durumu bırakır
def close_pr_on_repo_private(pr_id):
pr = PR.get(pr_id)
pr.status = 'branch-forced-closed'   # adım 1: kısmi durum
pr.save()                             # kullanıcılar tarafından ŞİMDİ görülebilir
# ... diğer adımlar başarısız olabilir ...
pr.merge_status = 'not_applicable'
pr.save()                             # adım 2: şimdi tutarlı
# Sidekiq işi, adım 2 başarısız olursa uzlaştırır
# DÜZELTME: atomik geçiş; ara durum görünmez
def close_pr_on_repo_private(pr_id):
with db.transaction():
pr = PR.get(pr_id)
pr.status = 'branch-forced-closed'
pr.merge_status = 'not_applicable'
pr.save()   # her iki alan da atomik olarak kaydedilir; asla yarı-yazılmış kalmaz

Form 2: artımlı güncelleme, tam yeniden hesaplamanın yerini alır.

Sıfırdan yeniden hesaplayan bir rapor, eski veri + yeni veri = yeni sonuç şeklinde tetiklenir. Ancak eski sonuç + delta = aynı yeni sonuç, artımlı olarak hesaplanır. Olay: yeni veri geldi. Tetikleyici: yalnızca yeni veri için toplamı güncelle.

# HATA: zamanlamaya bağlı tam yeniden hesaplama
def nightly_totals_job():
for user in all_users():
total = sum(o.amount for o in user.orders)  # tüm zamanı tarar
user.total_purchases = total
user.save()

# DÜZELTME: olay güdümlü artımlı güncelleme
def on_order_placed(order):
order.user.total_purchases += order.amount   # yalnızca delta
order.user.save()

Artımlı güncelleme, sipariş geldiğinde tetiklenir, sabah 2'de değil. Yalnızca etkilenen kullanıcıyı günceller. Tüm zamanlardaki tüm siparişleri değil, yalnızca yeni siparişi okur. Gece işi ortadan kalkar.

Neden Form 1 Bozuk Bir Geçişi Ortaya Çıkarır

Form 1 Metered Heart, bir durum geçişinin tamamlanmadan bırakıldığını gösterir. Onarım işi, bir mühendisin bozuk durumu fark edip geçişi düzeltmek yerine bir uzlaştırma mekanizması eklemesinden kaynaklanır. Onarım işi: kırık bir mimari kararın üzerine yama.

MOAD-0009 Bir Çoğaltıcı Olarak

MOAD-0009 diğer MOAD'leri güçlendirir. Kırık durumu bulmak için tüm kayıtları tarayan bir durum onarım işi: MOAD-0001 (her iş çalıştırmasında O(N) veya O(N²) tarama). Her şeyi sıfırdan yeniden hesaplayan bir rapor işi: MOAD-0005 (iş başladığında ve sıcak bir üst akıma çarptığında önbellek izdihamı). MOAD-0009 yalnızca kendi başına zarar vermekle kalmaz; diğer MOAD'leri de planlı olarak teslim eder.

Teşhis Et ve Yeniden Tasarla

Bir ekip her gece sabah 2'de bir cron işi çalıştırır. İş, tüm kullanıcılar için tüm siparişleri tarar ve her kullanıcının toplam satın alma tutarını sıfırdan yeniden hesaplar. İş 4 saat sürer. Sabah 6'ya kadar gösterge paneli güncel toplamları gösterir. Sabah 2 ile 6 arasında gösterge paneli önceki günün toplamlarını gösterir.

Bu MOAD-0009’un hangi formu? Yeniden hesaplama yerine hangi olay tetiklenmeli? Güncellemeyi artımlı yapan ara veri yapısı nedir?