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

डेटा इंजीनियरिंग इंटरव्यू: मेमोरी समाप्त किए बिना आप etcd 3.7 RangeStream का उपयोग कैसे करेंगे?

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

प्रश्न

आपको कॉन्फ़िगरेशन एक्सपोर्ट के लिए etcd से लाखों प्रीफ़िक्स्ड कुंजियों (keys) को पढ़ना होगा। सर्वर और क्लाइंट मेमोरी के चरम स्तर (peaks) को कम करने, एक सुसंगत परिणाम बनाए रखने, त्रुटियों से उबरने और असमर्थित क्वेरी विकल्पों को संभालने के लिए आप RangeStream का उपयोग कैसे करेंगे?

सवाल

आपको कॉन्फ़िगरेशन एक्सपोर्ट के लिए etcd से लाखों प्रीफ़िक्स्ड कुंजियों (keys) को पढ़ना होगा। सर्वर और क्लाइंट मेमोरी के चरम स्तर (peaks) को कम करने, एक सुसंगत परिणाम बनाए रखने, त्रुटियों से उबरने और असमर्थित क्वेरी विकल्पों को संभालने के लिए आप RangeStream का उपयोग कैसे करेंगे?

संदर्भ और सीमाएं

etcd v3.7 को 8 जुलाई, 2026 को जारी किया गया था और इसमें RangeStream जोड़ा गया था। आधिकारिक प्रोजेक्ट का कहना है कि यह बड़े रेंज परिणामों को चंक्स (chunks) में विभाजित करता है ताकि न तो सर्वर और न ही क्लाइंट को संपूर्ण प्रतिक्रिया को बफ़र करना पड़े। यह सवाल एक सीमित बड़े-परिणाम वाले रीड के बारे में है, न कि Watch के बारे में, और यह नहीं मानता है कि RangeStream सॉर्टिंग, रिविजन फ़िल्टर, या etcd gRPC proxy का समर्थन करता है।

पहले स्पष्ट करें: क्या एक्सपोर्ट के लिए एक सुसंगत दृश्य (consistent view) की आवश्यकता है? क्या उपभोक्ता चंक्स के आते ही उन्हें प्रोसेस कर सकता है? विफलता के बाद, क्या पूर्ण पुनः प्रयास (full retry) स्वीकार्य है या प्रगति को रिकॉर्ड किया जाना चाहिए? क्या क्लाइंट सीधे etcd से जुड़ता है या gRPC proxy के माध्यम से?

साक्षात्कारकर्ता क्या परीक्षण कर रहा है

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

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

पहले निरंतरता और रिकवरी आवश्यकताओं की पुष्टि करें। RangeStream चंक्स का उपभोग करें और कुंजियों को मेमोरी में जमा करने के बजाय एक अस्थायी फ़ाइल या डाउनस्ट्रीम में लिखें। साफ़ तौर पर पूर्ण होने के बाद केवल अंतिम चंक से header, more, और count पढ़ें। रेंज, रिविजन और चंक गणना रिकॉर्ड करें; अपूर्ण आउटपुट को छोड़ दें और स्ट्रीम विफलता पर पुनः प्रयास करें। यदि सॉर्टिंग या रिविजन फ़िल्टरिंग की आवश्यकता है, तो असमर्थित विकल्पों को पास करने के बजाय नियंत्रित एप्लिकेशन प्रोसेसिंग का उपयोग करें या कार्य को विभाजित करें।

