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

सिस्टम डिज़ाइन इंटरव्यू: आप एक सर्च ऑटोकंप्लीट सर्विस को कैसे डिज़ाइन करेंगे?

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

प्रश्न

एक टाइप किए गए प्रीफिक्स के लिए शीर्ष 10 क्वेरी सुझाव लौटाने वाली बैकएंड सर्विस डिज़ाइन करें। 50 मिलियन दैनिक सक्रिय उपयोगकर्ता (DAU), प्रति उपयोगकर्ता प्रति दिन 10 खोजें, प्रति खोज पांच सुझाव अनुरोध, 150,000 अनुरोध प्रति सेकंड का पीक, 50 ms का p99 लेटेंसी लक्ष्य, 15 मिनट का लोकप्रियता रिफ्रेश लक्ष्य और एक मिनट का नीति-हटाने (policy-removal) का लक्ष्य मान लें। API, रैंकिंग पाइपलाइन, प्रीफिक्स इंडेक्स, शार्डिंग, कैशिंग, पब्लिकेशन, सुरक्षा नियंत्रण, विफलता प्रबंधन और सत्यापन की व्याख्या करें।

प्रॉम्प्ट और लागू संदर्भ

एक टाइप किए गए प्रीफिक्स के लिए शीर्ष 10 क्वेरी सुझाव लौटाने वाली बैकएंड सर्विस डिज़ाइन करें। 50 मिलियन दैनिक सक्रिय उपयोगकर्ता, प्रति उपयोगकर्ता प्रति दिन 10 खोजें, प्रति खोज पांच सुझाव अनुरोध, 150,000 अनुरोध प्रति सेकंड का पीक, 50 ms का p99 लेटेंसी लक्ष्य, 15 मिनट का लोकप्रियता रिफ्रेश लक्ष्य और एक मिनट का नीति-हटाने का लक्ष्य मान लें।

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

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

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

एक मजबूत उत्तर सबसे पहले भारी-राइट (write-heavy) वाले लर्निंग पाथ को भारी-रीड (read-heavy) वाले सर्विंग पाथ से अलग करता है। हर कीस्ट्रोक पर रॉ लॉग्स को स्कैन करना या उम्मीदवारों को सॉर्ट करना एक सख्त टेल-लेटेंसी लक्ष्य को पूरा नहीं कर सकता है। अनुरोध आने से पहले एग्रीगेशन, पात्रता जांच, मॉडरेशन और अधिकांश रैंकिंग होनी चाहिए; ऑनलाइन पाथ एक सीमित प्रीफिक्स लुकअप करता है और एक छोटी सूची लौटाता है।

दूसरा संकेत मात्रात्मक तर्क (quantitative reasoning) है। दैनिक अनुमानों का अर्थ है 2.5 बिलियन अनुरोध: 50 मिलियन गुना 10 गुना पांच। यह औसतन लगभग 28,900 अनुरोध प्रति सेकंड है, इसलिए बताया गया 150,000 पीक लगभग पांच गुना पीक फैक्टर है। अनुमानित 1 KB प्रतिक्रिया पर, प्रोटोकॉल ओवरहेड और रेप्लिकेशन से पहले पीक प्रतिक्रिया पेलोड लगभग 150 MB/s है। ये गणनाएं रेप्लिकेशन, कैश और लोड-टेस्ट लक्ष्यों को संचालित करती हैं; वे एन्कोडेड इंडेक्स को मापे बिना मेमोरी का आकार तय करने का दिखावा नहीं करती हैं।

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

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

