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

सिस्टम डिज़ाइन इंटरव्यू: इमेज ट्रांसफ़ॉर्मेशन और डिलीवरी पाइपलाइन डिज़ाइन करें

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

प्रश्न

एक ऐसी सर्विस डिज़ाइन करें जो ओरिजिनल्स को स्वीकार करे और डुप्लिकेट काम या दुर्भावनापूर्ण पैरामीटर्स से रिसोर्स समाप्त किए बिना रीसाइज़्ड, क्रॉप्ड, कंप्रेस्ड और कनवर्टेड डेरिवेटिव्स जनरेट करे।

समस्या और दायरा

प्लेटफ़ॉर्म प्रतिदिन 10 मिलियन ओरिजिनल्स प्राप्त करता है, जबकि क्लाइंट्स कई डाइमेंशन्स, क्रॉप्स और आउटपुट फ़ॉर्मैट्स का अनुरोध करते हैं। ओरिजिनल स्टोरेज, ट्रांसफ़ॉर्मेशन जॉब्स, डेरिव्ड-इमेज कैशिंग और CDN डिलीवरी डिज़ाइन करें। ओरिजिनल्स को पुनः प्रोसेस करने योग्य होना चाहिए; सहयोगात्मक संपादन परतें (collaborative editing layers), कंटेंट-मॉडरेशन मॉडल और पेशेवर रंग अंशांकन (color calibration) दायरे से बाहर हैं। ये संख्याएँ इंटरव्यू के अनुमान हैं, उद्योग के मानक नहीं।

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

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

स्पष्टीकरण हेतु प्रश्न

  • क्या मनमाने डाइमेंशन्स, क्रॉप्स और फ़िल्टर्स की अनुमति है? पिक्सेल, फ़ाइल-आकार और समय सीमाएँ क्या हैं?
  • कौन से फ़ॉर्मैट्स, गुणवत्ता स्तर, कलर स्पेस और एनिमेशन व्यवहार आवश्यक हैं?
  • क्या पहला अनुरोध सिंक्रोनस होना चाहिए, या यह जॉब स्टेटस के साथ 202 लौटा सकता है?
  • रिटेंशन, टेनेंट-आइसोलेशन और क्रॉस-रीजन आवश्यकताएं क्या हैं?
  • क्या परिणाम सार्वजनिक हैं, या प्रत्येक URL में ऑथराइजेशन होना चाहिए?

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

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

चरण-दर-चरण विस्तृत डिज़ाइन

अपलोड API प्रमाणित करता है, एक डाइजेस्ट सत्यापित करता है, और ओरिजिनल ऑब्जेक्ट लिखता है। मेटाडेटा asset_id, टेनेंट, कंटेंट हैश, मीडिया प्रकार, डाइमेंशन्स, फ़्रेम संख्या, रंग जानकारी, स्कैन स्थिति और रिटेंशन नीति रिकॉर्ड करता है। कंटेंट डिडुप्लिकेशन कभी भी टेनेंट ऑथराइजेशन जाँच का स्थान नहीं लेता है। फ़ाइल नाम या Content-Type पर भरोसा करने के बजाय मैजिक बाइट्स और डीकोडेबिलिटी को मान्य करें।

डाइमेंशन सीमाएँ, क्रॉप निर्देशांक, रीसैंपलिंग एल्गोरिदम, गुणवत्ता, रोटेशन, बैकग्राउंड और आउटपुट फ़ॉर्मैट जैसे ट्रांसफ़ॉर्म पैरामीटर्स को एक स्थिर अनुक्रम में सामान्यीकृत करें। एक डेरिव्ड की hash(original_bytes, normalized_transform, processor_version) हो सकती है। प्रोसेसर अपग्रेड वर्शन बदलते हैं, ताकि पुराने और नए एल्गोरिदम एक-दूसरे को चुपचाप ओवरराइट न करें। नकारात्मक मान, NaN, अत्यधिक अनुपात और पुनरावर्ती (रिकर्सिव) फ़िल्टर्स को अस्वीकार करें।

रीड पाथ CDN, डेरिव्ड-ऑब्जेक्ट इंडेक्स और जॉब डिडुप्लिकेशन टेबल की जाँच करता है। एक उपयोग योग्य डेरिवेटिव Cache-Control, ETag और सही कंटेंट प्रकार के साथ लौटता है। मिस होने पर, एक PENDING जॉब बनाएं और लेटेंसी स्वीकार्य होने पर एक स्टेटस URL लौटाएं; एक छोटी सामान्य इमेज एक सीमित सिंक्रोनस पाथ का उपयोग कर सकती है। (tenant_id, derived_key) पर एक यूनीक कंस्ट्रेंट समान अनुरोधों को काम साझा करने की अनुमति देती है।

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

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

डेरिवेटिव्स को उनकी की के आधार पर कैश करें। ओरिजिनल डिलीशन या अनुमति परिवर्तन एक एसेट इवेंट उत्सर्जित करते हैं जो डेरिव्ड इंडेक्स और CDN को अमान्य कर देता है। प्राइवेट एसेट्स अल्पकालिक हस्ताक्षरित URLs का उपयोग करते हैं जिनके हस्ताक्षर टेनेंट, डेरिव्ड की, समाप्ति और अनुमत रिस्पॉन्स हेडर को कवर करते हैं। Vary को केवल उन नेगोशिएशन डाइमेंशन्स तक सीमित रखें जो वास्तव में आउटपुट बदलते हैं; मनमाने क्वेरी पैरामीटर्स को असीमित कैश वेरिएंट नहीं बनाने चाहिए।

