mysql - Event feed implementation - will it scale? -


स्थिति:

मैं वर्तमान में एक सामाजिक के लिए एक फ़ीड सिस्टम तैयार कर रहा हूं वेबसाइट जिसमें प्रत्येक उपयोगकर्ता के पास अपने मित्रों की गतिविधियों का फ़ीड होता है फीड को कैसे उत्पन्न करने के लिए मेरे पास दो संभावित तरीके हैं और मैं पूछना चाहता हूं कि पैमाने की क्षमता के मामले में सबसे अच्छा क्या है।

सभी उपयोगकर्ताओं से ईवेंट एक केंद्रीय डेटाबेस तालिका में एकत्रित किए जाते हैं, event_log < / code>। उपयोगकर्ताओं को तालिका <मित्र> दोस्त में मित्र के रूप में रखा जाता है हमारे द्वारा उपयोग किए जा रहे RDBMS, MySQL है।

मानक विधि: जब कोई उपयोगकर्ता अपने फ़ीड पृष्ठ का अनुरोध करता है, सिस्टम आंतरिक कोडिंग event_log के साथ फ़ीड उत्पन्न करता है मित्र । नतीजा तब कैश्ड होता है और 5 मिनट के बाद टाइमआउट पर सेट होता है। इस टाइमआउट को बदलकर स्केलिंग हासिल की जाती है।

हाइपोसिलेटेड विधि: एक कार्य पृष्ठभूमि में चलता है और event_log में प्रत्येक नए, अप्रसारित आइटम के लिए चलता है डेटाबेस तालिका में प्रविष्टियां user_feed उस ईवेंट को उन सभी उपयोगकर्ताओं के साथ जोड़ती हैं जो इस घटना को शुरू करने वाले उपयोगकर्ता के साथ दोस्त हैं। एक तालिका पंक्ति जोड़े एक उपयोगकर्ता के साथ एक घटना।

मानक विधि के साथ समस्याओं को अच्छी तरह से जाना जाता है - क्या होगा अगर बहुत से लोगों की कैश एक ही समय में समाप्त हो जाए? समाधान भी ठीक नहीं है - यथासंभव वास्तविक समय के करीब अद्यतन करने के लिए फ़ीड के लिए संक्षिप्त है

मेरी आँखों में अनुमानित समाधान बहुत बेहतर लगता है; सभी प्रसंस्करण ऑफ़लाइन किया जाता है इसलिए कोई भी उपयोगकर्ता पृष्ठ के लिए इंतजार नहीं करता है और इसमें कोई जुड़ना नहीं है ताकि भौतिक मशीनों में डाटाबेस तालिकाओं को ढंक दिया जा सके। हालांकि, यदि किसी उपयोगकर्ता के पास 100,000 दोस्त हैं और एक सत्र में 20 ईवेंट बनाता है, तो इसका परिणाम डेटाबेस में 2,000,000 पंक्तियों को सम्मिलित करता है।

प्रश्न:

प्रश्न दो बिंदुओं के लिए उबाल हो जाता है:

  • क्या यह सबसे बुरी स्थिति है जो समस्याग्रस्त ऊपर वर्णित है, यानी तालिका आकार का MySQL प्रदर्शन पर असर होता है और क्या इस द्रव्यमान के लिए डेटा को डालने के लिए कोई समस्या है प्रत्येक घटना?
  • क्या मुझे कुछ भी याद नहीं आ रहा है?

<पी > मुझे लगता है कि आपकी पूर्वकल्पना प्रणाली बहुत अधिक डेटा उत्पन्न करती है; सबसे पहले वैश्विक स्तर पर भंडारण और यूजर_फीड पर अनुक्रमित आवश्यकताओं को तेजी से बढ़ाना लगता है क्योंकि आपके यूज़र-बेस बड़े और अधिक इंटरकनेक्टेड होते हैं (दोनों एक सोशल नेटवर्क के लिए संभवत: वांछनीय); दूसरी बात पर विचार करें कि एक मिनट के 1000 उपयोगकर्ता प्रत्येक नए संदेश में प्रवेश करते हैं और प्रत्येक के पास 100 दोस्त हैं - तो आपके पृष्ठभूमि थ्रेड में 100 000 आवेषण होते हैं और जल्दी से पीछे पड़ सकते हैं।

मुझे आश्चर्य है कि कोई समझौता आपके दो प्रस्तावित समाधानों के बीच किया जा सकता है जहां एक पृष्ठभूमि थ्रेड एक तालिका अंतिम_युजर_फीड_अपडेट में अद्यतन करता है जिसमें प्रत्येक उपयोगकर्ता के लिए एक पंक्ति और आखिरी बार उपयोगकर्ताओं फ़ीड बदल जाने के लिए टाइमस्टैम्प शामिल होता है।

फ़ीड को रीफ्रेश करने के लिए क्वेरी की आवश्यकता होगी, अंतिम_जैसे_फीड तालिका के लिए एक त्वरित क्वेरी बताएगा कि क्या ताज़ा करने की आवश्यकता है या नहीं ऐसा लगता है कि आपकी मानक विधि के साथ सबसे बड़ी समस्याएं कम करने के साथ-साथ स्टोरेज आकार की कठिनाइयों से बचें, लेकिन उस पृष्ठभूमि थ्रेड में अभी भी बहुत कुछ करना है।


Comments