उत्तर देने से पहले स्पष्ट करने योग्य प्रश्न

  • सुझाव क्या दर्शाता है? क्वेरी कंप्लीशन, उत्पाद संस्थाएं (product entities) और नेविगेशन गंतव्यों के लिए अलग-अलग उम्मीदवार स्रोतों और रैंकिंग सुविधाओं की आवश्यकता होती है। बेस डिज़ाइन पूर्ण क्वेरी स्ट्रिंग्स लौटाता है।
  • कौन से मिलान आवश्यक हैं? केवल-प्रीफिक्स लुकअप एक कॉम्पैक्ट व्यवस्थित प्रीफिक्स इंडेक्स की अनुमति देता है। इनफिक्स, फ़ज़ी या सिमेंटिक मिलान उम्मीदवार जनरेटर जोड़ते हैं और ऑनलाइन बजट को सीमित करना कठिन बनाते हैं।
  • प्रत्येक परिवर्तन कितना ताज़ा होना चाहिए? लोकप्रियता 15 मिनट के अनुमान को सहन कर सकती है; नीति हटाने के लिए एक मिनट की आवश्यकता होती है। यह एक वर्ज़न्ड बेस इंडेक्स और स्वतंत्र रूप से रिफ्रेश होने वाली डिनाई लेयर की ओर ले जाता है।
  • क्या परिणाम वैश्विक हैं या वैयक्तिकृत? वैश्विक परिणामों को भारी रूप से कैश किया जा सकता है। वैयक्तिकरण कैश शेयरिंग को कम करता है और सहमति, विलोपन और फीचर-फ़ेच लेटेंसी जोड़ता है। इसे शुरुआत में बाहर रखा गया है।
  • लोकेल और नॉर्मलाइज़ेशन को कैसे परिभाषित किया जाता है? केस फोल्डिंग, लिपि, एक्सेंट और शब्द सीमाएं लोकेल के अनुसार भिन्न होती हैं। इंडेक्स और क्वेरी को समान वर्ज़न्ड नॉर्मलाइज़ेशन नीति का उपयोग करना चाहिए।
  • खाली और एक-वर्ण (one-character) वाले प्रीफिक्स के लिए क्या होता है? वे अत्यधिक हॉट होते हैं और व्यापक रुझान प्रकट कर सकते हैं। बेस सिस्टम खाली इनपुट के लिए एक क्यूरेटेड लोकेल सूची और एक वर्ण के लिए एक पूर्व-गणना (precomputed) सूची लौटाता है।
  • सुरक्षा और गोपनीयता की आवश्यकताएं क्या हैं? वे लॉग रिटेंशन, एग्रीगेशन सीमाएं, समीक्षक वर्कफ़्लो, क्षेत्रीय स्टोरेज और यह निर्धारित करती हैं कि क्या कोई उम्मीदवार कभी इंडेक्स में प्रवेश कर सकता है।

30-सेकंड उत्तर फ्रेमवर्क

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

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

चरण 1: बजट और अनुबंध प्राप्त करना

एक छोटा इडेम्पोटेंट (idempotent) रीड API उपयोग करें:

text
GET /v1/suggestions?prefix=iph&locale=en-US&limit=10

200 {
  "suggestions": [
    { "text": "iphone charger", "id": "q_7f2" }
  ],
  "indexVersion": "2026-07-19T17:30Z"
}

limit को क्लैंप करें, नॉर्मलाइज़्ड प्रीफिक्स की लंबाई सीमित करें, असमर्थित लोकेल्स को अस्वीकार करें, और क्लाइंट से कभी भी रैंकिंग वेट स्वीकार न करें। स्थिर अपारदर्शी (opaque) ID डिस्प्ले टेक्स्ट को पहचानकर्ता के रूप में उपयोग किए बिना एनालिटिक्स का समर्थन करती है। indexVersion पुराने या मिश्रित-वर्ज़न प्रतिक्रियाओं को देखने योग्य बनाता है।

2.5-बिलियन दैनिक गणना लगभग 28,900 औसत QPS देती है। दिया गया 150,000 पीक कैपेसिटी लक्ष्य है। यदि एक प्रतिक्रिया लगभग 1 KB है, तो 150 MB/s सर्व करने के लिए क्षेत्रीय रेप्लिका और संपीड़ित ट्रांसपोर्ट की आवश्यकता होती है। कैश क्षमता और इंडेक्स RAM के लिए अभी भी प्रोडक्शन नमूनों की आवश्यकता होती है: प्रतिनिधि आर्टिफैक्ट्स को सीरियलाइज़ करें, प्रति प्रीफिक्स और टॉप-K प्रविष्टि बाइट्स मापें, फिर रेप्लिकेशन और हेडरूम जोड़ें। उम्मीदवार संख्या से अनुमानित Trie-नोड आकार को गुणा करने से गलत सटीकता उत्पन्न होगी।

चरण 2: रॉ लॉग्स प्रकाशित किए बिना उम्मीदवारों का निर्माण करना

