प्रतिनिधि इंटरव्यू विषय

डेटा इंजीनियरिंग इंटरव्यू: इवेंट फ़ील्ड रीनेम को सुरक्षित रूप से कैसे रोल आउट करें

डेटाकठिन
Offer.cc संपादकीय टीमप्रकाशित अपडेट किया गया

प्रश्न

एक ऑर्डर इवेंट में `total_cents` का नाम बदलकर `amount_minor` करना है और गैर-USD मुद्राओं का समर्थन करना है। बारह कंज़्यूमर्स स्वतंत्र रूप से डिप्लॉय होते हैं और 90 दिनों का डेटा रीप्ले किया जा सकता है। आप नाम और अर्थ के इस बदलाव को कैसे शिप करेंगे?

प्रॉम्प्ट और संदर्भ

यह माइग्रेशन फ़ील्ड के नाम और उसके अर्थ दोनों को बदलता है: total_cents मानता है कि मुद्रा USD है, जबकि amount_minor को एक स्पष्ट (explicit) मुद्रा के साथ काम करना चाहिए। एक Avro alias नाम समाधान (name resolution) में सहायता कर सकता है, लेकिन यह साबित नहीं कर सकता कि "cents" को "minor currency units" में सही ढंग से माइग्रेट किया गया था।

इंटरव्यूअर क्या मूल्यांकन करता है

  • प्रोड्यूसर्स द्वारा नए फ़ील्ड को भरने से पहले रीडर्स का विस्तार करना।
  • स्ट्रक्चरल कम्पैटिबिलिटी को राशि के सिमेंटिक्स से अलग करना।
  • 90 दिनों के रीप्ले के लिए पुराने स्कीमा और ट्रांसफॉर्मेशन को सुरक्षित रखना।
  • किसी कैलेंडर तिथि के बजाय कंज़्यूमर के साक्ष्यों के आधार पर फ़ील्ड को रिटायर करना।

उत्तर देने से पहले स्पष्टीकरण

फॉर्मेट, रजिस्ट्री मोड, अज्ञात-फ़ील्ड व्यवहार, राशि प्रतिनिधित्व, मुद्रा की उपलब्धता, सबसे धीमे कंज़्यूमर और रीप्ले चक्र की पुष्टि करें। पूछें कि क्या दोनों अर्थों को संगत रूप से प्रदर्शित न किए जाने की स्थिति में v2 टॉपिक उपलब्ध है।

30-सेकंड का उत्तर ढांचा

पहले वैकल्पिक amount_minor और currency जोड़ें। हर कंज़्यूमर को अपग्रेड करें ताकि वह नए फ़ील्ड्स को प्राथमिकता दे और total_cents पर फ़ॉलबैक करे, साथ ही USD इवेंट्स के लिए समानता को मान्य करे। फिर प्रोड्यूसर्स में डुअल-पॉप्युलेट करें और नए बिज़नेस लॉजिक को पुराने फ़ील्ड को पढ़ने से रोकें। ऐतिहासिक स्कीमा और ट्रांसफॉर्म्स को 90 दिनों से अधिक समय तक सुरक्षित रखें। पुराने फ़ील्ड को तभी हटाएं जब प्रोड्यूसर्स इसे लिखना बंद कर दें, कंज़्यूमर्स और ऑफ़लाइन डिपेंडेंसी इसे पढ़ना बंद कर दें, और नए स्कीमा के साथ पूरा 90-दिन का रीप्ले सफल हो जाए।

चरण-दर-चरण विस्तृत विश्लेषण

पहला चरण एडिटिव (जोड़ने वाला) है। रजिस्ट्री कम्पैटिबिलिटी और एक CI रीडर/राइटर मैट्रिक्स अमान्य वर्ज़न को ब्लॉक करते हैं। नए प्रोड्यूसर्स के डिप्लॉय होने से पहले कंज़्यूमर्स को डुअल-रीड सपोर्ट मिल जाता है।

दूसरा चरण डुअल-पॉप्युलेट करता है। USD के लिए amount_minor == total_cents और currency == USD की आवश्यकता होती है; गैर-USD इवेंट्स केवल वास्तविक नए सिमेंटिक्स को पॉप्युलेट करते हैं। प्रोड्यूसर वर्ज़न, कंज़्यूमर और मुद्रा के आधार पर कवरेज, फ़ॉलबैक और मिसमैच को ट्रैक करें।

