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

सामान्य तकनीकी साक्षात्कार: कैश वेरिएंट को दूषित किए बिना HTTP कंटेंट नेगोशिएशन डिज़ाइन करना

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

प्रश्न

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

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

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

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

  • क्या आप किसी रिसोर्स URI को उसके रिप्रेजेंटेशन से अलग पहचानते हैं और प्रोएक्टिव नेगोशिएशन हेडर को समझते हैं।
  • क्या आप रिस्पॉन्स को प्रभावित करने वाले अनुरोध फ़ील्ड को घोषित करने के लिए Vary का उपयोग करते हैं और कैश-की तथा हिट-रेट ट्रेड-ऑफ़ प्राप्त करते हैं।
  • क्या भाषा, मीडिया प्रकार और एन्कोडिंग फ़ॉलबैक अस्पष्ट 406 रिस्पॉन्स उत्पन्न करने के बजाय नियतात्मक (deterministic) हैं।
  • क्या आप कुकीज़, ऑथराइजेशन, उपयोगकर्ता लक्षणों और उच्च-कार्डिनैलिटी हेडर से शेयर्ड-कैश और प्राइवेसी जोखिमों को पहचानते हैं।

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

पुष्टि करें कि क्या रिसोर्स सार्वजनिक रूप से साझा करने योग्य है, कौन से वेरिएंट आयाम मौजूद हैं, क्या सर्वर-संचालित नेगोशिएशन की अनुमति है, क्या क्लाइंट स्पष्ट रूप से किसी भाषा का चयन कर सकते हैं, और CDN Vary द्वारा कैसे शार्ड (shard) करता है। असमर्थित-भाषा फ़ॉलबैक, अनुमत एन्कोडिंग, वैयक्तिकरण (personalization), और स्वीकार्य कैश हिट दर के बारे में पूछें।

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

मैं रिसोर्स URI को रिप्रेजेंटेशन चयन से अलग मॉडल करूँगा, भारित Accept, Accept-Language, और Accept-Encoding मानों से नियतात्मक रूप से चयन करूँगा, और सटीक Content-Type, Content-Language, Content-Encoding, और Vary वापस करूँगा। एक शेयर्ड कैश केवल उसी वेरिएंट कुंजी का पुन: उपयोग करता है; वैयक्तिकृत या उच्च-कार्डिनैलिटी अनुरोध इसे बायपास करते हैं। जब कोई रिप्रेजेंटेशन मेल नहीं खाता है, तो एक प्रलेखित फ़ॉलबैक या 406 नीति लागू करें, निर्णय को लॉग करें, और अनुरोध मैट्रिक्स के साथ कैश हिट, बाइट्स और प्राइवेसी का परीक्षण करें।

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

1. रिप्रेजेंटेशन और नेगोशिएशन आयामों को परिभाषित करें

एक URI को ऐसे रिसोर्स के रूप में मानें जिसमें HTML बनाम JSON, चीनी बनाम अंग्रेजी, या gzip बनाम br जैसे रिप्रेजेंटेशन हों। केवल उन अनुरोध फ़ील्ड को शामिल करें जो रिस्पॉन्स बाइट्स या सिमेंटिक्स को बदलते हैं; सुविधा के लिए प्रत्येक कुकी या पूर्ण User-Agent न जोड़ें। चयन को रिकॉर्ड करें ताकि समान सामान्यीकृत इनपुट समान रिप्रेजेंटेशन उत्पन्न करें।

2. भार (weights), फ़ॉलबैक और त्रुटियों को डिज़ाइन करें

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

3. कैश वेरिएंट को गणना योग्य बनाएं

Vary में चयन हेडर सूचीबद्ध करें, उदाहरण के लिए Accept, Accept-Language, Accept-Encoding। URI, विधि और उन फ़ील्ड के सामान्यीकृत मानों से एक वेरिएंट कुंजी बनाएं; सामान्यीकरण केस, व्हाइटस्पेस और क्रम को कवर करता है ताकि समकक्ष वर्तनी असीमित कुंजियाँ न बनाएं। यदि ऑथराइजेशन, सत्र स्थिति, या उपयोगकर्ता कुकीज़ रिस्पॉन्स को प्रभावित करती हैं, तो एक निजी कैश का उपयोग करें या स्पष्ट रूप से साझाकरण को रोकें।