क्लाइंट क्वेरी ID, नॉर्मलाइज़्ड लोकेल, मोटे संदर्भ (coarse context), टाइमस्टैम्प, परिणाम सिग्नल और केवल सीमित एग्रीगेशन के लिए उपयोग की जाने वाली एक अल्पकालिक गोपनीयता-संरक्षण अभिनेता कुंजी (actor key) के साथ एक पूर्ण-खोज (completed-search) इवेंट उत्सर्जित करते हैं। इंजेक्शन सेवा स्कीमा को मान्य करती है और केवल-जोड़ने (append-only) वाली स्ट्रीम से पहले स्पष्ट बॉट्स को हटा देती है। विंडोयुक्त एग्रीगेशन विशिष्ट-अभिनेता गणना और गुणवत्ता सिग्नल की गणना करता है; कच्चे उपयोगकर्ता पहचानकर्ता कभी भी सुझाव कुंजी का हिस्सा नहीं बनते हैं।

उम्मीदवार पाइपलाइन न्यूनतम विशिष्ट-उपयोगकर्ता सीमा, दर और दुरुपयोग नियंत्रण, गोपनीयता और प्रतिधारण नियम, और नीति वर्गीकरण लागू करती है। इसके बाद यह लोकप्रियता, नवीनता क्षय (recency decay), परिणाम गुणवत्ता और संपादकीय नियमों के प्रलेखित संयोजन का उपयोग करके पात्र उम्मीदवारों को रैंक करती है। सटीक भार सीखे और परखे जाते हैं; वे सार्वभौमिक स्थिरांक नहीं हैं। अस्वीकार किए गए उम्मीदवारों और कारणों को एक प्रतिबंधित ऑडिट स्टोर में रखें, सर्विंग इंडेक्स में नहीं।

देखे गए क्लिकों से रैंकिंग जो पहले से प्रदर्शित था उसे सुदृढ़ कर सकती है। जुड़ाव के साथ-साथ ऑफलाइन प्रासंगिकता निर्णयों और संरक्षित प्रयोगों का उपयोग करें, और सुझाव कवरेज, शून्य-परिणाम दर, शिकायतों और एक्सपोज़र एकाग्रता की निगरानी करें। इंडेक्स निर्माण से पहले मॉडरेशन होना चाहिए क्योंकि स्वचालित लॉग-व्युत्पन्न सुझाव हानिकारक या पक्षपातपूर्ण पाठ को पुन: उत्पन्न कर सकते हैं।

चरण 3: एक सीमित प्रीफिक्स इंडेक्स को मूर्त रूप देना (Materialize करना)

प्रत्येक पात्र सुझाव के लिए, ऑनलाइन उपयोग किए जाने वाले समान लोकेल-जागरूक नॉर्मलाइज़ेशन के तहत प्रीफिक्स उत्पन्न करें। प्रति प्रीफिक्स केवल एक सीमित शीर्ष सूची संग्रहीत करें—उदाहरण के लिए, जब API 10 लौटाता है तो सर्वश्रेष्ठ 20 उम्मीदवार—ताकि लुकअप और फ़िल्टरिंग सीमित रहे। अतिरिक्त उम्मीदवार सब-ट्री को स्कैन किए बिना डिडुप्लीकेशन और आपातकालीन हटाने की अनुमति देते हैं।

एक Trie या परिमित-अवस्था ट्रांसड्यूसर (FST) साझा प्रीफिक्स का प्रतिनिधित्व कर सकता है; लोकेल प्लस प्रीफिक्स द्वारा कीड (keyed) एक क्रमित की-वैल्यू टेबल परिचालन रूप से सरल है और अच्छी तरह से संपीड़ित हो सकती है। आर्टिफैक्ट आकार, निर्माण समय, लुकअप p99 और अपडेट वर्कफ़्लो की बेंचमार्किंग के बाद चुनें। Elasticsearch का कंप्लीशन सजेस्टर उसी ट्रेड-ऑफ को दर्शाता है: तेज़ प्रीफिक्स लुकअप एक इन-मेमोरी संरचना का उपयोग करता है जिसे बनाना महंगा है, और वेट तथा संदर्भ रैंकिंग और फ़िल्टरिंग को प्रभावित करते हैं।

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

चरण 4: सुरक्षित रूप से इम्यूटेबल वर्ज़न प्रकाशित करना

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

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

एक विफल या देर से बना बिल्ड एक स्वस्थ इंडेक्स को प्रतिस्थापित नहीं करता है। ताज़गी (Freshness) एक SLO है, अमान्य आर्टिफैक्ट प्रकाशित करने की अनुमति नहीं है।