चरण-दर-चरण गहन विश्लेषण

  1. API का चयन: RangeStream, Range के समान ही RangeRequest स्वीकार करता है लेकिन कई RangeStreamResponse संदेश लौटाता है। यह बड़े परिणाम सेट के लिए है, परिवर्तनों की सदस्यता (subscription) के लिए नहीं।
  2. निरंतरता (Consistency): यदि अनुरोध कोई रिविजन सेट नहीं करता है, तो स्ट्रीम शुरू होने पर सर्वर नवीनतम कमिटेड रिविजन को कैप्चर करता है और उस रिविजन से प्रत्येक चंक को सर्व करता है। ऑडिटेबिलिटी के लिए इसे रिकॉर्ड करें।
  3. क्रमिक उपभोग (Incremental consumption): प्रत्येक चंक में kvs का एक अलग स्लाइस होता है। चंक्स को आगमन क्रम में एक अस्थायी फ़ाइल, ऑब्जेक्ट स्टोर, या डाउनस्ट्रीम प्रोसेसर में लिखें; बाइट्स, रिकॉर्ड्स और प्रोसेसिंग समय को सीमित करें ताकि बैकप्रेशर मेमोरी स्पाइक को दोबारा न बनाए।
  4. टेल मेटाडेटा (Tail metadata): header, more, और count केवल अंतिम चंक में पॉप्युलेट होते हैं जब स्ट्रीम साफ़ तौर पर पूरी हो जाती है। पहले के चंक्स उन्हें शून्य-मान (zero-valued) छोड़ देते हैं, इसलिए वे प्रारंभिक कुल प्रदान नहीं कर सकते।
  5. त्रुटि रिकवरी (Error recovery): स्ट्रीम त्रुटि पर कोई भी चंक मान्य header, more, या count नहीं ले जाता है। अस्थायी आउटपुट को अमान्य के रूप में चिह्नित करें, उसी रिविजन और रेंज के साथ पुनः प्रयास करें, और सफलता के बाद ही एक्सपोर्ट को परमाणु रूप से (atomically) प्रकाशित करें।
  6. क्षमता सीमाएं (Capability boundaries): RangeStream कस्टम ऑर्डरिंग, रिविजन फ़िल्टर, या etcd gRPC proxy का समर्थन नहीं करता है। एक संगत डायरेक्ट एंडपॉइंट का उपयोग करें, रेंज को सीमित करें, या नियंत्रित एप्लिकेशन-साइड सॉर्टिंग और संस्करण जांच लागू करें।
  7. अपग्रेड नीति: v3.6 से v3.7 पर जाने से पहले, कम से कम v3.6.11 चलाएं, समर्थित आसन्न-मामूली (adjacent-minor) अपग्रेड पथ का पालन करें, और क्लाइंट, प्रॉक्सी और एक्सपोर्ट जॉब की कैनरी टेस्टिंग करें।

मॉडल उत्तर

मैं एक्सपोर्ट को एक निश्चित रिविजन के साथ एक रिकवरेबल बैच बनाऊंगा। etcd v3.7 RangeStream, Range परिणाम को चंक करता है, इसलिए न तो सर्वर और न ही क्लाइंट पूरे परिणाम को बफ़र करता है। अनुरोध की शुरुआत में मैं प्रीफ़िक्स, लिमिट, अनुरोधित रिविजन और जॉब आईडी रिकॉर्ड करता हूं। उपभोक्ता सभी kvs को एक सूची में रखने के बजाय चंक्स को अस्थायी स्टोरेज में लिखता है।

प्रत्येक चंक केवल अपने स्वयं के kvs को प्रोसेस करता है। मैं header, more, और count को टेल मेटाडेटा के रूप में मानता हूं और अस्थायी स्टोरेज को केवल तभी पूर्ण चिह्नित करता हूं जब स्ट्रीम साफ़ तौर पर समाप्त हो जाती है और अंतिम चंक उन्हें आपूर्ति करता है। यदि कनेक्शन विफल हो जाता है, तो मैं अस्थायी आउटपुट को छोड़ देता हूं या क्वारंटाइन कर देता हूं और उसी रिविजन और रेंज का पुनः प्रयास करता हूं, ताकि आंशिक एक्सपोर्ट डाउनस्ट्रीम उपभोक्ताओं तक न पहुंच सके।

text
request:
  prefix: /tenant/config/
  revision: 0
  stream: true
consumer:
  process_each_chunk: true
  persist_to: temporary_object
  publish_only_after_clean_eof: true
  max_chunk_bytes: 8388608
failure:
  discard_incomplete_output: true
  retry_same_revision: true

