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

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

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

प्रश्न

एक प्लेटफ़ॉर्म पहले से ही WebAssembly घटकों को चलाता है। इंस्टॉल किए गए संस्करणों को तोड़े बिना या ट्रांजिटिव कैपेबिलिटीज़ दिए बिना आप इसके WIT कॉन्ट्रैक्ट्स को कैसे विकसित करेंगे और प्लगइन्स को कंपोज़ करेंगे?

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

रनटाइम, टेनेंट आइसोलेशन और निष्पादन बजट पहले से मौजूद हैं। समस्या अधिक सीमित है: सैकड़ों इंस्टॉल किए गए घटक WebAssembly Interface Types (WIT) की कई पीढ़ियों को लागू करते हैं, और एक वर्कफ़्लो पार्सर, रिडैक्टर और निर्यातक को कंपोज़ कर सकता है। संगतता और कंपोज़ीशन लेयर डिज़ाइन करें जो प्लेटफ़ॉर्म को अनुबंधों को सुरक्षित रूप से बदलने की अनुमति दे।

WIT व्यवहार के बजाय अनुबंधों (contracts) को परिभाषित करता है। एक world यह सूचीबद्ध करता है कि एक घटक क्या आयात (import) और निर्यात (export) करता है, और Component Model घटकों को कंपोज़ करने की अनुमति देता है। ये तथ्य संगतता को परीक्षण योग्य बनाते हैं, लेकिन वे यह तय नहीं करते कि कौन से परिवर्तन सुरक्षित हैं या एक कंपोज़्ड ग्राफ़ को कौन सी क्षमताएं प्राप्त होनी चाहिए। प्लेटफ़ॉर्म को वह नीति प्रदान करनी होगी।

साक्षात्कारकर्ता क्या मूल्यांकन करता है

  • क्या आप स्रोत-भाषा संगतता, WIT आकार (shape) संगतता और व्यावहारिक (behavioral) संगतता को अलग करते हैं।
  • क्या अंतिम घटक ग्राफ़ में प्रत्येक आयात को गलती से विरासत में मिलने के बजाय स्पष्ट रूप से अधिकृत किया गया है।
  • क्या एडेप्टर स्थायी छिपे हुए तर्क बनने के बजाय संस्करणित, अवलोकनीय और हटाने योग्य हैं।
  • क्या रोलबैक पिछले घटक द्वारा अपेक्षित डेटा और संसाधन सिमेंटिक्स को सुरक्षित रखता है।

पूछने के लिए स्पष्टीकरण प्रश्न

  • कौन सी इंस्टॉल की गई इंटरफ़ेस पीढ़ियों को कितने समय तक चलाने योग्य रहना चाहिए?
  • क्या कॉल स्टेटलेस मान, स्वामित्व वाले (owned) या उधार लिए गए (borrowed) संसाधन, स्ट्रीम या लंबे समय तक चलने वाले हैंडल हैं?
  • क्या एक प्लगइन दूसरे प्लगइन को सीधे कॉल कर सकता है, या सभी कॉलों को होस्ट से होकर गुजरना होगा?
  • कौन से परिवर्तन योगात्मक (additive) हैं, और कौन से परिवर्तन अर्थ, त्रुटियों या स्वामित्व को बदलते हैं?
  • क्या एक वर्कफ़्लो को परमाणु रूप से (atomically) रोलबैक होना चाहिए, या घटक विभिन्न संस्करणों का उपयोग कर सकते हैं?

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

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

“मैं प्रत्येक WIT पैकेज और world को अपरिवर्तनीय संस्करण द्वारा पंजीकृत करूंगा, इसके आयात, निर्यात, प्रकार और संसाधन स्वामित्व की गणना करूंगा, फिर इंस्टेंटिएशन से पहले एक प्रस्तावित ग्राफ़ की जांच करूंगा। मौजूदा प्लगइन्स अपने पुराने अनुबंध को बनाए रखते हैं। एक छोटा स्पष्ट एडेप्टर पुराने मानों को नए इंटरफ़ेस में अनुवादित कर सकता है, लेकिन यह क्षमताएं नहीं बना सकता है या विफलता सिमेंटिक्स को चुपचाप नहीं बदल सकता है। होस्ट केवल टेनेंट नीति और अंतिम ग्राफ़ के घोषित आयातों के प्रतिच्छेदन (intersection) की अनुमति देता है। मैं रिकॉर्ड किए गए फिक्स्चर पर दोनों संस्करणों की तुलना करूंगा, टेनेंट द्वारा कैनरी डिप्लॉयमेंट करूंगा, और रोलबैक तथा रिटायरमेंट मानदंड पास होने तक पुराने ग्राफ़ को बनाए रखूंगा।”

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

1. एक इंटरफ़ेस रजिस्ट्री और संगतता रिपोर्ट बनाएं

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

2. एडेप्टर को सीमित और दिशात्मक रखें