चरण 5: ऑनलाइन पाथ को छोटा रखना

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

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

चरण 6: स्थानीयता (locality) और हॉट प्रीफिक्स के लिए शार्डिंग

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

विफलता डोमेन में प्रत्येक शार्ड की नकल (replicate) करें और एक स्वस्थ स्थानीय रेप्लिका पर रूट करें। प्रति-प्रीफिक्स QPS, कैश हिट दर, शार्ड CPU, लुकअप p99 और इंडेक्स बाइट्स रिकॉर्ड करें। रेप्लिका जोड़ने से रीड लोड हल हो जाता है; हॉट रेंज को विभाजित या अलग करने से लोड का झुकाव (skew) हल हो जाता है। यदि कोई शार्ड अनुपलब्ध है, तो स्पष्ट ताज़गी मीट्रिक या खाली सूची के साथ कैश्ड वर्ज़न लौटाएं—किसी अन्य लोकेल से सुझाव कभी न दें।

चरण 7: दो ताज़गी घड़ियों (Freshness Clocks) को पूरा करना

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

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

चरण 8: रैंकिंग, सुरक्षा और संचालन को मान्य करना

लोड टेस्ट 150,000 पीक QPS पर देखे गए प्रीफिक्स-लंबाई और लोकेल वितरण को दोबारा चलाते हैं, जिसमें हॉट एक-वर्ण प्रीफिक्स, कोल्ड-कैश स्टार्टअप, रेप्लिका हानि और वर्ज़न सक्रियण शामिल हैं। सेवा सीमा पर 50 ms से कम p99, सीमित त्रुटि दर, प्रति प्रतिक्रिया कोई मिश्रित चेकसम नहीं, और बिना किसी थंडरिंग हर्ड (thundering herd) के रिकवरी का दावा करें।

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

ऑपरेशनल अभ्यासों में एक विषाक्त (poisoned) इवेंट बैच, विफल बिल्ड, बड़े आकार का आर्टिफैक्ट, हॉट शार्ड, पुराना डिनाई सेट, आंशिक रेप्लिका रोलआउट और रैंकर रिग्रेशन शामिल हैं। प्रत्येक अलर्ट को एक सुरक्षित कार्रवाई पर मैप करना चाहिए: सक्रियण को रोकना, अंतिम अच्छे वर्ज़न पर वापस जाना, ओवरले को अलग करना, रेंज को विभाजित करना, या आपातकालीन अस्वीकृति नियम को सक्रिय करना।

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

"मैं अनाम, लोकेल-विशिष्ट प्रीफिक्स कंप्लीशन और दस परिणामों के साथ शुरुआत करूँगा। 50 मिलियन उपयोगकर्ताओं, दस खोजों और प्रति खोज पांच अनुरोधों से, मुझे प्रति दिन 2.5 बिलियन अनुरोध मिलते हैं, जो लगभग 28,900 औसत QPS है। मैं 150,000 पीक के लिए कैपेसिटी की योजना बनाऊँगा और Trie मेमोरी का अनुमान लगाने के बजाय सीरियलाइज़्ड इंडेक्स आकार को मापूँगा।

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

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

