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

सामान्य साक्षात्कार: लीनियराइजेबिलिटी (Linearizability) बनाम सीक्वेंशियल कंसिस्टेंसी (Sequential Consistency) को समझाएं

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

प्रश्न

लीनियराइजेबिलिटी और सीक्वेंशियल कंसिस्टेंसी के बीच अंतर स्पष्ट करें, एक ऐसी रीड/राइट हिस्ट्री दें जहाँ वे भिन्न हों, और वितरित प्रणालियों (distributed systems) में कंसिस्टेंसी, लेटेंसी और उपलब्धता के बीच ट्रेड-ऑफ को समझाएं।

प्रॉम्प्ट और उपयोग के मामले

लीनियराइजेबिलिटी और सीक्वेंशियल कंसिस्टेंसी के बीच अंतर स्पष्ट करें, एक ऐसी रीड/राइट हिस्ट्री दें जहाँ वे भिन्न हों, और वितरित प्रणालियों (distributed systems) में कंसिस्टेंसी, लेटेंसी और उपलब्धता के बीच ट्रेड-ऑफ को समझाएं। यह सिस्टम-डिज़ाइन, बैकएंड, डेटा और इन्फ्रास्ट्रक्चर भूमिकाओं के लिए एक उपयोगी फॉलो-अप है।

यह कोई शब्दावली परीक्षण नहीं है। साक्षात्कारकर्ता एक सत्यापन योग्य हिस्ट्री चाहता है जो नवीनतम मानों, रीयल-टाइम क्रम, प्रति-क्लाइंट क्रम और प्रतिकृति (replica) विलंब को जोड़ती हो।

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

  • क्या आप यह बताते हैं कि एक लीनियराइजेबल ऑपरेशन इनवोकेशन (invocation) और रिस्पॉन्स के बीच तात्कालिक रूप से प्रभावी होता दिखाई देता है।
  • क्या आप यह बताते हैं कि सीक्वेंशियल कंसिस्टेंसी के लिए एक ऐसे वैश्विक क्रम (global order) की आवश्यकता होती है जो प्रत्येक थ्रेड के प्रोग्राम क्रम को बनाए रखे, लेकिन थ्रेड्स के बीच रीयल-टाइम क्रम को नहीं।
  • क्या आप केवल यह कहने के बजाय कि एक "मजबूत" है, एक प्रति-उदाहरण (counterexample) के साथ अंतर साबित कर सकते हैं।
  • क्या आप मॉडलों को etcd जैसे सिस्टम में रीड मोड और लागतों से जोड़ते हैं।

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

पूछें कि क्या चर्चा किसी एक ऑब्जेक्ट या ट्रांजेक्शन, एक क्लाइंट या कई क्लाइंट्स से संबंधित है, और क्या इनवोकेशन और रिस्पॉन्स समय ज्ञात हैं। लीनियराइजेबिलिटी आमतौर पर एक समवर्ती ऑब्जेक्ट (concurrent object) का वर्णन करती है; मल्टी-ऑब्जेक्ट ट्रांजेक्शन को अतिरिक्त रूप से एटॉमीसिटी (atomicity) और आइसोलेशन (isolation) गारंटी की आवश्यकता होती है।

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

लीनियराइजेबिलिटी के लिए एक वैश्विक क्रम की आवश्यकता होती है जो रीयल-टाइम का सम्मान करता है: एक पूर्ण हो चुके राइट को उसके बाद शुरू होने वाले रीड के लिए दृश्यमान (visible) होना चाहिए। सीक्वेंशियल कंसिस्टेंसी केवल प्रत्येक थ्रेड के प्रोग्राम क्रम को सुरक्षित रखती है, इसलिए विभिन्न थ्रेड्स के ऑपरेशनों को पुन: व्यवस्थित (reorder) किया जा सकता है। राइट के बाद का पुराना रीड (stale read) लीनियराइजेबिलिटी का उल्लंघन करता है; जब कॉल ओवरलैप होती हैं, तो एक वैश्विक क्रम अभी भी रीड को पहले रख सकता है और सीक्वेंशियल कंसिस्टेंसी को संतुष्ट कर सकता है। मजबूत मॉडलों के लिए अधिक समन्वय (coordination) की आवश्यकता होती है, जिससे लेटेंसी और पार्टीशन के समय उपलब्धता की लागत आती है।

चरण-दर-चरण स्पष्टीकरण

एक ऑपरेशन हिस्ट्री का वर्णन करें

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

सीक्वेंशियल-कंसिस्टेंसी नियम

