यो एउटा असफलता हो जो मैले दुई फरक इन्जिनमा दुई पटक देखेँ। एउटा निर्यात 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

यदि डेलिभरी आधा बाटोमा असफल भयो भने नयाँ स्रोत-स्थान रचना गर्नुको सट्टा त्यही ब्याच मिलाउनुहोस्। अझ ताजा माथिल्लो सीमासहित पुनः निकास गर्नु नै आंशिक प्रयोगलाई स्थायी खाली ठाउँ बनाउने बाटो हो। ऐना-नियम अर्को तर्फ पनि लागू हुन्छ: लक्ष्यमा इडेम्पोटेन्ट प्रयोगले प्रतिलिपि रोक्छ र निकासले कहिल्यै नदेखेको परिवर्तनका लागि केही गर्दैन।

मेटाइका लागि अभिलेख चाहिन्छ, निष्कर्ष होइन

अझै अस्तित्वमा रहेका पङ्क्तिहरू तुलना गरेर उपभोक्तालाई कुन कुञ्जीहरू हराए भन्न सकिँदैन। मेटाइ कहिल्यै रेकर्ड नगर्ने स्रोतले तपाईंलाई दुई अपूर्ण विकल्प दिन्छ: भिन्नताका लागि पर्याप्त लामो कुञ्जी-इतिहास राख्नु, वा तालिकाअनुसार स्पष्ट पूर्ण मिलान चलाउनु। दुवै खर्चिला डिजाइन निर्णय हुन्, र कसैले स्वामित्व नलिएसम्म कुनै पनि हुँदैन।

अवधारण पनि त्यही प्रकारको निर्णय हो। प्रत्येक समर्थित परिवर्तन-फिडको एउटा विन्डो हुन्छ; त्यसलाई सम्झौतामा घोषणा गर्नुहोस् र उपभोक्ताको चेकपोइन्ट त्यसको नजिक आउँदा चेतावनी दिनुहोस्। दुई हप्ताको अवरोधपछि जाग्ने उपभोक्ताले चुपचाप आंशिक ब्याच पाउनुको सट्टा स्पष्ट "पुनःस्थापना आवश्यक" त्रुटि पढ्नुपर्छ।

त्यसपछि डेल्टा सार्थक थियो कि भनेर नाप्नुहोस्

हरेक कुञ्जी र ह्यास तुलना गर्न फर्किनु कहिलेकाहीँ ठीक हुन्छ, र यसको लागत थाहा पाउनु उपयुक्त हुन्छ। तपाईं अझै हरेक पङ्क्तिको जानकारी स्थानान्तरण गर्नुहुन्छ, ह्यासहरूले तालिकाहरूभरि सुसंगत स्न्यापसट दिँदैनन्, र ह्यास योजनाले प्रतिनिधित्व र टक्करबारे आफ्नै प्रश्नहरू ल्याउँछ। प्रमाणित गर्न सकिने सीमासहित कम बाइट लक्ष्य हो; कमिट भएको परिवर्तन चुपचाप खसाल्ने कम बाइट डेल्टा नै होइन।

अन्तिम-परिवर्तन स्तम्भ एउटा सङ्केत हो। ढिलो कमिट, मेटाइ र लामो अवरोध पार गर्ने कर्सर नै सम्झौता हो।

सम्बन्धित लेखहरू