बेस पुनर्निर्माण 15 मिनट के लक्ष्य को पूरा करता है। एक छोटा, गेटेड ट्रेंड ओवरले नवीनता में सुधार कर सकता है, जबकि आपातकालीन हटाने के लिए एक मिनट की डिनाई लेयर का उपयोग किया जाता है; इनमें से कोई भी अंतिम अच्छे बेस को दूषित किए बिना विफल हो सकता है। मैं 150,000 QPS पर वास्तविक प्रीफिक्स वितरण का परीक्षण करूँगा और p99, ताज़गी, कैश हिट दर, शार्ड तिरछापन (skew), प्रासंगिकता, लोकेल लीकेज, सुरक्षा रिकॉल और रोलबैक समय को ट्रैक करूँगा।"

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

  • हर कीस्ट्रोक पर रॉ लॉग्स को क्वेरी और सॉर्ट करना → काम इतिहास के साथ बढ़ता है और टेल लेटेंसी को अप्रत्याशित बनाता है → सीमित टॉप-K सूचियों की पूर्व-गणना करें और ऑनलाइन लुकअप को स्थिर-सीमित रखें।
  • डेटा संरचना को केवल "एक Trie" कहकर रुक जाना → यह रैंकिंग, पब्लिकेशन, शार्डिंग, सुरक्षा और रिकवरी को छोड़ देता है → बिल्ड और सर्विंग दोनों जीवन चक्रों का वर्णन करें और अभ्यावेदन को बेंचमार्क करें।
  • मनगढ़ंत नोड आकार से RAM का अनुमान लगाना → एन्कोडिंग और प्रीफिक्स शेयरिंग वास्तविक बाइट्स निर्धारित करते हैं → प्रतिनिधि डेटा को सीरियलाइज़ करें और आर्टिफैक्ट आकार व लुकअप लेटेंसी को मापें।
  • केवल प्रीफिक्स द्वारा कैशिंग करना → लोकेल्स, नीति और इंडेक्स वर्ज़न गलत परिणामों को लीक करते हैं या सुरक्षित रखते हैं → परिणाम को प्रभावित करने वाले प्रत्येक वर्ज़न को कुंजी में डालें।
  • यथास्थान (in place) पब्लिश करना → पाठक आंशिक या मिश्रित डेटा देखते हैं → इम्यूटेबल आर्टिफैक्ट्स बनाएं, मान्य करें, साथ-साथ लोड करें और परमाणु रूप से सक्रिय करें।
  • लोकप्रियता को एकमात्र पात्रता नियम के रूप में उपयोग करना → दुर्लभ व्यक्तिगत, हेरफेर या हानिकारक पाठ सामने आ सकता है → विशिष्ट-उपयोगकर्ता सीमाएं, एंटी-एब्यूज, गोपनीयता और मॉडरेशन गेट्स लागू करें।
  • आपातकालीन हटाने के लिए सब कुछ दोबारा बनाना → सुरक्षा की समय सीमा एक बड़े बैच कार्य पर निर्भर हो जाती है → एक तेज़ डिनाई लेयर वितरित करें और अगले बेस बिल्ड में स्थायी रूप से हटाएं।
  • क्लिक-थ्रू दर को निष्पक्ष प्रासंगिकता के रूप में मानना → प्रदर्शित रैंक क्लिक को प्रभावित करती है → सुरक्षित प्रयोगों को ऑफलाइन निर्णयों और सुरक्षा मेट्रिक्स के साथ संयोजित करें।

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

फॉलो-अप 1: आप फ़ज़ी मिलान कैसे जोड़ेंगे?

सटीक प्रीफिक्स लुकअप को पहले, सस्ते जनरेटर के रूप में रखें। न्यूनतम लंबाई के बाद या जब सटीक कवरेज कम हो तभी फ़ज़ी जेनरेशन ट्रिगर करें, एडिट-डिस्टेंस और उम्मीदवार संख्या को सीमित करें, और एक रैंकर व मॉडरेशन नीति के माध्यम से मर्ज करें। यूनिकोड-जागरूक दूरी और प्रतिकूल (adversarial) इनपुट को बेंचमार्क करें क्योंकि फ़ज़ी विस्तार CPU बढ़ाता है और नीति-संवेदनशील वेरिएंट प्राप्त कर सकता है।

फॉलो-अप 2: आप वैयक्तिकरण कैसे जोड़ेंगे?

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

फॉलो-अप 3: क्या होगा यदि एक लोकेल अब मेमोरी में फिट नहीं बैठता है?

मापे गए बाइट्स और QPS का उपयोग करके इसके प्रीफिक्स रेंज को विभाजित करें, फिर वर्ज़न्ड रूटिंग मैप को अपडेट करें। शीर्ष स्तर के हॉट प्रीफिक्स को समर्पित रेप्लिका पर रखें और कोल्ड रेंज को मेमोरी-मैप्ड या रिमोट इंडेक्स का उपयोग करने की अनुमति दें यदि उनका p99 अभी भी बजट को पूरा करता है। आर्टिफैक्ट वर्ज़न द्वारा पुनर्संतुलन (rebalance) करें ताकि पाठक कभी भी इन-प्लेस की माइग्रेशन पर निर्भर न हों।

फॉलो-अप 4: आप सेकंडों के भीतर ब्रेकिंग न्यूज़ का समर्थन कैसे करेंगे?

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

फॉलो-अप 5: गोपनीयता अनुरोध के बाद आप क्वेरी को कैसे हटाते हैं?

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

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

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

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

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

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

टूल देखें