एक एडेप्टर एक ज्ञात अनुबंध को दूसरे में अनुवादित करता है। यह किसी फ़ील्ड का नाम बदल सकता है, एक प्रलेखित डिफ़ॉल्ट प्रदान कर सकता है, या किसी पुरानी त्रुटि को एक नए वैरिएंट में मैप कर सकता है। इसे ऐसी जानकारी को अस्वीकार करना होगा जिसे सुरक्षित रूप से दर्शाया नहीं जा सकता। जहां संभव हो, एडेप्टर श्रृंखलाओं को एक समर्थित हॉप तक सीमित रखें; लंबी श्रृंखलाएं अस्पष्टता को बढ़ाती हैं और रोलबैक के बारे में तर्क करना कठिन बनाती हैं।

3. कंपोज़्ड ग्राफ़ को अधिकृत करें

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

4. अनुबंध को रिटायर करने से पहले व्यवहार को साबित करें

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

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

“मैं WIT world को एक डिप्लॉय करने योग्य अनुबंध के रूप में मानूंगा। प्रत्येक अपरिवर्तनीय रजिस्ट्री प्रविष्टि पैकेज संस्करण, world, पूर्ण आयात और निर्यात सेट, प्रकार के आकार, संसाधन स्वामित्व, आर्टिफ़ैक्ट डाइजेस्ट और समर्थित पूर्ववर्ती को रिकॉर्ड करती है। केवल-मान वाले योगात्मक परिवर्तन एक समीक्षित एडेप्टर का उपयोग कर सकते हैं; परिवर्तित स्वामित्व, अनुपलब्ध वैरिएंट केस या नए साइड इफेक्ट्स के लिए एक नए अनुबंध और स्पष्ट उपभोक्ता माइग्रेशन की आवश्यकता होती है।

कंपोज़ीशन एक ग्राफ़ डिस्क्रिप्टर से होती है। लिंकर प्रदाताओं को हल करता है, लेकिन होस्ट अलग से ग्राफ़ के पूर्ण आयात सेट को अधिकृत करता है। क्षमताएं टेनेंट नीति और प्रत्येक घटक के घोषित अनुदान द्वारा सीमित होती हैं। रोलआउट के लिए मैं दोनों ग्राफ़ के माध्यम से फिक्स्चर को फिर से चलाता हूं और मानों, त्रुटियों, होस्ट कॉल और संसाधन जीवनचक्र की तुलना करता हूं। फिर मैं टेनेंट द्वारा कैनरी करता हूं और बेमेल, त्रुटि, विलंबता और रिसाव सीमाएं पास होने तक पिछले ग्राफ़ को बनाए रखता हूं। यह इंटरफ़ेस विकास और सुरक्षित कंपोज़ीशन का उत्तर देता है, न कि Wasm सैंडबॉक्स बनाने की सामान्य समस्या का।”

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

  • प्रत्येक योगात्मक परिवर्तन को संगत कहना → एक नया आवश्यक आयात या बदला हुआ डिफ़ॉल्ट व्यवहार को बदल सकता है → प्रकार, क्षमता, स्वामित्व और सिमेंटिक परिवर्तनों को अलग-अलग वर्गीकृत करें।
  • कंपोज़ीशन को सभी आयातों को संयोजित (union) करने देना → एक कम विशेषाधिकार प्राप्त घटक दूसरे घटक का अधिकार प्राप्त कर लेता है → स्पष्ट अनुदानों के विरुद्ध हल किए गए ग्राफ़ को अधिकृत करें।
  • एडेप्टर को अनिश्चित काल तक जोड़ते रहना → व्यवहार एक अपारदर्शी श्रृंखला पर निर्भर हो जाता है → सीमित हॉप्स का समर्थन करें और उपयोग के साक्ष्य के साथ एडेप्टर को रिटायर करें।
  • केवल सफल आउटपुट की तुलना करना → त्रुटियां, होस्ट कॉल और संसाधन रिसाव पीछे छूट सकते हैं → विफलताओं, साइड इफेक्ट्स, स्वामित्व और बजट की तुलना करें।
  • स्टेटफुल घटकों को तुरंत रोलबैक करना → लाइव हैंडल नए अनुबंध से संबंधित हो सकते हैं → स्विच करने से पहले सत्रों को ड्रेन, माइग्रेट या पिन करें।

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

आप एक नई आवश्यक क्षमता को कैसे संभालते हैं?

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

क्या होगा यदि कोई पुराना मान नए प्रकार द्वारा दर्शाया नहीं जा सकता है?

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

आप एक एडेप्टर को कैसे रिटायर करते हैं?

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

क्या घटक होस्ट के बिना एक दूसरे को कॉल कर सकते हैं?

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

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

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

संबंधित इंटरव्यू टूल

सिस्टम डिज़ाइन उत्तर के लिए हल करें का उपयोग करें

पहले आवश्यकताओं को स्पष्ट करें, फिर स्केल, आर्किटेक्चर, कंपोनेंट चयन और ट्रेड-ऑफ की ओर बढ़ें।

टूल देखें