तीसरा चरण रीप्ले को सुरक्षित रखते हुए पुराने फ़ील्ड पर बिज़नेस निर्भरता को समाप्त करता है। रीप्लेयर आज के डिफॉल्ट्स के साथ इतिहास की व्याख्या करने के बजाय राइटर स्कीमा ID के आधार पर ट्रांसफॉर्म्स चुनता है। यदि एक ही सब्जेक्ट दोनों अर्थों को सुरक्षित रूप से व्यक्त नहीं कर सकता है, तो v2 टॉपिक और एक स्पष्ट ट्रांसलेटर का उपयोग करें।

रिटायरमेंट तभी करें जब सभी प्रोड्यूसर्स पुराने राइट्स बंद कर दें, फ़ॉलबैक शून्य हो जाए, पूरी रीप्ले विंडो समाप्त हो जाए, और ऑफ़लाइन जॉब्स की जांच (inventory) पूरी हो जाए। डिप्लॉय करने योग्य रोलबैक स्कीमा और ट्रांसफॉर्म वर्ज़न बनाए रखें।

मजबूत नमूना उत्तर

मैं एक्सपैंड-माइग्रेट-कॉन्ट्रैक्ट (expand-migrate-contract) का उपयोग करूँगा: फ़ील्ड्स जोड़ें और रीडर्स को अपग्रेड करें, डुअल-राइट और सामंजस्य (reconciliation) स्थापित करें, फिर पुराने फ़ील्ड को तभी रिटायर करें जब साक्ष्य यह दिखाएं कि हर डिपेंडेंसी ने इसे छोड़ दिया है। एलियास केवल नामकरण की समस्या हल करते हैं; मुद्रा सिमेंटिक्स के लिए कॉन्ट्रैक्ट टेस्ट और रनटाइम इनवेरिएंट्स की आवश्यकता होती है।

पुराना फ़ील्ड एक पूरी रीप्ले विंडो तक बना रहता है। यदि USD डुअल राइट्स में असहमति होती है, तो रोलआउट को रोकें और प्रोड्यूसर की मरम्मत होने तक उस USD बैच के लिए total_cents को प्रामाणिक रखें। गैर-USD इवेंट्स के लिए amount_minor + currency को प्रामाणिक बनाए रखना चाहिए; मनगढ़ंत सेंट्स मान बनाने के बजाय नए गैर-USD अंतर्ग्रहण (ingestion) को रोकें या इसे v2 टॉपिक पर रूट करें। रिटायरमेंट के बाद, दोनों नए फ़ील्ड अनिवार्य रनटाइम इनवेरिएंट्स बन जाते हैं। कॉन्ट्रैक्ट हटाना तभी शुरू होता है जब ऑनलाइन, ऑफ़लाइन और रीप्ले के सभी रास्ते बंद हो जाते हैं।

सामान्य गलतियाँ

  • एक ही स्कीमा कमिट में फ़ील्ड का नाम बदलना।
  • एलियास को राशि रूपांतरण मानना।
  • कंज़्यूमर्स से पहले प्रोड्यूसर्स को डिप्लॉय करना।
  • आज की डिफॉल्ट मुद्रा के साथ पुराने इतिहास को पढ़ना।
  • ऑफ़लाइन और रीप्ले कंज़्यूमर्स को नज़रअंदाज़ करना।

फॉलो-अप प्रश्न

केवल एक एलियास ही पर्याप्त क्यों नहीं है?

यह फ़ील्ड नाम को हल करने में मदद करता है; यह साबित नहीं करता कि सेंट्स और किसी अन्य मुद्रा की छोटी इकाई (minor unit) का अर्थ समान है।

v2 टॉपिक की आवश्यकता कब होती है?

जब पुराने और नए अर्थों को आवश्यक कम्पैटिबिलिटी कॉन्ट्रैक्ट के तहत स्पष्ट रूप से प्रदर्शित नहीं किया जा सकता है।

यदि डुअल राइट्स में विसंगति हो तो क्या करें?

USD डुअल राइट्स के लिए, रोलआउट रोकें, प्रभावित बैच के लिए total_cents को प्रामाणिक रखें, प्रोड्यूसर वर्ज़न के आधार पर अलग करें, ठीक करें और रीप्ले करें। गैर-USD के लिए, amount_minor + currency को प्रामाणिक रखें और अंतर्ग्रहण को रोकें या v2 टॉपिक का उपयोग करें; कभी भी काल्पनिक सेंट्स मान पर फ़ॉलबैक न करें।

पुराना फ़ील्ड कब हटाया जा सकता है?

जब पुराने राइट्स बंद हो जाएं, फ़ॉलबैक शून्य हो जाए, पूरी रीप्ले विंडो बीत जाए, और ऑफ़लाइन इन्वेंट्री साफ़ हो जाए।

सार्वजनिक स्रोत

संबंधित प्रश्न