वाह, यह एक सरल प्रश्न है, जो संभावित उत्तर का एक विशाल सरणी है। आपके प्रश्न का अधिक स्पष्ट हिस्सा पूछता है कि क्या यह सीधे आपके डेटाबेस के साथ या वेब सेवा के माध्यम से इंटरफ़ेस करने के लिए अधिक मापनीय है। यह उत्तर सरल है: डेटाबेस को सीधे क्वेरी करें। वेब सेवा के माध्यम से जाने से विलंबता का एक पूरा गुच्छा जुड़ जाता है जो फ़ायरवॉल (द्वारा और बड़े) के पीछे कोड संचालन के लिए पूरी तरह से अनावश्यक है। उदाहरण के लिए एक वेब सेवा को अनुरोध प्राप्त करने के लिए कुछ घटक की आवश्यकता होती है, इसे डिसेर्बलाइज किया जाता है, डीबी को क्वेरी करता है, एक प्रतिक्रिया को क्रमबद्ध करता है और इसे वापस करता है। इसलिए यदि आपका कोड फ़ायरवॉल के पीछे काम कर रहा है, तो अपने आप को परेशानी से बचाएं और सीधे DB को क्वेरी करें।
एक वेब साइट को स्केलेबल बनाना हालांकि उस सवाल से परे है जो आपने शुरू में किया था। इसलिए मुझे क्षमा करें यदि मैं यहाँ एक स्पर्शरेखा पर जाता हूँ, लेकिन मैंने सोचा कि यह उपयोगी हो सकता है यह देखते हुए कि आपने विशेष रूप से फेसबुक का उल्लेख किया है।
मैं आपको ब्रैड फिट्ज़पैट्रिक (LiveJournal के संस्थापक और अब Google पर) द्वारा निर्मित काम और उपकरणों पर पढ़ने की सलाह दूंगा। जब मैंने उनके साथ सिक्स शिवाय में काम किया, तो यहां कुछ चीजें मैंने उनसे सीखीं और लाइवजर्नल आर्किटेक्चर के बारे में जो इसे इतना शानदार बना दिया।
चौड़े वाले के विपरीत संकीर्ण डेटाबेस तालिकाओं का उपयोग करें । जो इस बारे में आकर्षक था, वह सीख रहा था कि इस वास्तुकला को किसने प्रेरित किया, जो एक ऐसी प्रणाली बना रहा था जो आसानी से और जल्दी से थीउन्नत बनाया। यदि आप विस्तृत तालिकाओं, या तालिकाओं का उपयोग करते हैं, जिसके लिए प्रत्येक फ़ील्ड या संपत्ति तालिका में एक स्तंभ है, जब डेटाबेस स्कीमा को अपग्रेड करने का समय आता है, उदाहरण के लिए एक नया स्तंभ जोड़ रहा है, तो सिस्टम को स्कीमा करते समय तालिका को लॉक करने की आवश्यकता होगी परिवर्तन लागू किया गया है। जब बड़े पैमाने पर परिचालन किया जाता है तो इसका मतलब होगा कि डेटाबेस स्कीमा में एक साधारण बदलाव के परिणामस्वरूप एक बड़ा डेटाबेस आउटेज हो सकता है। जो स्पष्ट रूप से बेकार है। दूसरी ओर एक संकरी तालिका बस डेटाबेस में एक पंक्ति के रूप में एक वस्तु से जुड़ी प्रत्येक व्यक्तिगत संपत्ति को संग्रहीत करती है। इसलिए जब आप डेटाबेस में एक नया कॉलम जोड़ना चाहते हैं, तो आपको एक तालिका में INSERT रिकॉर्ड रखना होगा, जो एक गैर-लॉकिंग ऑपरेशन है। ठीक है, यह एक छोटी पृष्ठभूमि है, आइए देखें कि यह मॉडल वास्तव में लाइवजर्नल जैसी कार्य प्रणाली में कैसे अनुवाद करता है।
मान लें कि आप किसी व्यक्ति के ब्लॉग पर अंतिम 10 जर्नल प्रविष्टियों को लोड करना चाहते हैं, और मान लें कि प्रत्येक जर्नल प्रविष्टि में दस गुण हैं। क्लासिक वाइड टेबल लेआउट में, प्रत्येक प्रॉपर्टी एक टेबल पर एक कॉलम से संबंधित होगी। एक उपयोगकर्ता तब तालिका को एक बार क्वेरी करेगा जिसमें उन्हें सभी डेटा की आवश्यकता होगी। क्वेरी 10 पंक्तियों को लौटाएगी और प्रत्येक पंक्ति में वे सभी डेटा होंगे जिनकी उन्हें आवश्यकता है (उदाहरण के लिए प्रविष्टियों से चयन करें) तिथि 10 तारीख तक। एक संकीर्ण तालिका लेआउट में हालांकि चीजें थोड़ी अलग हैं। इस उदाहरण में वास्तव में दो तालिकाएँ हैं: पहली तालिका (तालिका A) सरल मानदंड संग्रहीत करती है, जिसमें से कोई एक खोज करना चाहता है, जैसे प्रविष्टि की आईडी, लेखक की आईडी, प्रवेश की तिथि, आदि। दूसरी तालिका। (तालिका बी) फिर एक प्रविष्टि के साथ जुड़े सभी गुणों को संग्रहीत करता है। इस दूसरी तालिका में तीन कॉलम हैं: entry_id, कुंजी और मान। तालिका A में प्रत्येक पंक्ति के लिए, तालिका B (प्रत्येक संपत्ति के लिए एक पंक्ति) में 10 पंक्तियाँ होंगी। इसलिए अंतिम दस प्रविष्टियों को लाने और प्रदर्शित करने के लिए, आपको 11 प्रश्नों की आवश्यकता होगी। पहली क्वेरी आपको प्रवेश आईडी की सूची देती है, और फिर अगले दस प्रश्न पहली क्वेरी में लौटी प्रविष्टियों में से प्रत्येक के साथ जुड़े गुणों को लाएंगे।
"पवित्र मोली!" आप कहते हैं, "पृथ्वी पर यह और अधिक स्केलेबल कैसे हो सकता है ?!" इसकी पूरी तरह से सहज ज्ञान युक्त अधिकार? पहले परिदृश्य में हमारे पास सिर्फ एक डेटाबेस क्वेरी थी, लेकिन दूसरे "अधिक स्केलेबल" समाधान में हमारे पास 11 डेटाबेस प्रश्न हैं। इसका कोई अर्थ नही बन रहा है। उस सवाल का जवाब पूरी तरह से अगली गोली पर निर्भर करता है।
उदारतापूर्वक मेमकेच का उपयोग करें। मामले में आप अवगत नहीं थे, मेमेचे एक वितरित, स्टेटलेस, कम विलंबता, नेटवर्क आधारित कैशिंग प्रणाली है। इसका उपयोग फेसबुक, Google, याहू और ग्रह पर हर लोकप्रिय और स्केलेबल वेब साइट के बारे में किया जाता है। यह ब्रैड फिट्ज़पैट्रिक द्वारा आंशिक रूप से एक संकीर्ण तालिका डेटाबेस डिजाइन में निहित डेटाबेस ओवरहेड को ऑफसेट करने में मदद करने के लिए आविष्कार किया गया था। आइए एक ही उदाहरण पर एक नज़र डालें, जैसा कि # 1 ऊपर चर्चा की गई है, लेकिन इस बार, आइए, मेमकेच का परिचय दें।
आइए शुरू करते हैं जब उपयोगकर्ता पहली बार किसी पृष्ठ पर जाता है और कैश में कुछ भी नहीं होता है। आप तालिका ए को क्वेरी करके शुरू करते हैं जो पृष्ठ पर प्रदर्शित होने वाली 10 प्रविष्टियों की आईडी लौटाता है। उन प्रविष्टियों में से प्रत्येक के लिए आप तब डेटाबेस में उस प्रविष्टि से जुड़े गुणों को प्राप्त करने के लिए क्वेरी करते हैं, और फिर उन गुणों का उपयोग करके एक ऑब्जेक्ट का निर्माण करते हैं, जो आपके कोड के साथ इंटरफ़ेस कर सकते हैं (उदाहरण के लिए एक ऑब्जेक्ट)। फिर आप उस वस्तु (या उस वस्तु का क्रमबद्ध रूप) को मेमचे में दबाते हैं।
दूसरी बार जब कोई एक ही पृष्ठ लोड करता है, तो आप उसी तरह से शुरू करते हैं: आपके द्वारा प्रदर्शित की जाने वाली प्रविष्टि आईडी की सूची के लिए तालिका ए को क्वेरी करके। प्रत्येक प्रविष्टि के लिए आप पहले मेमचे में जाते हैं और कहते हैं, "क्या आपके पास कैश में प्रविष्टि #X है?" यदि हाँ, तो memcache आपके लिए प्रविष्टि ऑब्जेक्ट लौटाता है। यदि नहीं, तो आपको इसके गुणों को प्राप्त करने के लिए डेटाबेस को फिर से क्वेरी करने की आवश्यकता है, ऑब्जेक्ट का गठन करें और इसे मेम्चे में स्टैश करें। अधिकांश समय, दूसरी बार जब कोई एक ही पृष्ठ पर जाता है तो केवल एक डेटाबेस क्वेरी होती है, अन्य सभी डेटा को फिर मेम्चे से सीधे खींच लिया जाता है।
व्यवहार में, LiveJournal के अधिकांश के लिए जो हो रहा है, वह यह है कि सिस्टम के अधिकांश डेटा, विशेष रूप से कम अस्थिर डेटा, मेम्चे में कैश किया गया था और संकीर्ण तालिका स्कीमा का समर्थन करने के लिए आवश्यक डेटाबेस के लिए अतिरिक्त प्रश्न सभी थे, लेकिन पूरी तरह से ऑफसेट थे।
इस डिज़ाइन ने आपके सभी दोस्तों से जुड़े पदों की एक सूची को एक स्ट्रीम में, या "दीवार" से बहुत अधिक आसान बनाने के साथ जुड़ी समस्या को हल कर दिया ।
इसके बाद, अपने डेटाबेस के विभाजन पर विचार करें। मॉडल ने सतहों के ऊपर चर्चा की फिर भी एक और समस्या है, और यह है कि आपकी संकीर्ण तालिकाएं बहुत बड़ी / लंबी होंगी। और उन पंक्तियों की तालिका में अन्य प्रशासनिक कार्य कठिन हो जाते हैं। इसे ऑफसेट करने के लिए, किसी तालिका में तालिकाओं को विभाजित करके अपनी तालिकाओं के आकार को प्रबंधित करने के लिए यह समझ में आ सकता है, ताकि उपयोगकर्ताओं के क्लस्टर को एक डेटाबेस द्वारा सेवा दी जाए, और उपयोगकर्ताओं के एक अन्य क्लस्टर को एक अलग डेटाबेस द्वारा सेवा दी जाती है। यह डेटाबेस पर लोड वितरित करता है और प्रश्नों को कुशल रखता है।
अंत में, आपको भयानक अनुक्रमित चाहिए। आपके प्रश्नों की गति काफी हद तक इस बात पर निर्भर करेगी कि आपके डेटाबेस की तालिकाओं को कितनी अच्छी तरह अनुक्रमित किया गया है। मैं इस बात पर चर्चा करने में बहुत अधिक समय नहीं लगाऊंगा कि सूचकांक क्या है, सिवाय इसके कि यह एक विशाल कार्ड कैटलॉग प्रणाली की तरह बहुत है, जिससे कि एक घास के ढेर में सुइयों को अधिक कुशल बनाया जा सके। यदि आप mysql का उपयोग करते हैं तो मैं उन क्वेरी की निगरानी के लिए धीमी क्वेरी लॉग को चालू करने की सलाह देता हूं जिन्हें पूरा करने में लंबा समय लगता है। जब कोई क्वेरी आपके रडार पर आती है (उदाहरण के लिए यह धीमा है), तो यह पता लगाने के लिए कि तालिका को गति देने के लिए आपको किस सूचकांक को जोड़ने की आवश्यकता है।
"इस महान पृष्ठभूमि के लिए सभी का धन्यवाद, लेकिन पवित्र धर्मयुद्ध, यह एक बहुत कोड है जो मुझे लिखना होगा।"
जरुरी नहीं। कई पुस्तकालयों में लिखा गया है कि वास्तव में मेमेक के साथ इंटरफेस बनाना आसान है। अभी भी अन्य पुस्तकालयों ने ऊपर वर्णित पूरी प्रक्रिया को संहिताबद्ध किया है; डेटा :: पर्ल में ObjectDriver सिर्फ एक ऐसी लाइब्रेरी है। अन्य भाषाओं की तरह, आपको अपना स्वयं का शोध करने की आवश्यकता होगी।
मुझे आशा है कि आपको यह उत्तर सहायक लगा होगा। मैंने जो नहीं पाया है, वह यह है कि सिस्टम की मापनीयता अक्सर कम से कम और कोड से कम होती जाती है, और ध्वनि डेटा भंडारण और प्रबंधन रणनीति / तकनीकी डिजाइन के लिए अधिक से अधिक।