ओरिजिनल-राइट सफलता, कतार आयु, पिक्सेल-भारित थ्रूपुट, कैश हिट दर, डुप्लिकेट-जॉब कोएलेसिंग, p95 ट्रांसफ़ॉर्म लेटेंसी, विफलता वर्ग, सैंडबॉक्स पीक्स, डेरिवेटिव वृद्धि और CDN 5xx की निगरानी करें। समाधान (रिकॉन्सिलीएशन) प्रक्रिया अनाथ ऑब्जेक्ट्स को हटाने के लिए ओरिजिनल मेटाडेटा, जॉब टर्मिनल स्टेट्स, डेरिव्ड इंडेक्स और ऑब्जेक्ट लिस्टिंग्स की तुलना करती है। वर्कर किल्स, ऑब्जेक्ट-स्टोर टाइमआउट्स, डुप्लिकेट मैसेजेस, प्रोसेसर अपग्रेड्स, CDN इनवैलिडेशन विफलताएं और टेनेंट कोटा समाप्ति को इंजेक्ट करें।

उच्च गुणवत्ता वाला नमूना उत्तर

"मैं ओरिजिनल को एक इम्यूटिएबल एड्रेसेबल एसेट मानूँगा और सामान्यीकृत पैरामीटर्स को प्रोसेसर वर्शन के साथ मिलाकर एक डेरिव्ड की बनाऊँगा। एक अनुरोध CDN और डेरिव्ड ऑब्जेक्ट की जाँच करता है; एक मिस होने पर एक यूनीक कंस्ट्रेंट के तहत एक शेयर्ड जॉब बनती है और मौजूदा जॉब या स्टेटस URL लौटाया जाता है। कतारें टेनेंट और पिक्सेल लागत के अनुसार शेड्यूल होती हैं। वर्कर्स एक ऐसे सैंडबॉक्स में चलते हैं जो डिकंप्रेशन अनुपात, मेमोरी, CPU, फ़्रेम और आउटपुट आकार को सीमित करता है, फिर एक टेम्पररी परिणाम को मान्य और एटॉमिक रूप से प्रकाशित करता है।

प्राइवेट एक्सेस टेनेंट, डेरिव्ड की और समाप्ति को कवर करने वाले हस्ताक्षरित URL का उपयोग करता है; सार्वजनिक प्रतिक्रियाएँ सही ETag, Cache-Control और कंटेंट प्रकार सेट करती हैं। डिलीशन इवेंट्स इंडेक्स और CDN प्रविष्टियों को साफ़ करते हैं। मेट्रिक्स में हिट दर, कतार आयु, p95 लेटेंसी, रिसोर्स पीक्स और विफलता वर्ग शामिल हैं; समाधान प्रक्रिया अनाथ ऑब्जेक्ट्स ढूंढती है। समान अनुरोध पुनर्गणना नहीं करते हैं, शत्रुतापूर्ण इमेजेस क्षमता समाप्त नहीं कर सकती हैं, और प्रोसेसर अपग्रेड पुराने डेरिवेटिव्स को दूषित नहीं कर सकते हैं।"

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

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

फॉलो-अप प्रश्न और उत्तर

फॉलो-अप 1: कैश की में प्रोसेसर वर्शन को क्यों शामिल करें?

विभिन्न एल्गोरिदम या लाइब्रेरीज़ अलग-अलग बाइट्स उत्पन्न कर सकते हैं। वर्शनिंग नए परिणामों को सह-अस्तित्व में रहने की अनुमति देती है और पुराने परिणामों को जानबूझकर समाप्त किया जा सकता है।

फॉलो-अप 2: आप एनिमेटेड इमेजेस को कैसे संभालते हैं?

लागत मॉडल में फ़्रेम संख्या, अवधि और आउटपुट नीति शामिल करें, कुल फ़्रेम और पिक्सेल की सीमा तय करें, और पहले फ़्रेम के थंबनेल के लिए एक अलग की का उपयोग करें।

फॉलो-अप 3: आप 202 कब लौटाते हैं?

जब लागत अप्रत्याशित हो, आउटपुट बड़ा हो, या कतार भरी हो, तो 202, एक जॉब ID और पुनः प्रयास मार्गदर्शन लौटाएं। छोटे सामान्य फ़ॉर्मैट्स एक सख्त सिंक्रोनस बजट का उपयोग कर सकते हैं।

फॉलो-अप 4: आप कैश पॉइज़निंग को कैसे रोकते हैं?

केवल सर्वर ही सामान्यीकृत पैरामीटर्स से कीज़ बनाता है। प्रकाशन से पहले प्रकार, लंबाई और डाइजेस्ट को मान्य करें; प्राइवेट कैश को टेनेंट ऑथराइजेशन से बांधें।

फॉलो-अप 5: ओरिजिनल को बदलने के बाद पुराने URLs का क्या होता है?

इम्यूटिएबल वर्शन IDs का उपयोग करें। प्रतिस्थापन एक नया एसेट या वर्शन इवेंट बनाता है; पुराने डेरिवेटिव्स चुपचाप बाइट्स बदलने के बजाय रिटेंशन के अनुसार बने रहते हैं या समाप्त हो जाते हैं।

फॉलो-अप 6: आप लागत को उचित कैसे रखते हैं?

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

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

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

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

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

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

टूल देखें