तुमचा डेल्टा फीड उशिरा आलेले कमिट सोडतो: विश्वासार्ह कर्सर तयार करा
एक ओळ उशिरा आली कारण वॉटरमार्क ही कमिटची सीमा नव्हती. अयशस्वीतेचा माग घ्या, नंतर व्याप्ती, सीमा, धारणा आणि सुरक्षित पुन्हा-सुरुवात निश्चित करा.
ही अशी अयशस्वीता आहे जी मी दोन वेगवेगळ्या इंजिनांमध्ये दोनदा पाहिली. एक निर्यात 10:00 वाजता चालते आणि पाहिलेला सर्वोच्च शेवटचा-बदल टाइमस्टॅम्प नोंदवते. 09:58 वाजता सुरू झालेला एक व्यवहार अजूनही खुला आहे, 10:03 वाजता कमिट होतो आणि त्याच्या सुरुवातीच्या क्षणाचा टाइमस्टॅम्प बाळगतो. पुढील निर्यात फक्त 10:00 पेक्षा नवीन ओळी मागते आणि ती कधीही पाहत नाही. हस्तांतरणाचा आकार उत्कृष्ट होता आणि माहिती चुकीची होती.
एक ओळ गमावलेल्या निर्यातीचा माग घ्या
SQL नाही, घटनांचा क्रम पाठवा. अनुप्रयोग व्यवहार सुरू होताना ओळीचा बदल-वेळ लिहितो, कमिट होताना नाही. निर्यातक तो व्यवहार अजून खुला असतानाच भिंत-घड्याळाचे वॉटरमार्क वाचतो. नंतर व्यवहार साठवलेल्या वॉटरमार्कपेक्षा जुन्या बदल-वेळेसह कमिट होतो. ग्राहकाची पुढील बॅच वॉटरमार्कनंतर सुरू होते, त्यामुळे ओळ कर्सरच्या मागे राहते आणि पुन्हा कधीही निवडली जाणार नाही.
काहीही त्रुटी नोंदवत नाही, कारण काहीही अयशस्वी झाले नाही. हेच या वर्गातील बग महाग करते: डेल्टा फीड वेगवान आहे, ओळींची संख्या विश्वासार्ह वाटते, आणि गहाळ ओळ आठवड्यांनंतर कोणीही पुन्हा तयार करू शकत नाही अशा जुळणी-तिकिटाच्या रूपात समोर येते.
क्रम-संख्याांमध्ये दुसऱ्या कारणाने तीच आकाराची त्रुटी आहे. एकरस ID मूल्ये कोणत्या क्रमाने वाटली हे सांगते, व्यवहार कोणत्या क्रमाने कमिट झाले ते नाही. कमी क्रमांक घेतलेला व्यवहार जास्त क्रमांक घेतलेल्यानंतर कमिट होऊ शकतो, त्यामुळे वाटप-क्रमावर आधारित कर्सरही भोक सोडू शकतो.
फीडने देय असलेली पाच वचने
वाहतूक निवडण्यापूर्वी स्रोत प्रणालीकडे पाच कलमांचा करार मागा. कोणतेही कलम गहाळ असल्यास तुमच्याकडे बदल-फीड नाही, एक अंदाज आहे.
- व्याप्ती: समावेश, अद्ययावत आणि हटवणे, प्रत्येकासह लागू करण्यासाठी आवश्यक स्थिर कळ.
- सीमा: कर्सर मूल्याचा अर्थ काय आणि सुसंगत बॅचमध्ये काय असते.
- सुसंगती: विसंगत स्रोत-स्थिती न मिसळता संबंधित तक्ते कशी वाचली जातात.
- धारणा: तुटलेला ग्राहक त्याच्या साठवलेल्या स्थानावरून किती काळ पुढे जाऊ शकतो.
- पुनर्स्थापना: ते स्थान यापुढे वैध नसल्यास समर्थित पूर्ण स्नॅपशॉट.
समर्थित यंत्रणा पाचही पूर्ण करू शकते. SQL Server चे बदल-ट्रॅकिंग दस्तऐवज हे एक ठोस प्रकाशित उदाहरण आहे: ते किमान वैध आवृत्ती परिभाषित करते, बदलांसह हटवणेही नोंदवते, आणि पडताळणी, आवृत्ती-पकड आणि संबंधित बदल-प्रश्न यांचा समावेश असलेला स्नॅपशॉट व्यवहार वर्णन करते. हे स्रोताकडून काय मागावे याचे उदाहरण आहे, दुसऱ्या इंजिनात चिकटवता येणारी वाक्यरचना नाही.
चेकपॉइंट पाइपलाइनचा भाग म्हणून रचा
ग्राहकाचे साठवलेले स्थान हे खरे स्टेट मशीन आहे, म्हणून तसेच लिहा. बॅच आधीच लागू करून लक्ष्य व्यवहार कमिट केलेल्या कार्यप्रवाहातूनच कर्सर पुढे सरकू शकतो.
cursor = durable_checkpoint() # last fully applied position
batch = extract(cursor, upper_bound) # one consistent batch
apply(batch) # idempotent at the target
commit()
checkpoint(batch.upper_bound) # only now
वितरण अर्ध्यावर अयशस्वी झाल्यास नवे स्रोत-स्थान कल्पून न काढता तीच बॅच जुळवा. अधिक ताज्या वरच्या सीमेसह पुन्हा काढणे हाच आंशिक उपयोग कायमचे भोक होण्याचा मार्ग. आरसा-नियम दुसऱ्या बाजूलाही लागू होतो: लक्ष्यावर इडेम्पोटेंट उपयोग प्रतिकृती रोखतो आणि काढण्याने कधीही न पाहिलेल्या बदलासाठी काहीही करत नाही.
हटवण्यासाठी नोंदी आवश्यक, निष्कर्ष नाही
अजून अस्तित्वात असलेल्या ओळींची तुलना करून ग्राहकाला कोणत्या कळा गायब झाल्या हे सांगता येत नाही. हटवणे कधीही नोंदवणारा स्रोत तुम्हाला दोन अपूर्ण पर्याय देतो: फरकासाठी पुरेसा काळ कळ-इतिहास ठेवणे, किंवा वेळापत्रकानुसार स्पष्ट संपूर्ण जुळणी चालवणे. दोन्ही खर्चाचे रचना-निर्णय आहेत, आणि कोणी मालकी न घेतल्यास एकही टिकत नाही.
धारणाही त्याच प्रकारचा निर्णय आहे. प्रत्येक समर्थित बदल-फीडला एक खिडकी असते; ती करारात जाहीर करा आणि ग्राहकाचा चेकपॉइंट तिच्या जवळ येताच इशारा द्या. दोन आठवड्यांच्या खंडानंतर जागा होणाऱ्या ग्राहकाने गपचूप आंशिक बॅच घेण्याऐवजी "पुनर्स्थापना आवश्यक" असा स्पष्ट त्रुटी संदेश वाचावा.
मग डेल्टा फायद्याचा होता का ते मोजा
प्रत्येक कळ आणि हॅशची तुलना करण्याकडे परत जाणे कधीकधी बरोबर असते, आणि त्याचा खर्च जाणून घेणे योग्य आहे. तुम्ही अजूनही प्रत्येक ओळीची माहिती हस्तांतरित करता, हॅश तक्त्यांमध्ये सुसंगत स्नॅपशॉट देत नाहीत, आणि हॅश-योजना प्रतिनिधित्व व टक्करांबद्दल स्वतःचे प्रश्न आणते. पडताळण्यायोग्य सीमेसह कमी बाइट हे लक्ष्य आहे; कमिट झालेला बदल गपचूप गमावणारे कमी बाइट डेल्टा नाहीतच.
शेवटचा-बदल स्तंभ हा एक संकेत आहे. उशिरा आलेला कमिट, हटवणे आणि लांब खंड पार करणारा कर्सर हा करार आहे.