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

सिस्टम डिज़ाइन इंटरव्यू: नोइज़ी नेबर्स (noisy neighbors) को अलग करने के लिए आप शफ़ल शार्arding (shuffle sharding) का उपयोग कैसे करेंगे?

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

प्रश्न

एक साझा API क्लस्टर कुछ हाई-वॉल्यूम टेनेंट्स के कारण धीमा हो गया है। शफ़ल शार्डिंग को इस तरह डिज़ाइन करें कि टेनेंट स्केलिंग, फ़ेलओवर, कोटा और ऑब्ज़र्वेबिलिटी का समर्थन करते हुए सीमित संसाधनों को साझा कर सकें।

प्रांप्ट और दायरा

एक मल्टी-टेनेंट API में (N) बैकएंड एंडपॉइंट हैं। प्रत्येक टेनेंट को प्रत्येक एंडपॉइंट पर भेजने के बजाय, प्रत्येक टेनेंट को (k) एंडपॉइंट्स का एक शफ़ल शार्ड असाइन करें। अनुरोध केवल उसी शार्ड के भीतर रूट होते हैं, इसलिए ओवरलोड हुआ एंडपॉइंट मुख्य रूप से केवल उन्हीं टेनेंट्स को प्रभावित करता है जिनके शार्ड इसके साथ ओवरलैप होते हैं।

बताएं कि असाइनमेंट कैसे उत्पन्न और सुरक्षित (persist) करें, नोइज़ी टेनेंट्स को कैसे संभालें, एंडपॉइंट्स को उपलब्धता क्षेत्रों (Availability Zones) में कैसे वितरित करें, पुनः प्रयास (retry) और स्केल कैसे करें, और सरल शार्डिंग की तुलना में छोटे ब्लास्ट रेडियस (blast radius) को कैसे सिद्ध करें। AWS शफ़ल शार्डिंग को वर्कलोड आइसोलेशन और बल्कहेड (bulkhead) तकनीक के रूप में प्रस्तुत करता है: नियंत्रित ओवरलैप कम संसाधनों के साथ कई अलग-अलग संयोजन बना सकता है।

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

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

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

उत्तर देने से पहले स्पष्टीकरण प्रश्न

  • टेनेंट संख्या, एंडपॉइंट संख्या, शार्ड आकार और प्रति-टेनेंट पीक लोड क्या है?
  • क्या आप CPU, कनेक्शन पूल, कतारों (queues), दर कोटा (rate quotas), या प्रत्येक संसाधन को अलग कर रहे हैं?
  • क्या एक टेनेंट ज़ोन या क्षेत्रों (regions) में फैल सकता है, और क्या डेटा-निवास (data-residency) के नियम हैं?
  • क्या असाइनमेंट संक्षेप में माइग्रेट हो सकते हैं, और क्या कैश चर्न (cache churn) से बचने के लिए स्थिर मैपिंग की आवश्यकता है?
  • क्या शार्ड के बाहर पुनः प्रयास की अनुमति है, और क्या वे विफलता डोमेन का विस्तार करेंगे?

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

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

चरण-दर-चरण गहन उत्तर

चरण 1: संसाधन पूल और आइसोलेशन इकाइयों को परिभाषित करें

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

चरण 2: शार्ड का आकार चुनें

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

चरण 3: स्टेटलेस उम्मीदवार उत्पन्न करें

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

चरण 4: आवश्यकता पड़ने पर स्टेटफुल खोज का उपयोग करें

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

चरण 5: रूटिंग और पुनः प्रयास डिज़ाइन करें

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

चरण 6: नोइज़ी टेनेंट्स और कोटा को संभालें

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

चरण 7: स्केल करें, फ़ेलओवर करें और ज़ोन में रखें

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

चरण 8: आइसोलेशन लाभ और लागत को सत्यापित करें

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

मॉडल उत्तर

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

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

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

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

शफ़ल शार्डिंग कंसिस्टेंट हैशिंग से किस प्रकार भिन्न है?

कंसिस्टेंट हैशिंग आमतौर पर एक कुंजी को एक या कुछ नोड्स पर मैप करती है और स्केलिंग के दौरान डेटा मूवमेंट को कम करती है। शफ़ल शार्डिंग प्रति टेनेंट नोड्स का एक सेट चुनती है और सामान्य-विफलता और नोइज़ी-नेबर ओवरलैप को सीमित करती है।

(k) कितना बड़ा होना चाहिए?

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

यदि असाइनमेंट तालिका अनुपलब्ध हो तो क्या होगा?

एक संस्करणित स्थानीय कैश और एक सत्यापन योग्य स्टेटलेस फ़ॉलबैक रखें। असाइनमेंट परिवर्तनों को रोकें और मौजूदा टेनेंट्स को पुराने संस्करण पर रखें; बेतरतीब ढंग से पुनर्गणना न करें और स्प्लिट राइट्स (split writes) न बनाएं।

क्या कोई नोइज़ी टेनेंट शार्ड्स में फैल सकता है?

यह अपने स्वयं के बजट, ट्रैफ़िक सीमा और रोलबैक के साथ एक सीमित क्षमता रणनीति हो सकती है। असीमित प्रसार आइसोलेशन के लक्ष्य को पराजित करता है।

आप ज़ोन विफलता को कैसे संभालते हैं?

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

आप इसके बजाय सेल्स (cells) को कब चुनते हैं?

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

कौन सा मीट्रिक आपको इसका उपयोग बंद करने के लिए प्रेरित करेगा?

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

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

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

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

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

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

टूल देखें