4. हिट दर, प्राइवेसी और वेरिएंट गणना को नियंत्रित करें

प्रत्येक आयाम कैश को विभाजित करता है और हिट दर को कम करता है। Accept-Language ब्राउज़र-फ़िंगरप्रिंटिंग सिग्नल भी बन सकता है। सार्वजनिक पृष्ठ लॉन्ग-टेल भाषाओं को एक सीमित समर्थित सेट में मैप कर सकते हैं; वैयक्तिकृत डेटा निजी, अल्पकालिक, या बिना कैशिंग का उपयोग करता है। अज्ञात निर्भरताओं को छिपाने के लिए Vary: * का उपयोग न करें क्योंकि यह शेयर्ड पुन: उपयोग को रोकता है।

5. अवलोकन क्षमता (observability) और सत्यापन डिज़ाइन करें

पूरी संवेदनशील कुकीज़ को रिकॉर्ड किए बिना सामान्यीकृत नेगोशिएशन इनपुट, चयनित रिप्रेजेंटेशन, Vary, कैश स्थिति और फ़ॉलबैक कारण लॉग करें। प्रत्येक वेरिएंट के हेडर, डीकंप्रेशन, CDN हिट और मिस व्यवहार, और विशेष रूप से "पहले चीनी, दूसरी अंग्रेजी" अनुक्रम का परीक्षण करें। घटनाओं के दौरान Age, कैश स्थिति, Content-* हेडर और वास्तविक बाइट्स की तुलना करें, फिर एक निश्चित अनुरोध मैट्रिक्स को दोबारा चलाएं।

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

मैं एक सीमित रिप्रेजेंटेशन सेट की गणना करूँगा और Accept, Accept-Language, और Accept-Encoding में गुणवत्ता कारकों से नियतात्मक रूप से चयन करूँगा। रिस्पॉन्स Content-Type, Content-Language, Content-Encoding, और सटीक Vary लौटाता है; कैश कुंजी में केवल वे सामान्यीकृत आयाम होते हैं। ऑथराइजेशन, सत्र स्थिति और उच्च-कार्डिनैलिटी लक्षण शेयर्ड कैश से बाहर रहते हैं, जबकि लॉन्ग-टेल सार्वजनिक भाषाएं डिफ़ॉल्ट पर वापस आ जाती हैं। यदि कुछ भी स्वीकार्य नहीं है, तो अनुबंध 406 या एक स्पष्ट डिफ़ॉल्ट चुनता है। लॉग संवेदनशील कुकीज़ के बिना विकल्प, फ़ॉलबैक और हिट स्थिति को कैप्चर करते हैं, और "चीनी फिर अंग्रेजी, br फिर gzip" जैसा मैट्रिक्स साबित करता है कि CDN कभी भी गलत वेरिएंट का पुन: उपयोग नहीं करता है।

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

  • Content-Language सेट करना लेकिन रिस्पॉन्स को बदलने वाले अनुरोध फ़ील्ड के लिए Vary को छोड़ देना।
  • कैश कुंजी में पूर्ण कुकीज़, User-Agent, या मनमाने हेडर डालना और हिट दर को नष्ट करना।
  • क्षेत्र, मूल-भाषा और डिफ़ॉल्ट फ़ॉलबैक के बिना प्रत्येक असमर्थित भाषा के लिए 406 लौटाना।
  • शेयर्ड कैश को ऐसे रिस्पॉन्स का पुन: उपयोग करने देना जो Authorization या सत्र डेटा पर निर्भर करता है।
  • एन्कोडिंग नेगोशिएशन की अनदेखी करना और ऐसा Content-Encoding लौटाना जिसे क्लाइंट डिकोड नहीं कर सकता।
  • Content-* हेडर, कैश स्थिति और वास्तविक बाइट्स के बजाय केवल स्थिति कोड देखना।

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

Vary में केवल Accept-Language ही क्यों नहीं हो सकता?

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

Vary: * कब उपयोगी होता है?

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

आप Accept-Language कुंजी विस्फोट को कैसे रोकते हैं?

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

क्या नेगोशिएशन विफलता पर 406 या एक डिफ़ॉल्ट रिप्रेजेंटेशन लौटाना चाहिए?

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

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

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