यदि आवश्यकता में ऑर्डरिंग, रिविजन फ़िल्टर, या gRPC proxy शामिल है, तो मैं यह दिखावा नहीं करूंगा कि RangeStream उनका समर्थन करता है। मैं स्पष्ट मेमोरी और समय बजट के साथ क्षमता को एप्लिकेशन में ले जाऊंगा, एक संगत डायरेक्ट एंडपॉइंट का उपयोग करूंगा, या क्वेरी को विभाजित करूंगा। अपग्रेड से पहले, 3.6.11 या बाद के संस्करण से शुरुआत करें, एक समय में एक विफलता डोमेन की कैनरी टेस्टिंग करें, और एक्सपोर्ट आउटपुट, क्लाइंट व्यवहार और रोलबैक को सत्यापित करें।

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

  • RangeStream को Watch मानना और इस बात को नज़रअंदाज़ करना कि यह एक सीमित Range परिणाम स्ट्रीम है।
  • पहले चंक से count या header पढ़ना और गलत मेटाडेटा रिपोर्ट करना।
  • स्ट्रीम विफलता से पहले लिखी गई आंशिक फ़ाइल को प्रकाशित करना।
  • यह मान लेना कि RangeStream ऑर्डरिंग, रिविजन फ़िल्टर और gRPC proxy का समर्थन करता है।
  • क्लाइंट संस्करणों, क्रम और रिकवरी जॉब्स को मान्य किए बिना सर्वर को अपग्रेड करना।

एक मजबूत उत्तर रिविजन सीमा, चंक जीवनचक्र, टेल मेटाडेटा, विफलता रिकवरी और API सीमाओं की व्याख्या करता है। "मेमोरी कम करने के लिए बैचों में पढ़ना" शुद्धता साबित नहीं करता है।

अनुवर्ती प्रश्न और उत्तर

आप प्रत्येक चंक के count को क्यों नहीं जोड़ सकते?

आधिकारिक सिमेंटिक्स केवल अंतिम चंक में count पॉप्युलेट करते हैं; पहले के मान शून्य-मान (zero-valued) होते हैं, और अंतिम मान पूर्ण अनुरोध का वर्णन करता है। प्रगति के लिए, उपभोग की गई कुंजियों और बाइट्स की स्वयं गणना करें, फिर साफ़ तौर पर पूर्ण होने के बाद अंतिम मेटाडेटा के साथ मिलान करें।

स्ट्रीम विफलता से पहले लिखे गए ऑब्जेक्ट-स्टोर डेटा का क्या होता है?

एक जॉब आईडी और अस्थायी प्रीफ़िक्स के तहत लिखें। साफ़ EOF और अंतिम-मेटाडेटा सत्यापन के बाद ही एक अपरिवर्तनीय संस्करण प्रकाशित करें। सफाई या जांच के लिए विफल ऑब्जेक्ट्स को चिह्नित करें; सामान्य रीड पाथ को उन्हें खोजना नहीं चाहिए।

आप कुंजी (key) द्वारा सॉर्ट करने की आवश्यकता को कैसे संभालते हैं?

RangeStream कस्टम ऑर्डरिंग का समर्थन नहीं करता है। प्राकृतिक कुंजी क्रम का उपभोग करें और स्पष्ट मेमोरी, डिस्क और समय बजट के साथ एक बाहरी मर्ज सॉर्ट (external merge sort) करें; यदि सर्वर-साइड ऑर्डरिंग अनिवार्य है, तो नकली विकल्प भेजने के बजाय ऐसे क्वेरी पाथ का उपयोग करें जो इसका समर्थन करता हो।

आप etcd अपग्रेड के दौरान असमर्थित संस्करणों को छोड़ने से कैसे बचते हैं?

आधिकारिक नीति का पालन करें: पैच अपग्रेड एक मामूली (minor) संस्करण के भीतर रहते हैं, और मामूली अपग्रेड एक समय में एक संस्करण आगे बढ़ते हैं। 3.6 से 3.7 से पहले, 3.6.11 या नए संस्करण तक पहुंचें और क्लाइंट्स तथा रिकवरी जॉब्स की कैनरी टेस्टिंग करें।

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

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