प्रॉम्प्ट और संदर्भ
मान लें कि प्रत्येक जॉब लगभग 25 एक्शन्स को इनवोक करता है और औसत नया आउटपुट 300 MB है। बार-बार होने वाले बिल्ड्स अक्सर इनपुट्स साझा करते हैं, लेकिन एक गलत हिट गलत टूलचेन या सीक्रेट के साथ कंपाइल किए गए आर्टिफैक्ट को डिलीवर कर सकती है। कैश एक ऑप्टिमाइज़ेशन है: एक मिस या आउटेज को वापस एक्ज़ीक्यूशन पर फ़ॉलबैक करना चाहिए, जबकि एक गलत हिट (false hit) एक करेक्टनेस इंसिडेंट (correctness incident) है। आपको एक्शन-रिज़ल्ट लुकअप को इम्यूटेबल आर्टिफैक्ट स्टोरेज से अलग करना चाहिए और यह समझाना चाहिए कि रिमोट एक्ज़ीक्यूशन ट्रस्ट और कैपेसिटी मॉडल को कैसे बदलता है।
इंटरव्यूअर क्या मूल्यांकन कर रहा है
- क्या आप नियतात्मक (deterministic) परिणाम को प्रभावित करने वाले प्रत्येक इनपुट से एक एक्शन की (action key) मॉडल करते हैं।
- क्या आप म्यूटेबल एक्शन मेटाडेटा को एक इम्यूटेबल कंटेंट-एड्रेस्ड स्टोर (CAS) से अलग करते हैं।
- क्या आप राइट्स को एटॉमिक बनाते हैं, डाइजेस्ट्स को सत्यापित करते हैं, और क्रॉस-टेनेंट कैश पॉइज़निंग को रोकते हैं।
- क्या कैपेसिटी, गारबेज कलेक्शन, ऑब्जर्वेबिलिटी, आउटेज फ़ॉलबैक और माइग्रेशन स्पष्ट हैं।
- क्या आप एक बिल्ड कैश को एक सामान्य की-वैल्यू कैश से अलग पहचानते हैं: करेक्टनेस स्टेल-रीड टॉलरेंस से अधिक महत्वपूर्ण है।
पूछने योग्य स्पष्टीकरण प्रश्न
पूछें कि क्या बिल्ड्स हर्मेटिक (hermetic) हैं, कौन से ऑपरेटिंग सिस्टम और आर्किटेक्चर समर्थित हैं, और क्या रिमोट एक्ज़ीक्यूशन अनिवार्य है या वैकल्पिक। रिटेंशन टारगेट, टेनेंट और रिपॉजिटरी सीमाएं, अधिकतम आर्टिफैक्ट साइज़, अपेक्षित हिट-रेट ऑब्जेक्टिव, डेटा रेजिडेंसी, और क्या सीक्रेट्स या मालिकाना कोड किसी आउटपुट में प्रवेश कर सकते हैं, इसे स्पष्ट करें। पुष्टि करें कि क्या कोई रिज़ल्ट ब्रांचेस, टूलचेन वर्जन्स के बीच साझा किया जा सकता है, या केवल एक कमिट और प्लेटफ़ॉर्म टुपल के भीतर। यह भी पूछें कि क्या CI राइट कर सकता है जबकि डेवलपर मशीनें केवल रीड-ओनली हैं।
30-सेकंड उत्तर ढांचा
मैं कमांड, टूलचेन और प्लेटफ़ॉर्म पहचान, घोषित इनपुट मर्कल रूट (Merkle root), प्रासंगिक एनवायरनमेंट और बिल्ड कॉन्फ़िगरेशन वाले एक कैनोनिकल एक्शन विवरण को हैश करूँगा। एक्शन कैश उस की (key) को आउटपुट डाइजेस्ट्स और रिज़ल्ट मेटाडेटा पर मैप करता है; CAS डाइजेस्ट द्वारा इम्यूटेबल ब्लॉब्स को स्टोर करता है। रीडर्स फाइलों को मटीरियलाइज़ करने से पहले मेटाडेटा और प्रत्येक ब्लॉब को सत्यापित करते हैं। सफल स्थानीय या रिमोट एक्ज़ीक्यूशन पहले ब्लॉब्स अपलोड करता है और एक्शन रिज़ल्ट को अंत में पब्लिश करता है, ताकि अधूरा काम हिट न बन सके। नेमस्पेस, ऑथेंटिकेटेड राइट्स, कोटा और सैंडबॉक्सिंग टेनेंट लीकेज को रोकते हैं। कैश विफलताएं मिस लौटाती हैं और नियंत्रित एक्ज़ीक्यूशन का उपयोग करती हैं, जबकि मेट्रिक्स और सैंपल्ड क्लीन रीबिल्ड्स गलत हिट्स का पता लगाते हैं।
चरण-दर-चरण विस्तृत विश्लेषण
1. कीज़ और स्टोरेज सीमाओं को परिभाषित करें
एक्शन कमांड, कंपाइलर और लिंकर वर्जन्स, प्लेटफ़ॉर्म, घोषित इनपुट्स, प्रासंगिक फ़्लैग्स, व्हाइटलिस्टेड एनवायरनमेंट और बाहरी डिपेंडेंसी लॉकफाइल्स को कैनोनिकलाइज़ करें। इनपुट ट्री को मर्कल रूट के रूप में हैश करें। सीक्रेट्स और गैर-नियतात्मक टाइमस्टैम्प्स को बाहर रखें; यदि कोई एक्शन हर्मेटिक नहीं है, तो उसे नॉन-कैशेबल के रूप में चिह्नित करें या उसे जानबूझकर संकीर्ण स्कोप दें। एक्शन रिज़ल्ट्स को CAS से अलग स्टोर करें: रिज़ल्ट में आउटपुट फ़ाइल नाम, डाइजेस्ट्स, साइज़, एक्ज़िट कोड और वैकल्पिक stdout/stderr डाइजेस्ट्स शामिल होते हैं। CAS ऑब्जेक्ट्स इम्यूटेबल होते हैं और केवल उनके डाइजेस्ट द्वारा एड्रेस किए जाते हैं।
2. हिट, मिस और पब्लिश पाथ्स डिज़ाइन करें
रीड पर, टेनेंट और एक्शन-की नेमस्पेस को एक रेप्लिकेटेड मेटाडेटा सर्विस पर रूट करें, रिज़ल्ट प्राप्त करें, फिर समानांतर में अनुपलब्ध CAS ब्लॉब्स लाएं। फाइलों को प्रस्तुत करने से पहले साइज़ और डाइजेस्ट सत्यापित करें। मिस होने पर, स्थानीय रूप से या सैंडबॉक्स्ड वर्कर पर निष्पादित करें। सत्यापित ब्लॉब्स को इडेम्पोटेंट (idempotent) डाइजेस्ट ऑपरेशन्स के साथ अपलोड करें, फिर एक्शन रिज़ल्ट को एक कंडीशनल पब्लिश में कमिट करें। समवर्ती राइटर्स एक ही ब्लॉब अपलोड कर सकते हैं, लेकिन केवल सभी संदर्भित ब्लॉब्स वाला एक पूर्ण रिज़ल्ट ही दिखाई देता है। करप्टेड ब्लॉब या मेटाडेटा बेमेल एक मिस और अलर्ट है, कभी भी एक सफल हिट नहीं।
3. डिस्ट्रीब्यूशन, आइसोलेशन और सुरक्षा जोड़ें
एक्शन-रिज़ल्ट लुकअप के लिए लगातार हैशिंग (consistent hashing) या मेटाडेटा-सर्विस पार्टीशन मैप का उपयोग करें, जिसमें विफलता ज़ोन में रेप्लिकाएं हों। बड़े CAS डेटा को ऑब्जेक्ट स्टोर या शार्ड किए गए ब्लॉब टियर में रखें और हॉट मेटाडेटा को लो-लेटेंसी स्टोरेज पर रखें। प्रत्येक अनुरोध को प्रमाणित करें, रिपॉजिटरी और टेनेंट नेमस्पेस को अधिकृत करें, और डेवलपर मशीनों को डिफ़ॉल्ट रूप से रीड-ओनली रखें। ट्रांजिट और स्टोरेज में एन्क्रिप्ट करें, प्रति-टेनेंट कोटा लागू करें, और रिमोट एक्शन्स को सैंडबॉक्स करें। टेनेंट्स के बीच तब तक डुप्लीकेशन न हटाएं (deduplicate न करें) जब तक कि नीति स्पष्ट रूप से इसकी अनुमति न दे; अकेले डाइजेस्ट को ऑथराइजेशन को बायपास नहीं करना चाहिए।
4. कैपेसिटी और लाइफसाइकिल प्रबंधन की योजना बनाएं
कहा गया वर्कलोड 20,000 जॉब्स/दिन × 25 एक्शन्स = 500,000 लुकअप्स/दिन है, जो औसतन लगभग 5.8 अनुरोध/सेकंड है। 20× बर्स्ट लगभग 120 अनुरोध/सेकंड है, समानांतर ब्लॉब रीड्स से पहले। यदि 10% एक्शन्स एक नया 300 MB आउटपुट बनाते हैं, तो अनकंप्रेस्ड इनग्रेस 1.5 TB/दिन है; कम्प्रेशन और डिडुप्लीकेशन स्टोरेज को कम करते हैं, लेकिन डिज़ाइन को मल्टी-टेराबाइट ऑब्जेक्ट कैपेसिटी और बैंडविड्थ हेडरूम आरक्षित करना चाहिए। गारबेज कलेक्शन लाइव एक्शन रिज़ल्ट्स और मैनिफ़ेस्ट्स से शुरू होता है, उनके डाइजेस्ट संदर्भों का अनुसरण करता है, एक ग्रेस पीरियड लागू करता है, फिर साइज़ कोटा को LRU या एज पॉलिसीज़ के साथ जोड़ता है। कभी भी रीचेबल (पहुंच योग्य) ब्लॉब को न हटाएं, और प्रति टेनेंट निष्पक्ष कोटा लागू करें।
5. आउटेज और करेक्टनेस को ऑब्जर्वेबल बनाएं
कैश टाइमआउट, परमिशन विफलता, अनुपलब्ध ब्लॉब, डाइजेस्ट बेमेल, और बैकएंड अनुपलब्धता को अलग-अलग परिणामों के रूप में मानें। एक मिस निष्पादित हो सकता है; एक लंबे समय तक चलने वाले आउटेज को CI को रीटाई स्टॉर्म में बदलने से रोकने के लिए एडमिशन कंट्रोल, लोकल-कैश प्राथमिकता और सीमित रीट्राइज़ की आवश्यकता होती है। रिपॉजिटरी, एक्शन क्लास, प्लेटफ़ॉर्म और टूलचेन द्वारा हिट रेट को ट्रैक करें; लुकअप लेटेंसी, ब्लॉब बैंडविड्थ, अपलोड अबॉर्ट्स, एविक्शन्स, करप्शन और टेनेंट डिनायल्स को ट्रैक करें। गैर-नियतात्मकता और गलत हिट्स का पता लगाने के लिए समय-समय पर स्थानीय कैश हटाकर एक क्लीन रीबिल्ड करें और एक्ज़ीक्यूशन लॉग्स या आउटपुट डाइजेस्ट्स की तुलना करें।
एक मजबूत उत्तर का उदाहरण
मैं दो सेवाएं प्रस्तुत करूँगा: एक ऑथेंटिकेटेड एक्शन-कैश इंडेक्स और एक इम्यूटेबल CAS। एक एक्शन की कैनोनिकल कमांड, कंपाइलर और प्लेटफ़ॉर्म पहचान, घोषित-इनपुट मर्कल रूट, व्हाइटलिस्टेड एनवायरनमेंट, फ़्लैग्स और लॉक्ड एक्सटर्नल डिपेंडेंसीज़ को कवर करती है। एक हिट आउटपुट डाइजेस्ट्स लौटाता है; क्लाइंट मटीरियलाइज़ करने से पहले उन ब्लॉब्स को सत्यापित और डाउनलोड करते हैं। एक मिस सैंडबॉक्स में निष्पादित होता है, ब्लॉब्स को इडेम्पोटेंट रूप से अपलोड करता है, उन्हें सत्यापित करता है, और प्रत्येक संदर्भ मौजूद होने के बाद ही रिज़ल्ट पब्लिश करता है। एक्शन मेटाडेटा को टेनेंट और रिपॉजिटरी द्वारा रेप्लिकेट किया जाता है, जबकि CAS डेटा को ज़ोन में शार्ड किया जाता है या ऑब्जेक्ट स्टोरेज में रखा जाता है। कैश विफलताओं के दौरान रीड्स एक्ज़ीक्यूशन पर फ़ॉलबैक कर सकते हैं; राइट्स को विश्वसनीय CI तक सीमित किया जाता है, जिसमें कोटा, एन्क्रिप्शन होता है और डिफ़ॉल्ट रूप से कोई क्रॉस-टेनेंट पुन: उपयोग नहीं होता है। मैं लगभग 120 पीक लुकअप्स/सेकंड और मल्टी-टेराबाइट स्टोरेज के लिए साइज़िंग करूँगा, फिर हिट रेट, डाइजेस्ट बेमेल, गैर-नियतात्मक एक्शन्स, समवर्ती राइटर्स, टूलचेन अपग्रेड्स, GC रीचेबिलिटी और आउटेज रिकवरी को मान्य करूँगा।
सामान्य गलतियाँ
- कंपाइलर, फ़्लैग्स, प्लेटफ़ॉर्म, एनवायरनमेंट, या लॉक्ड डिपेंडेंसीज़ को छोड़ते हुए केवल सोर्स फाइलों को हैश करना।
- एक्शन रिज़ल्ट और उसके आउटपुट ब्लॉब्स को एक म्यूटेबल रिकॉर्ड के रूप में मानना, जिससे आंशिक पब्लिश की अनुमति मिलती है।
- नेमस्पेस ऑथराइजेशन की जांच किए बिना टेनेंट्स के बीच डाइजेस्ट साझा करना।
- कैश अनुपलब्धता को नियंत्रित मिस और फ़ॉलबैक के बजाय कुल बिल्ड आउटेज के रूप में डिज़ाइन करना।
- एकल ग्लोबल LRU का उपयोग करना और लाइव एक्शन रिज़ल्ट्स से संदर्भों को ट्रेस किए बिना ब्लॉब्स को हटाना।
- stdout या stderr वॉल्यूम को कैश-हिट मेट्रिक कहना; एक्ज़ीक्यूशन रणनीति और स्पष्ट हिट काउंटर्स की आवश्यकता होती है।
- क्लीन बिल्ड्स, क्रॉस-मशीन पुनरुत्पादन क्षमता और गैर-नियतात्मक एक्शन्स का परीक्षण किए बिना उच्च हिट रेट का दावा करना।
फॉलो-अप प्रश्न और उत्तर
क्या होगा यदि कंपाइलर टूलचेन को अपग्रेड किया जाता है लेकिन कमांड लाइन अपरिवर्तित रहती है?
टूलचेन पहचान एक्शन की का हिस्सा होनी चाहिए, आमतौर पर एक पिन किए गए डाइजेस्ट या वर्जन्ड एक्ज़ीक्यूशन इमेज के माध्यम से। रोलबैक के लिए एक माइग्रेशन पुराने नेमस्पेस को डुअल-रीड कर सकता है लेकिन उसे नए नेमस्पेस में राइट करना चाहिए और मिसेस को मापना चाहिए। केवल इसलिए पुराने आउटपुट्स का पुन: उपयोग कभी न करें क्योंकि सोर्स और फ़्लैग्स मेल खाते हैं।
कैश पॉइज़निंग के बाद आप कैसे रिकवर करते हैं?
अविश्वसनीय राइट्स रोकें, प्रभावित नेमस्पेस को क्वारंटाइन करें, और ऑडिट लॉग्स से खराब एक्शन रिज़ल्ट्स और रीचेबल ब्लॉब्स की पहचान करें। एक्शन इंडेक्स को अमान्य करें, विश्वसनीय आउटपुट्स को रीबिल्ड करें, और सत्यापित एक्ज़ीक्यूशन से पुन: पॉप्युलेट करें। रिकवरी के दौरान कैश का उपयोग वैकल्पिक रखें और इंसिडेंट समीक्षा के लिए साक्ष्य सुरक्षित रखें।
क्या होगा यदि कोई बिल्ड एक्शन निष्पादन के दौरान एक अनपिन की गई डिपेंडेंसी डाउनलोड करता है?
यह गैर-हर्मेटिक है: इसे तब तक नॉन-कैशेबल के रूप में चिह्नित करें जब तक कि डिपेंडेंसी पिन न हो जाए और उसके लाए गए बाइट्स इनपुट क्लोज़र में दर्शाए न जाएं। एक छोटा, रिपॉजिटरी-स्कॉप्ड TTL एक स्पष्ट आपातकालीन अपवाद हो सकता है, लेकिन इसे नियतात्मक पुन: उपयोग के रूप में प्रस्तुत नहीं किया जाना चाहिए।
आप CI आउटेज के बिना लोकल कैश से कैसे माइग्रेट करेंगे?
शैडो मोड में रिमोट रीड्स चलाएं, लोकल और रिमोट कीज़ और आउटपुट डाइजेस्ट्स की तुलना करें, फिर छोटे रिपॉजिटरी कोहोर्ट के लिए रिमोट हिट्स सक्षम करें। लोकल एक्ज़ीक्यूशन और लोकल कैश फ़ॉलबैक बनाए रखें, राइट्स को केवल विश्वसनीय CI तक सीमित रखें, और हिट-रेट, लेटेंसी और फॉल्स-हिट जांच पास होने के बाद ही विस्तार करें।