2010-05-29 12 views
14

मैं एक प्रोजेक्ट शुरू कर रहा हूं जो मुझे लगता है कि यह गति और स्केलेबिलिटी के कारण विशेष रूप से मोंगोडीबी के लिए उपयुक्त होगा।मोंगोडीबी स्कीमा डिज़ाइन - रीयल-टाइम चैट

जिस मॉड्यूल में मैं वर्तमान में रूचि रखता हूं वह रीयल-टाइम चैट के साथ करना है। अगर मैं एक पारंपरिक RDBMS में यह करने के लिए था कि मैं इसे बाहर विभाजित था में:

  • चैनल (एक चैनल कई उपयोगकर्ताओं है)
  • उपयोगकर्ता (एक उपयोगकर्ता एक चैनल है, लेकिन कई संदेश हैं)
  • संदेश (एक संदेश में उपयोगकर्ता है)

इस उपयोग के मामले का उद्देश्य, मैं यह मानना ​​चाहता हूं कि आम तौर पर 5 चैनल सक्रिय होंगे, प्रत्येक सेकेंड में अधिकतम 5 संदेश होंगे।

विशिष्ट प्रश्नों तेजी से होने की जरूरत है कि:

  • नया संदेश प्राप्त करें
  • एक चैनल के लिए एक संदेश
  • सत्यापित करें पोस्ट (, एक बुकमार्क के आधार पर समय स्टाम्प शायद, या एक incrementing काउंटर?) एक उपयोगकर्ता एक चैनल ध्यान रखें कि MongoDB साथ दस्तावेज़ सीमा 4MB है में

असर, तुम कैसे स्कीमा को डिजाइन करने के बारे में जाना होगा में पोस्ट कर सकते हैं कि? तुम्हारा क्या दिखता है? क्या कोई गठिया है जिसके लिए मुझे देखना चाहिए?

उत्तर

3

मैंने Redis, एनजीआईएनएक्स & मेरे चैट प्रोजेक्ट के लिए PHP-FPM का उपयोग किया। सुपर सुरुचिपूर्ण नहीं है, लेकिन यह चाल है। पहेली के लिए कुछ टुकड़े हैं।

  1. एक बहुत ही सरल PHP स्क्रिप्ट है जो क्लाइंट कमांड प्राप्त करती है और उन्हें एक विशाल सूची में रखती है। यह सभी कमरे LISTs और उपयोगकर्ताओं को निजी सूची भी देखता है यह देखने के लिए कि क्या संदेश वितरित किए जाने चाहिए। यह jQuery & में लिखे गए क्लाइंट द्वारा मतदान किया जाता है, यह हर कुछ सेकंड में किया जाता है।

  2. एक कमांड लाइन PHP स्क्रिप्ट है जो एक अनंत लूप में सर्वर पक्ष संचालित करती है, प्रति सेकंड 20 बार, जो इस सूची को जांचती है और फिर इन आदेशों को संसाधित करती है। स्क्रिप्ट हैंडल करता है जो स्क्रिप्ट्स मेमोरी में किस कमरे और अनुमतियों में है, यह जानकारी रेडिस में संग्रहीत नहीं है।

  3. रेडिस प्रत्येक कमरे के लिए एक सूची है & प्रत्येक उपयोगकर्ता के लिए एक सूची जो एक निजी कतार के रूप में संचालित होती है। इसमें उपयोगकर्ता के प्रत्येक कमरे के लिए कई काउंटर भी हैं। यदि उपयोगकर्ता काउंटर कमरे में कुल संदेशों से कम है, तो यह अंतर प्राप्त करता है और इसे उपयोगकर्ता को भेजता है।

मैं परीक्षण इस समाधान पर जोर देने में नहीं कर पाए हैं, लेकिन मेरी बुनियादी बेंच मार्किंग से कम से कम यह शायद प्रति सेकंड संदेशों के कई हजारों संभाल सकता था। प्रदर्शन को बढ़ाने के लिए Node.js जैसे कुछ को बंद करने का अवसर भी है। रेडिस भी परिपक्व है और इसमें कुछ दिलचस्प विशेषताएं हैं जैसे पब/सब्सक्राइब कमांड, जो कि ब्याज की हो सकती हैं, जो संभावित रूप से सर्वर पक्ष पर मतदान को हटा देंगी।

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