सीक्वेंशियल कंसिस्टेंसी के लिए एक ऐसे वैश्विक अनुक्रम (global sequence) की आवश्यकता होती है जिसमें प्रत्येक थ्रेड के ऑपरेशन उसके अपने प्रोग्राम क्रम में दिखाई दें। विभिन्न थ्रेड्स के ऑपरेशनों को तब भी पुन: व्यवस्थित किया जा सकता है जब वॉल-क्लॉक (wall-clock) क्रम मौजूद हो, बशर्ते हिस्ट्री में कोई अनिवार्य रीयल-टाइम प्रतिबंध न हो।

एक प्रति-उदाहरण टाइमलाइन

थ्रेड A: write(x=1) रिटर्न होता है; थ्रेड B फिर read(x) इनवोक करता है और 0 प्राप्त करता है। उसी ऑब्जेक्ट के लिए, उस हिस्ट्री को लीनियराइज नहीं किया जा सकता है। यदि कॉल अंतराल ओवरलैप होते हैं, तो एक सिस्टम वैश्विक अनुक्रम में B के रीड को A के राइट से पहले रख सकता है, जिससे रीयल-टाइम क्रम का उल्लंघन करते हुए भी सीक्वेंशियल कंसिस्टेंसी संतुष्ट हो जाती है।

~~~text Linearizable: A: write(1) ---- returns B: read() -> 1

Not linearizable: A: write(1) ---- returns B: read() -> 0

Sequentially consistent but not necessarily linearizable: A: write(1) ========= B: read() -> 0 ========= Global order may place B before A when the calls overlap. ~~~

इवेंचुअल कंसिस्टेंसी के साथ तुलना

इवेंचुअल कंसिस्टेंसी राइट्स बंद होने और पर्याप्त समय बीत जाने के बाद अभिसरण (convergence) का वादा करती है। यह पुराने रीड्स (stale reads) की अनुमति देती है और स्वचालित रूप से रीड-योर-राइट्स (read-your-writes) या मोनोटोनिक रीड्स प्रदान नहीं करती है। लीनियराइजेबिलिटी आमतौर पर एक लीडर या कोरम के माध्यम से रीड्स और राइट्स को रूट करके अधिक मजबूत रीयल-टाइम सेमेंटिक्स देती है।

मॉडल उत्तर

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

यदि A 1 लिखता है और B के पढ़ना शुरू करने से पहले रिटर्न हो जाता है, तो B द्वारा 0 लौटाना लीनियराइजेबिलिटी का उल्लंघन करता है। यदि कॉल अंतराल ओवरलैप होते हैं, तो B का रीड वैश्विक हिस्ट्री में A के राइट से पहले दिखाई दे सकता है और फिर भी सीक्वेंशियल कंसिस्टेंसी को संतुष्ट कर सकता है। व्यवसाय की आवश्यकता के अनुसार मॉडल चुनें: लॉक्स, लीज और सशर्त अपडेट के लिए अक्सर लीनियराइजेबिलिटी की आवश्यकता होती है; सर्च इंडेक्स और एनालिटिक्स रेप्लिकस कम लेटेंसी और उच्च उपलब्धता के लिए कमजोर सेमेंटिक्स स्वीकार कर सकते हैं।

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

  • रीयल-टाइम क्रम निर्दिष्ट किए बिना किसी सिस्टम को "दृढ़ता से सुसंगत" (strongly consistent) कहना।
  • सीक्वेंशियल कंसिस्टेंसी को प्रति-थ्रेड प्रोग्राम-क्रम नियम के बजाय सर्वर-टाइम सॉर्टिंग के रूप में वर्णित करना।
  • रीड-योर-राइट्स या मोनोटोनिक रीड्स पर चर्चा किए बिना यह कहना कि इवेंचुअल कंसिस्टेंसी "अंततः नवीनतम मान पढ़ती है"।
  • यह जांचे बिना कि क्या रीड्स सर्वसम्मति (consensus) पथ में शामिल होते हैं, यह मान लेना कि कोरम का अर्थ स्वचालित रूप से लीनियराइजेबिलिटी है।
  • सिंगल-ऑब्जेक्ट लीनियराइजेबिलिटी को मल्टी-ऑब्जेक्ट ट्रांजेक्शन के लिए पूर्ण आइसोलेशन के रूप में मानना।

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

लीनियराइजेबिलिटी की लागत आमतौर पर अधिक क्यों होती है?

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

सीक्वेंशियल कंसिस्टेंसी कहाँ कमजोर है?

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

etcd के रीड मोड्स क्या हैं?

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

आप लीनियराइजेबिलिटी का परीक्षण कैसे करते हैं?

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

इवेंचुअल कंसिस्टेंसी कब पर्याप्त होती है?

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

आप उत्तर कैसे समाप्त करते हैं?

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

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

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