प्रपत्र 1: स्टेट-रिपेयर। प्रपत्र 2: व्यर्थ रिपोर्ट।
एक मापी हृदय समय के अनुसार धड़कता है। आवश्यकता के, परिवर्तन के, बल्कि घड़ी के।
दो रूप, एक मूल कारण: एक निर्धारित नौकरी सही डिज़ाइन की जगह लेती है।
प्रपत्र 1: स्टेट-रिपेयर
एक स्टेट ट्रांजिशन पूरी तरह से एटॉमिक रूप से पूरा नहीं करता। इसके बजाय, पृष्ठभूमि में एक नौकरी टाइम आउट के बाद संतुलन करती है। उपयोगकर्ता संतुलन समयावकाश के दौरान टूटे हुए स्टेट को देखते हैं।
GitHub उदाहरण (2026-04-08): एक पुल अनुरोध के अपस्ट्रीम रिपॉजिटरी ने निजी हो गया। GitHub ने स्टेट ट्रांजिशन का प्रयास किया: पीआर को बंद करें, ब्रांच स्टेट को अपडेट करें, मर्ज स्टेट को साफ करें। ट्रांजिशन पूरी तरह से एटॉमिक रूप से पूरा नहीं हुआ। पीआर स्टेट 'ब्रांच-फोर्स-क्लोज्ड' और 'मेर्ज स्टेट लोड नहीं किया जा सकता' के रूप में सिमुल्तानियस्ली दिखा। एक Sidekiq पृष्ठभूमि में नौकरी मिनटों बाद पूर्णता के लिए संतुलन चली। देखने वालों ने टूटे हुए स्टेट को समयावकाश के दौरान देखा।
मापी हृदय: Sidekiq नौकरी समय के अनुसार चली। यह GitHub द्वारा टूटे हुए स्टेट की खोज के कारण नहीं चला; यह घड़ी की चाल चला। एक उपयोगकर्ता जो पीआर को वास्तविक समय में देखता था, उसे पीआर के साथ खुद को विरोधाभासी दिखता था जब तक अगली नौकरी कार्यकारण होती।
प्रपत्र 2: व्यर्थ रिपोर्ट
एक रिपोर्ट या एकत्रीकरण निर्धारित अंतराल पर स्क्रैच से पुनर्निर्मित करता है। कोई कैश चेक नहीं। कोई idempotency गार्ड नहीं। कोई प्रगतिशील संवर्धन नहीं। हर प्रकाशन: एक पूर्ण स्कैन।
उदाहरण: रात की क्रोन नौकरी जो हर उपयोगकर्ता के कुल खरीद मात्रा को स्कैन करके पुनर्निर्मित करती है, जो समय के आरंभ से सभी आदेशों को स्कैन करती है। एक दैनिक विश्लेषण नौकरी जो रॉ इवेंट लोग्स से एक पुनर्निर्मित डैशबोर्ड पैदा करती है। एक सप्ताहांत समीक्षा ईमेल जो गतिविधि टेबल के हर स्तंभ को पूछती है।
प्रत्येक समयावधि में निर्धारित होता है या नहीं डेटा बदला हो गया से पिछले प्रकाशन के बाद। प्रत्येक पूर्ण इतिहास को स्कैन करता है, जब केवल पिछले 24 घंटों में नई डेटा होती है। प्रत्येक निर्धारित पुनरावृत्ति के लिए प्रगतिशील डिज़ाइन की जगह लेता है।
साझा मूल
मापी हृदय अपने स्वयं के स्टेट के बारे में सच नहीं बता सकता। यह सिर्फ घड़ी को जानता है। प्रपत्र 1: स्टेट रिपेयर नौकरी टाइम आउट के 5 मिनट बाद चलने के बावजूद टाइम पर टूटे हुए स्टेट को ठीक करती है। प्रपत्र 2: रिपोर्ट नौकरी 2 बजे चलने के बावजूद कल से किसी भी डेटा में परिवर्तन हुआ हो या नहीं का पता चलता है।
घड़ी को काम करने के बारे में जानकारी नहीं होती है। एक इवेंट उस जानकारी को ले जाता है: 'एक स्टेट ट्रांजिशन बस फेल हो गई', 'नए ऑर्डर बस पहुंचे'। एक मापी हृदय उस जानकारी को फेंक देता है और इसे समय के साथ बदल देता है।
राजधानी से निकासी
एक मापित हृदय जीवित राजधानी निकासी करता है: इंजीनियर ब्रेकन-स्टेट घटनाओं के लिए कॉल पर होते हैं। सामाजिक विश्वास क्षरण: उपयोगकर्ता असमान डेटा देखते हैं और स्वयं हल होने वाले दोषों की सूचना करते हैं। अन्य MOADs को बढ़ाता है: एक स्टेट-रिपेयर नौकरी जो सभी रिकॉर्ड्स को तोड़फोड़ स्टेट खोजने के लिए स्कैन करती है अक्सर MOAD-0001 (O(N²) स्कैन) को शामिल करती है। एक रिपोर्ट नौकरी जो ठंडे पुनर्निर्माण कर सकती है MOAD-0005 (क्यू स्टैम्पेड) को ट्रिगर करती है। MOAD-0009 अन्य दोषों को बढ़ाता है।
साझा मूल
फॉर्म 1 और फॉर्म 2 का सामने से अलग दिखते हैं: एक राजधानी स्टेट को ठीक करता है, दूसरा डेटा को पुनर्संगठित करता है। सामान्य कारण उन्हें जोड़ता है।
परिवर्तन पर जलाएं, घड़ी पर नहीं
इवेंट-ड्रIVEN डिज़ाइन परिवर्तन पर जलता है। स्टेट चेंज ही इवेंट है। इवेंट ट्रिगर है।
फॉर्म 1: अटॉमिक ट्रांजिशन रिपेयर नौकरी की जगह लेता है।
यदि स्टेट ट्रांजिशन सिस्टम को एक टूटी हुई मध्य स्थिति में छोड़ सकती है, तो दोष ट्रांजिशन में है, न कि इसकी कमी। ट्रांजिशन को अटॉमिक रूप से पूरा करने के लिए सुधारें। जब ट्रांजिशन अटॉमिक रूप से पूरा होता है, तो टूटी हुई स्टेट कभी नहीं मौजूद होती है। रिपेयर नौकरी के लिए कुछ नहीं होता है।
# दोष: टूटी हुई स्टेट में अटॉमिक ट्रांजिशन
def close_pr_on_repo_private(pr_id):
pr = PR.get(pr_id)
pr.status = 'branch-forced-closed' # चरण 1: आंशिक स्थिति
pr.save() # उपयोगकर्ताओं के लिए अब सichtbar
# ... अन्य चरणों को विफल हो सकते हैं
pr.merge_status = 'not_applicable'
pr.save() # step 2: अब संगत
# Sidekiq नौकरी संगति को सामान्य करती है यदि चरण 2 विफल होता है
# ठीक करें: परमाणु परिवर्तन; कोई मध्यावधि राज्य स्पष्ट नहीं होता है
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() # दोनों क्षेत्र परमाणु रूप से कमिट होते हैं; कभी आधा लिखा नहीं
प्रपत्र 2: धारावाहिक अपडेट पूर्ण-पुनर्निर्माण को बदल देता है।
एक रिपोर्ट जो पुनर्निर्माण से शुरू करती है क्योंकि पुरानी डेटा + नई डेटा = नई परिणाम। लेकिन पुराना परिणाम + डेल्टा = सामान नई परिणाम, धारावाहिक रूप से गणना की जाती है। घटना: नई डेटा प्राप्त होती है। ट्रिगर: अपडेट करने के लिए नई डेटा के लिए एकाग्रता केवल।
# विकृति: पूर्ण-पुनर्निर्माण समयानुसार
def nightly_totals_job():
for user in all_users():
total = sum(o.amount for o in user.orders) # सभी समय के लिए स्कैन
user.total_purchases = total
user.save()
# ठीक करें: इवेंट-ड्राइवन धारावाहिक अपडेट
def on_order_placed(order):
order.user.total_purchases += order.amount # डेल्टा केवल
order.user.save()
धारावाहिक अपडेट जब एक ऑर्डर प्राप्त होता है, नहीं 2 बजे। यह केवल प्रभावित उपयोगकर्ता को अपडेट करता है। यह नई ऑर्डर को पढ़ता है, सभी समय के लिए सभी ऑर्डर नहीं। रात की नौकरी गायब हो जाती है।
क्यों प्रपत्र 1 एक तोड़फोड़ परिवर्तन का खुलासा करता है
प्रपत्र 1 मीटर्ड हार्ट एक तोड़फोड़ राज्य परिवर्तन को अपरिपक्व छोड़ देता है। सुधार नौकरी इसलिए मौजूद है क्योंकि एक इंजीनियर तोड़फोड़ राज्य को पहचानकर एक सामंजस्य स्थापना mechanism बजाय परिवर्तन की मरम्मत के जोड़ा। सुधार नौकरी: एक पैच एक तोड़फोड़ वास्तुशिल्प निर्णय पर।
MOAD-0009 के रूप में प्रवर्धक
MOAD-0009 अन्य MOADs को बढ़ाता है। एक राज्य-सुधार नौकरी जो सभी रिकॉर्ड्स को स्कैन करके तोड़फोड़ राज्य को ढूंढती है: MOAD-0001 (O(N) या O(N²) स्कैन प्रति नौकरी रन)। एक रिपोर्ट नौकरी जो पूरी तरह से कुछ को पुनर्निर्माण करती है: MOAD-0005 (कैल्शियम के हमले जब नौकरी शुरू होती है और एक गरम अपस्ट्रीम को छूती है)। MOAD-0009 अपने आप हानि नहीं करता; यह अन्य MOADs को समय पर देता है।
डायग्नोसिस & रीडिज़ाइन
रात को 2 बजे एक टीम का क्रोन जॉब चलता है। यह जॉब सभी ऑर्डर की जाँच करता है और हर यूजर के कुल खरीद मात्रा को स्क्रैच से पुनर्गणित करता है। यह जॉब 4 घंटे लेती है। 6 बजे तक, डैशबोर्ड फ्रेश टोटल दिखाता है। 2 बजे से 6 बजे के बीच, डैशबोर्ड कल के टोटल दिखाता है।