मुझे लगता है कि आप मोंगोडीबी के साथ कुछ ऐसा कर सकते हैं। प्रति कमरा एक संग्रह, उपयोगकर्ता प्रति संग्रह & फिर एक संग्रह जो काउंटर बनाए रखता है। मैंगिंग को संभालने के लिए आपको अभी भी बैक-एंड डिमन या स्क्रिप्ट लिखनी होगी जहां ये संदेश जाएंगे। आप मोंगोडीबी के "सीमित संग्रह" का भी उपयोग कर सकते हैं, जो & सॉर्ट किए गए दस्तावेज़ों को स्वचालित रूप से पुराने संदेशों को साफ़ करता है, लेकिन यह उचित काउंटर बनाए रखने में जटिल हो सकता है।

3

मैसेजिंग सिस्टम के लिए मोंगो का उपयोग क्यों करें? इससे कोई फर्क नहीं पड़ता कि स्थैतिक स्टोर कितनी तेजी से है (और मोंगो बहुत तेज़ है), चाहे मोंगो या डीबी, एक संदेश कतार की नकल करने के लिए आपको कुछ प्रकार के मतदान का उपयोग करना होगा, जो बहुत स्केलेबल या कुशल नहीं है। माना जाता है कि आप कुछ भी गहन नहीं कर रहे हैं, लेकिन सही नौकरी के लिए सही उपकरण का उपयोग क्यों न करें? Rabbit या ActiveMQ जैसे मैसेजिंग सिस्टम का उपयोग करें।

यदि आपको मोंगो का उपयोग करना होगा (शायद आप इसके साथ खेलना चाहते हैं और यह प्रोजेक्ट ऐसा करने का एक अच्छा मौका है?) मुझे लगता है कि आपके पास उपयोगकर्ताओं के लिए एक संग्रह होगा (जहां प्रत्येक उपयोगकर्ता ऑब्जेक्ट की एक सूची है कतार जो उपयोगकर्ता सुनता है)। संदेशों के लिए, आप प्रत्येक कतार के लिए एक संग्रह प्राप्त कर सकते हैं, लेकिन फिर आपको संदेशों के लिए रुचि रखने वाली प्रत्येक कतार को मतदान करना होगा। एक कतार के रूप में एक संग्रह होना बेहतर होगा, क्योंकि एक संग्रह पर "इन" प्रश्नों को करने के लिए मोंगो में आसान है, इसलिए ऐसी चीजों को करना आसान होगा जैसे "किसी भी कतार में एक्स से नए संदेश प्राप्त करें जहां कतार सूची में नाम [ए, बी, सी] "।

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

+1

मैं यह सुझाव नहीं दूंगा कि वहां के एमक्यू समाधान वास्तव में वहां कुछ नोएसक्यूएल समाधानों की तुलना में काफी बेहतर हैं। बहुत सी एमक्यू तकनीक जटिल और अधिक इंजीनियर लगती है, साथ ही प्रदर्शन हमेशा महान नहीं होता है, स्थिरता और पोर्टेबिलिटी का भी त्याग किया जा सकता है। देखें: http://bhavin.directi.com/rabbitmq-vs-apache-activemq-vs-apache-qpid/ – Klinky

+1

वहाँ सभ्य एमक्यू समाधान हैं, मुझे लगता है कि वे सुविधाओं के रास्ते में बहुत अधिक हैं , ज़ीरोएमक्यू और केस्ट्रल दोनों अपने उद्देश्यों के लिए अच्छे हैं। दूसरी तरफ ActiveMQ भयानक है। – Michael

+0

@ क्लिंकी मैं शर्त लगाता हूं कि लगभग किसी भी विशिष्ट एमक्यू समाधान (विशेष रूप से एक्टिवएमक्यू) एक अनिर्दिष्ट प्रकार के नोएसक्यूएल के आधार पर कस्टम समाधान की तुलना में मैसेजिंग (ईडीए) समस्या के समय से बेहतर होगा (क्या आपका मतलब दस्तावेज़-उन्मुख डीबी या कुंजी है -वैल स्टोर या क्या?), क्योंकि एमक्यू समाधान उस समस्या के लिए डिज़ाइन किए गए हैं, और, एफटीएन एक्टिवएमक्यू कतार दृढ़ता के लिए अपने स्वयं के अनुकूलित उच्च-प्रदर्शन डेटा स्टोरेज का उपयोग करता है। –

1

1) ape-project.org

2) http://code.google.com/p/redis/

3) के बाद आप इस सब के माध्यम से कर रहे हैं - आप लगातार डेटा के रूप में (उपयोगकर्ता, चैनल) प्रवेश के लिए MongoDB में गूंगा डेटा स्टोर कर सकते हैं और अच्छी तरह से

संबंधित मुद्दे