प्रॉम्प्ट और दायरा
एक B2B प्रोडक्ट को पूर्ण (full) और वृद्धिशील (incremental) एक्सपोर्ट की आवश्यकता होती है। एक एक्सपोर्ट अनुरोध टाइमआउट और एकल-फ़ाइल सीमाओं को पार कर सकता है, और क्लाइंट डाउनलोड टूटने के बाद पुनः प्रयास कर सकता है। यह इंटरव्यू एक्सपोर्ट सीमाओं, एसिंक्रोनस स्थिति, चेकपॉइंट्स, फ़ाइल दृश्यता, ऑथराइजेशन और संसाधन कोटा का परीक्षण करता है।
इंटरव्यूअर क्या परीक्षण कर रहा है
इंटरव्यूअर यह देखना चाहता है कि क्या आप एक लंबे काम को एक अवलोकनीय (observable), पुनः आरंभ करने योग्य (resumable) प्रोटोकॉल में बदल सकते हैं। Google का Data Portability API एक्सपोर्ट को एक समर्पित क्षमता के रूप में मानता है और संवेदनशील स्कोप्स के लिए समीक्षा की मांग करता है; Zendesk इंक्रीमेंटल एक्सपोर्ट अगले शुरुआती बिंदु के लिए एक कर्सर या समय सीमा को सहेजता है और हालिया-लेखन दौड़ (recent-write race) से स्पष्ट रूप से बचता है; Oracle FHIR Bulk Export पोलिंग के लिए एक जॉब लोकेशन को प्रदर्शित करता है। एक मजबूत उत्तर स्नैपशॉट निरंतरता, विलोपन सिमेंटिक्स और टेनेंट अलगाव को भी स्पष्ट करता है।
पहले स्पष्ट करने योग्य प्रश्न
संसाधनों, पूर्ण बनाम इंक्रीमेंटल मोड, अधिकतम पंक्तियों और अवधारण (retention) की पुष्टि करें; क्या क्रॉस-टेबल निरंतरता की आवश्यकता है; क्या आउटपुट JSONL, CSV, या संपीड़ित शार्ड्स है; क्या क्लाइंट्स को रद्दीकरण (cancellation) और रेंज डाउनलोड की आवश्यकता है; कौन बना और डाउनलोड कर सकता है; और प्रत्येक टेनेंट का समवर्तीता (concurrency), बैंडविड्थ और स्टोरेज बजट क्या है। "एक्सपोर्ट पूर्ण" और "फ़ाइल डाउनलोड" को एक ही स्थिति न मानें।
30-सेकंड उत्तर रूपरेखा
शुरुआत करें: "मैं निर्माण (create), स्थिति (status), मैनिफेस्ट/डाउनलोड और रद्द (cancel) संचालन को उजागर करूँगा। निर्माण ऑथराइजेशन स्कोप और स्नैपशॉट सीमा तय करता है और एक जॉब ID लौटाता है। वर्कर्स शार्ड्स पढ़ते हैं और चेकपॉइंट्स को बनाए रखते हैं, फिर एक अपरिवर्तनीय (immutable) फ़ाइल मैनिफेस्ट प्रकाशित करते हैं। क्लाइंट जॉब लोकेशन को पोल करता है और पूरा होने के बाद ही अल्पकालिक डाउनलोड क्रेडेंशियल्स प्राप्त करता है। चेकपॉइंट्स और इडेम्पोटेंसी कुंजियाँ वर्कर के पुनः प्रयासों को सुरक्षित बनाती हैं; समाप्ति पर फ़ाइलें हटा दी जाती हैं और कोटा मुक्त कर दिया जाता है। इंक्रीमेंटल एक्सपोर्ट एक गतिशील क्लॉक सीमा के बजाय कर्सर या सीलबंद उच्च-जल चिह्न (high-water mark) का उपयोग करते हैं।"
चरण-दर-चरण गहन विश्लेषण
चरण 1: जॉब बनाएं और उसकी सीमा को फ्रीज करें
POST /exports टेनेंट ऑथराइजेशन, संसाधन स्कोप, फ़िल्टर और कोटा को मान्य करता है, फिर एक अगम्य exportId बनाता है। जॉब एक ऑथराइजेशन स्नैपशॉट, फॉर्मेट, कम्प्रेशन, निर्माण समय, समाप्ति और snapshotWatermark संग्रहीत करता है। यदि डेटाबेस एक सुसंगत स्नैपशॉट का समर्थन करता है, तो वॉटरमार्क को एक लेनदेन में पढ़ें; अन्यथा बताएं कि यह प्रति-संसाधन अनुमानित स्नैपशॉट है, न कि सख्त क्रॉस-टेबल निरंतरता।
चरण 2: स्थिति और निर्माण को इडेम्पोटेंट बनाएं
एक Idempotency-Key स्वीकार करें; वही टेनेंट और कुंजी समान जॉब लौटाते हैं। GET /exports/{id} रिपोर्ट करता है QUEUED, RUNNING, SUCCEEDED, FAILED, CANCELLED, या EXPIRED, साथ ही संसाधित शार्ड्स और अगली कार्रवाई। स्टेट मशीन केवल आगे बढ़ती है। एक सशर्त अपडेट रद्द बनाम पूर्ण की दौड़ का निर्णय करता है, और पुनः प्रयासों पर दो बार कोटा नहीं लगाया जाना चाहिए।
चरण 3: शार्ड्स पढ़ें और चेकपॉइंट्स बनाए रखें
वर्कर्स एक स्थिर प्राथमिक कुंजी या डेटाबेस स्नैपशॉट कर्सर द्वारा निश्चित बैच पढ़ते हैं और अस्थायी ऑब्जेक्ट लिखते हैं। प्रत्येक शार्ड (exportId, partition, cursor, rowCount, checksum, objectKey) रिकॉर्ड करता है; चेकपॉइंट और शार्ड-मेटाडेटा कमिट इडेम्पोटेंट होते हैं। क्रैश के बाद, वर्कर अंतिम कमिट किए गए कर्सर से फिर से चलता है। नियतात्मक (deterministic) शार्ड संस्करण या सशर्त ऑब्जेक्ट लेखन डुप्लिकेट को अधिलेखित करते हैं, जबकि अंतिम मैनिफेस्ट प्रत्येक शार्ड को केवल एक बार संदर्भित करता है।
चरण 4: पूर्ण और इंक्रीमेंटल सीमाओं को परिभाषित करें
पूर्ण एक्सपोर्ट snapshotWatermark पर या उससे पहले पढ़ता है; बाद के इंसर्ट और अपडेट बाद के इंक्रीमेंटल रन से संबंधित होते हैं। एक इंक्रीमेंटल रन सहेजे गए कर्सर या उच्च-जल चिह्न से शुरू होता है, न कि "अब माइनस एक सेकंड" से। Zendesk दस्तावेजित करता है कि हालिया-लेखन दौड़ से बचने के लिए सुरक्षा देरी (safety delay) के साथ, अगले पृष्ठ और अगले एक्सपोर्ट के लिए एक कर्सर का पुन: उपयोग किया जा सकता है। अनुबंध में देरी, डुप्लिकेट हैंडलिंग और मरम्मत विंडो शामिल करें।
चरण 5: एक मैनिफेस्ट प्रकाशित करें और सुरक्षित रूप से डाउनलोड करें
प्रत्येक शार्ड के पूर्ण और सत्यापित होने के बाद, जॉब को RUNNING से SUCCEEDED में परमाणु रूप से (atomically) स्थानांतरित करें और फ़ाइलों, आकारों, चेकसम और श्रेणियों वाले एक अपरिवर्तनीय मैनिफेस्ट का निर्माण करें। डाउनलोड एंडपॉइंट थोड़े समय के लिए टेनेंट और ऑब्जेक्ट्स तक सीमित क्रेडेंशियल्स लौटाता है; वे मनमाने पथों तक नहीं पहुंच सकते। एक विफल डाउनलोड एक्सपोर्ट को फिर से चलाने के बजाय उसी मैनिफेस्ट को पुनः प्राप्त करता है। फ़ाइलें समाप्ति तक केवल-पढ़ने योग्य रहती हैं।
चरण 6: संसाधनों की रक्षा करें, रद्द करें और साफ़ करें
निर्माण और शेड्यूलिंग समवर्ती जॉब्स, स्कैन की गई पंक्तियों, CPU, ऑब्जेक्ट स्टोरेज और इग्रेस (egress) पर प्रति-टेनेंट सीमाएं लागू करते हैं। बड़े जॉब्स एक कतार और वैश्विक समवर्ती सीमा का उपयोग करते हैं; ऑनलाइन अनुरोध एक अलग संसाधन पूल का उपयोग करते हैं। रद्दीकरण नए शार्ड्स को रोकता है, जॉब को चिह्नित करता है, और अस्थायी ऑब्जेक्ट्स को एसिंक्रोनस रूप से हटा देता है। एक पुनः प्रयास करने योग्य क्लीनर EXPIRED जॉब्स को पुनः प्राप्त करता है और अनाथ बाइट्स, विफलता के कारणों और क्लीनअप देरी को रिकॉर्ड करता है। ऑडिट इवेंट्स कर्ता (actor), स्कोप और डाउनलोड को कैप्चर करते हैं।
मॉडल उच्च-गुणवत्ता वाला उत्तर
"मैं POST /exports के साथ एक जॉब बनाऊंगा, टेनेंट ऑथराइजेशन और कोटा को मान्य करूंगा, और स्कोप, फॉर्मेट, समाप्ति, स्नैपशॉट वॉटरमार्क और इडेम्पोटेंसी कुंजी को बनाए रखूंगा। प्रतिक्रिया केवल exportId लौटाती है; क्लाइंट GET /exports/{id} को पोल करता है। वर्कर्स स्नैपशॉट कर्सर से बैच पढ़ते हैं, प्रत्येक शार्ड के कर्सर, पंक्ति गणना और चेकसम को बनाए रखते हैं। एक पुनः प्रयास अंतिम कमिट किए गए चेकपॉइंट से फिर से शुरू होता है, और (exportId, partition, cursor) डुप्लिकेट राइट्स को इडेम्पोटेंट बनाता है। पूर्ण एक्सपोर्ट एक निश्चित वॉटरमार्क का उपयोग करते हैं; इंक्रीमेंटल एक्सपोर्ट एक कर्सर या उच्च-जल चिह्न प्लस एक सुरक्षा देरी को सहेजते हैं। सभी शार्ड्स के सत्यापित होने के बाद, एक अपरिवर्तनीय मैनिफेस्ट प्रकाशित किया जाता है और जॉब परमाणु रूप से SUCCEEDED बन जाता है; डाउनलोड अल्पकालिक टेनेंट-बाउंड क्रेडेंशियल्स का उपयोग करते हैं। रद्दीकरण और समाप्ति नए काम को रोकते हैं, अस्थायी ऑब्जेक्ट्स को हटाते हैं, और कोटा मुक्त करते हैं। दर सीमाएं (rate limits), पृथक संसाधन और ऑडिट लॉग ऑनलाइन ट्रैफ़िक की रक्षा करते हैं।"
सामान्य गलतियाँ और सुधार
- एक ही HTTP अनुरोध में पूरे डेटाबेस को स्कैन करना: एक कतारबद्ध जॉब और पोल करने योग्य स्थिति का उपयोग करें ताकि कनेक्शन टाइम आउट न हों।
- वर्तमान क्लॉक को इंक्रीमेंटल शुरुआत के रूप में उपयोग करना: एक कर्सर या सीलबंद उच्च-जल चिह्न सहेजें और सुरक्षा देरी और डुप्लिकेट नीति को परिभाषित करें।
- प्रत्येक पुनः प्रयास पर एक नई फ़ाइल बनाना: शार्ड्स और मैनिफेस्ट को इडेम्पोटेंट बनाएं; पुनः प्रयास केवल छूटे हुए काम को भरते हैं।
- स्थायी डाउनलोड लिंक जारी करना: क्रेडेंशियल्स को टेनेंट, ऑब्जेक्ट और समाप्ति से बाँधें; एक विफल डाउनलोड उसी फ़ाइल को पुनः प्राप्त करता है।
फॉलो-अप प्रश्न और उत्तर
क्या होगा यदि एक्सपोर्ट के दौरान कोई रिकॉर्ड हटा दिया जाए?
पहले प्रोडक्ट सिमेंटिक्स को परिभाषित करें। एक स्नैपशॉट एक्सपोर्ट में उसके वॉटरमार्क से पहले दिखाई देने वाले रिकॉर्ड शामिल होते हैं; एक इंक्रीमेंटल स्ट्रीम में टॉम्बस्टोन (tombstones) या परिवर्तन प्रकार होने चाहिए। टॉम्बस्टोन को तब तक बनाए रखें जब तक कि प्रत्येक उपभोक्ता की मरम्मत विंडो समाप्त न हो जाए।
क्या होगा यदि कोई वर्कर फ़ाइल लिखता है और अपने चेकपॉइंट को कमिट करने से पहले क्रैश हो जाता है?
पुनरारंभ पर, डेटाबेस चेकपॉइंट पर भरोसा करें और बैच को फिर से चलाएं। सशर्त लेखन या नियतात्मक शार्ड संस्करण ऑब्जेक्ट को सुरक्षित रूप से अधिलेखित करते हैं, और मैनिफेस्ट केवल कमिट किए गए, सत्यापित शार्ड्स को स्वीकार करता है, इसलिए आंशिक काम कभी भी डाउनलोड करने योग्य नहीं होता है।
आप किसी एक टेनेंट को ऑनलाइन डेटाबेस को नुकसान पहुँचाने से कैसे रोकते हैं?
रीड रेप्लिकस, स्नैपशॉट्स या एक समर्पित क्वेरी पूल का उपयोग करें; स्कैन समवर्तीता और प्रति सेकंड पंक्तियों को सीमित करें। टेनेंट द्वारा निष्पक्ष रूप से शेड्यूल करें और रेप्लिकेट लैग, लॉक प्रतीक्षा और इग्रेस की निगरानी करें; थ्रेशोल्ड से अधिक होने पर एक्सपोर्ट धीमा करें या रोकें।
कोई क्लाइंट टूटे हुए डाउनलोड को कैसे फिर से शुरू कर सकता है?
एक्सपोर्ट को अपरिवर्तनीय रखें और HTTP Range या शार्ड डाउनलोड का समर्थन करें। क्लाइंट मैनिफेस्ट, चेकसम और पूर्ण श्रेणियों को संग्रहीत करता है; क्रेडेंशियल्स को रीफ्रेश करने से फ़ाइल संस्करण नहीं बदलता है और न ही एक्सपोर्ट फिर से चलता है।