2011-06-14 16 views
6

मैं PHP और CodeIgniter का उपयोग कर चैट एप्लिकेशन बनाने के साथ खेल रहा हूं।चैट संदेशों के लिए डेटाबेस बफर के रूप में memcached का उपयोग

इसके लिए, मैं डेटाबेस में लोड को कम करने, स्मृति में सबसे हालिया चैट संदेशों को पकड़ने के लिए memcached के साथ एक कैश 'बफर' कार्यान्वित कर रहा हूं। मुझे क्या करना चाहते हैं यह है:

  1. जब ऐसा संदेश आता है, मैं कुंजी के रूप में वर्तमान मिनट (YYYY-MM-DD-HH-एम एम) का उपयोग memcached में सहेजें। कोई डेटाबेस I/O शामिल नहीं है। विचार यह है कि एक ही मिनट के सभी संदेश एक ही कुंजी के तहत एकत्र किए जाते हैं।
  2. उपयोगकर्ताओं को नए चैट संदेशों को भी memcached से प्राप्त किया जाता है (अब के लिए मैं लंबे मतदान का उपयोग कर रहा हूं, लेकिन यह स्पष्ट प्रदर्शन कारणों से Node.js के तहत WebSockets पर जायेगा)। फिर, कोई डेटाबेस I/O शामिल नहीं है।
  3. एक स्वचालित सर्वर स्क्रिप्ट (cronjob) पिछले 5 मिनट में memcached डेटा एकत्रित करने और डेटाबेस में संदेश डालने, हर 5 मिनट में एक बार चलाएगा।
  4. memcached वस्तुओं 6 मिनट के बाद बासी जाने के लिए तैयार कर रहे हैं, तो हम 5 मिनट प्रति एक डेटाबेस लिखने आपरेशन के लिए कुल

यह स्मृति में संदेश डेटा के अधिक से अधिक 6 मिनट रखने की जरूरत कभी नहीं और शून्य डेटाबेस पढ़ने के संचालन।

क्या यह ध्वनि व्यवहार्य है? क्या इस उद्देश्य के लिए memcached का उपयोग करने के लिए एक बेहतर (शायद यहां तक ​​कि अंतर्निहित?) तरीका है?


अद्यतन: मैं एक छोटे से अब प्रयोग कर रहे हैं, और मैं एक शॉर्टकट (पढ़ें: हैक) के लिए एक विचार है। मैं संदेशों को अस्थायी रूप से Node.js सर्वर स्क्रिप्ट में 'बफर' कर सकता हूं जब तक कि मैं उन्हें स्टोर करने के लिए तैयार न हो। Node.js सर्वर में संदेशों का एक जावास्क्रिप्ट ऑब्जेक्ट/सरणी मूल रूप से एक स्मृति कैश है - प्रकार का।

तो: प्रत्येक एन संदेश/सेकंड, मैं जो भी तरीका चाहता हूं, मैं अपने डेटाबेस में buffered संदेश (जेएस सरणी की सामग्री) को पास कर सकता हूं, क्योंकि इसे अक्सर नहीं कहा जाएगा।

हालांकि, मुझे चिंता है कि यह नोड.जेएस सर्वर प्रक्रिया को अपंग कर सकता है, क्योंकि शायद यह 200 केबी सरणी के आसपास ले जाने का आनंद नहीं लेगा।

इस रणनीति पर कोई विचार? क्या यह पूरी तरह से पागल है?

+0

टेक्नोलॉजीज इन्हें देखने के लिए: कॉमेट और एरलांग/जैबर (फेसबुक इनका उपयोग करें) या: एचटीएमएल 5 और वेब सॉकेट (फ्लैश सॉकेट फ़ॉलबैक के साथ - इनके लिए Google) –

उत्तर

2

INSERT DELAYED का उपयोग क्यों नहीं करते? यह आपको लगभग उसी कार्यक्षमता की पेशकश करता है जिसे आप memcached की आवश्यकता के बिना हासिल करने की कोशिश कर रहे हैं।

वैसे भी आपका समाधान भी अच्छा दिखता है।

+0

दिलचस्प विचार। मुझे वास्तव में इसका विचार पसंद नहीं है, क्योंकि ऐसा लगता है कि एसक्यूएल सर्वर को बल देने के लिए मजबूर होना प्रतीत होता है कि यह ठीक से चबाएगा (प्रति सेकंड 100 आवेषण तक स्केल किया जाएगा), लेकिन यह वास्तव में –

+0

@ जेन्स काम कर सकता है: यह उम्मीद नहीं है।इंसर्ट डेलेड विशेष रूप से इस मामले के लिए बनाए जाते हैं। – dynamic

+0

लेकिन अगर मेरे node.js उदाहरण को 100 संदेश/सेकंड प्राप्त होते हैं और इसे प्रत्येक के लिए SQL सर्वर पर एक INSERT DELAYED कथन जारी करने की आवश्यकता है, तो उसे डेटाबेस सर्वर से 100 कनेक्शन स्थापित नहीं करना पड़ेगा? जब तक मैं node.dbslayer.js का उपयोग कर उस पर शीर्ष पर कनेक्शन पूलिंग नहीं कर सकता। –

3

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

+1

वेबसाकेट लक्ष्य हैं, यकीन है, लेकिन वे अभी तक अधिकांश ब्राउज़रों में उपलब्ध नहीं हैं , इसलिए अब मैं सॉकेट.आईओ का उपयोग करूँगा (जो उपलब्ध होने पर वेबसाकेट का उपयोग करता है लेकिन कई फॉलबैक तंत्र हैं) –

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

  • कोई संबंधित समस्या नहीं^_^