टी एल; डॉ:
वे अपने ढेर के MySQL नीचे ऊपर सब कुछ के लिए कैश्ड रेखांकन के साथ एक स्टैक आर्किटेक्चर का उपयोग करते हैं।
लंबा जवाब:
मैंने खुद इस बारे में कुछ शोध किया क्योंकि मैं उत्सुक था कि वे अपने विशाल डेटा को कैसे संभालते हैं और इसे त्वरित तरीके से खोजते हैं। मैंने देखा है कि कस्टम कस्टम सोशल नेटवर्क स्क्रिप्ट के बारे में लोगों को शिकायत तब होती है जब यूजर बेस बढ़ता है। जब मैंने अपने आप को सिर्फ 10k उपयोगकर्ताओं और 2.5 मिलियन मित्र कनेक्शनों के साथ बेंचमार्किंग किया - तब भी समूह की अनुमति और पसंद और दीवार पोस्ट के बारे में परेशान करने की कोशिश नहीं की - यह जल्दी से पता चला कि यह दृष्टिकोण त्रुटिपूर्ण है। इसलिए मैंने वेब पर खोज करने के लिए कुछ समय बिताया है कि इसे बेहतर कैसे करें और इस आधिकारिक फेसबुक लेख पर आया:
मैं वास्तव में आपको आगे पढ़ने से पहले पहले लिंक की प्रस्तुति देखने की सलाह देता हूं । यह शायद सबसे अच्छा स्पष्टीकरण है कि एफबी आपको पर्दे के पीछे कैसे काम करता है।
वीडियो और लेख आपको कुछ बातें बताता है:
- वे MySQL का उपयोग अपने स्टैक के बहुत नीचे कर रहे हैं
- SQL DB के ऊपर TAO लेयर है जिसमें कैशिंग के कम से कम दो स्तर होते हैं और कनेक्शन का वर्णन करने के लिए ग्राफ़ का उपयोग कर रहा है।
- मुझे इस बात पर कुछ भी नहीं मिला कि वे वास्तव में अपने कैश्ड ग्राफ़ के लिए किस सॉफ्टवेयर / DB का उपयोग करते हैं
आइए इस पर एक नज़र डालते हैं, मित्र कनेक्शन शीर्ष बाएं हैं:
खैर, यह एक ग्राफ है। :) यह आपको यह नहीं बताता है कि इसे SQL में कैसे बनाया जाता है, इसे करने के कई तरीके हैं लेकिन इस साइट में अलग-अलग तरीकों की अच्छी मात्रा है। ध्यान दें: विचार करें कि एक संबंधपरक DB यह क्या है: यह सामान्यीकृत डेटा को संग्रहीत करने के लिए सोचा गया है, न कि एक ग्राफ संरचना। तो यह एक विशेष ग्राफ डेटाबेस के रूप में अच्छा प्रदर्शन नहीं करेगा।
यह भी विचार करें कि आपको केवल दोस्तों के दोस्तों की तुलना में अधिक जटिल प्रश्न करने हैं, उदाहरण के लिए जब आप किसी दिए गए निर्देशांक के आसपास के सभी स्थानों को फ़िल्टर करना चाहते हैं जो आपको और आपके दोस्तों के दोस्तों को पसंद आए। एक ग्राफ यहाँ सही समाधान है।
मैं आपको यह नहीं बता सकता कि इसे कैसे बनाया जाए ताकि यह अच्छा प्रदर्शन करे लेकिन इसके लिए स्पष्ट रूप से कुछ परीक्षण और त्रुटि और बेंचमार्किंग की आवश्यकता होती है।
यहाँ मेरी है निराशाजनक के लिए परीक्षण सिर्फ अच्छे दोस्त के निष्कर्षों मित्र:
DB स्कीमा:
CREATE TABLE IF NOT EXISTS `friends` (
`id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`friend_id` int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
दोस्तों के मित्र प्रश्न:
(
select friend_id
from friends
where user_id = 1
) union (
select distinct ff.friend_id
from
friends f
join friends ff on ff.user_id = f.friend_id
where f.user_id = 1
)
मैं वास्तव में आपको कम से कम 10k उपयोगकर्ता रिकॉर्ड और उनमें से प्रत्येक के कम से कम 250 मित्र कनेक्शन के साथ कुछ नमूना डेटा बनाने की सलाह देता हूं और फिर इस क्वेरी को चलाऊंगा। मेरी मशीन (i7 4770k, SSD, 16gb RAM) पर उस क्वेरी के लिए परिणाम ~ 0.18 सेकंड था । शायद इसे अनुकूलित किया जा सकता है, मैं डीबी जीनियस नहीं हूं (सुझावों का स्वागत है)। हालाँकि, यदि यह रैखिक है तो आप पहले से ही केवल 100k उपयोगकर्ताओं के लिए 1.8 सेकंड में, 1 मिलियन उपयोगकर्ताओं के लिए 18 सेकंड।
यह अभी भी ~ 100k उपयोगकर्ताओं के लिए ठीक लग सकता है, लेकिन विचार करें कि आपने केवल दोस्तों के दोस्तों को लाया था और किसी भी अधिक जटिल क्वेरी को नहीं किया था जैसे " मुझे केवल दोस्तों के दोस्तों से ही पोस्ट दिखाई दें + अनुमति दें या नहीं तो अनुमति की जांच करें। उनमें से कुछ को देखने के लिए + यह जांचने के लिए एक उप क्वेरी करें कि क्या मुझे उनमें से कोई पसंद आया है "। आप डीबी को चेक करने देना चाहते हैं कि क्या आपको पहले से कोई पोस्ट पसंद आया है या नहीं या आपको कोड में करना होगा। यह भी विचार करें कि यह केवल आपके द्वारा चलाए जाने वाली क्वेरी नहीं है और आपके पास अधिक या कम लोकप्रिय साइट पर एक ही समय में सक्रिय उपयोगकर्ता से अधिक है।
मुझे लगता है कि मेरा जवाब इस सवाल का जवाब देता है कि फेसबुक ने अपने दोस्तों के रिश्ते को बहुत अच्छी तरह से डिजाइन किया है लेकिन मुझे खेद है कि मैं आपको यह नहीं बता सकता कि इसे कैसे लागू किया जाए, यह तेजी से काम करेगा। एक सामाजिक नेटवर्क को लागू करना आसान है लेकिन यह सुनिश्चित करता है कि यह अच्छा प्रदर्शन करता है स्पष्ट रूप से नहीं है - IMHO।
मैंने ओरिएंटबीडी के साथ प्रयोग करना शुरू कर दिया है ताकि ग्राफ़-क्वेरीज़ और मेरे किनारों को अंतर्निहित SQL DB में मैप कर सकूँ। अगर मुझे कभी ऐसा हो जाता है तो मैं इसके बारे में एक लेख लिखूंगा।