2011-09-20 14 views
5

मैं वास्तव में सामान्य चैट ऐप के बारे में बात नहीं कर रहा हूं, बल्कि विशेष रूप से चैटरूम कार्यान्वयन के बारे में बात कर रहा हूं।चर्चा: node.js/socket.io के साथ चैट रूम को लागू करने का सबसे अच्छा तरीका?

तो में Node.js/socket.io, मैं दो दृष्टिकोण

  1. सरणी में सभी उपयोगकर्ताओं के लिए प्रत्येक चैटरूम के लिए एक सरणी, प्रसारण संदेश बनाएँ

  2. प्रसारण सभी के लिए सभी संदेशों के बारे में सोचा उपयोगकर्ता, ग्राहकों के पीसी पर निर्धारित करते हैं कि वे चैट रूम में हैं, यदि हां, तो संदेश स्वीकार करें।

1 में कमजोरी है कि अंततः के रूप में आप पैमाने आप सरणी वस्तुओं के साथ सर्वर की स्मृति बाढ़ जाएगा, और मैं अपने होस्टिंग पर 80mb के बारे में केवल का उपयोग कर रहा है।

2 में कमजोरी यह है कि सभी को प्रसारण करना महंगा है और ग्राहकों की मशीनों में बाढ़ से उन्हें खुश नहीं किया जाएगा।

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

http://davidgranado.com/demos/chat_shuffle/

आप कई खिड़कियां खोलने और अपने आप के साथ बातचीत कर के बाद से प्रत्येक उदाहरण के एक व्यक्ति माना जाता है (यह मेरी पहली नोड अनुप्रयोग है) द्वारा इसे बाहर का परीक्षण कर सकते हैं:

+0

आप चैटरूम का एक बहुत बना सकते हैं। आपके सरणी केवल उपयोगकर्ता की आईडी को पकड़ने की आवश्यकता है। क्या आपने कोई मेमोरी खपत परीक्षण चलाया? – user123444555621

+0

हमने एक कार्यशील [बहु-कक्ष चैटरूम] बनाया है (https://github.com/Raynos/so642)। यह खुला स्रोत है, देखने के लिए स्वतंत्र महसूस करें। – Raynos

+0

@ pumbaa80 सच है, लेकिन 80 एमबी कई अन्य प्रक्रियाओं या क्रॉन नौकरियों को चलाने के बाद 20-30 एमबी की तरह बन जाता है, साथ ही मुझे नहीं लगता कि यह स्केल करने का एक अच्छा तरीका है क्योंकि स्मृति महंगा है ... – Derek

उत्तर

1

मैं यहाँ कुछ इसी तरह की थी।

जिस तरह से यह काम करता है यह है कि प्रत्येक व्यक्ति को बातचीत के लिए किसी अन्य व्यक्ति के साथ जोड़ा जाता है। प्रभावी रूप से, हर कोई दो व्यक्ति कमरे में है।

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

+1

तो कहें कि आपके पास व्यक्ति 1, व्यक्ति 2, व्यक्ति 3 है, सर्वर उन्हें सभी संदेश भेजने के बारे में कैसे जानता/पता है कि वे चैट रूम में हैं जो उन्हें मेरे दृष्टिकोण 1 में चैट रूम में समूहित करने के लिए एक सरणी घोषित किए बिना हैं? – Derek

+0

मुझे लगता है कि इस समय मेरा दिमाग तेज नहीं है जैसा मैंने सोचा था। यह मूल रूप से एक ही बात है। फिलहाल, मैं एक सरणी का उपयोग नहीं करता क्योंकि यह केवल उनमें से दो है। लेकिन विचार को विस्तारित करने के लिए, चैट रूम के लिए एक सरणी सही होगी, यह जानने के लिए कि किसके प्रसारण करना है। –

5

रूप Socket.IO 0.7+ एक कमरे अवधारणा को पेश किया है। यह शायद वह चीज है जिसे आप ढूंढ रहे हैं।

io.sockets.on('connection', function (socket) { 
    socket.join('room name'); 

    // broadcast the message to everybody in the room 
    socket.on('chat message', function (data) { 
    socket.broadcast.to('room name').emit('chat message', data); 
    }); 

    socket.on('leave room', function (room) { 
    socket.leave(room); 
    }); 
}); 

तो विशिष्ट कमरे के लिए उपयोगकर्ताओं के साथ अपने स्वयं सरणी का प्रबंधन करने की कोई जरूरत नहीं, socket.io में इस बिल्ड है। 80MB के साथ

+0

को यह नहीं पता था, मैं देखता हूं कि वे socket.join() फ़ंक्शन को कैसे कार्यान्वित करते हैं। लेकिन सबसे पहले, socket.io दस्तावेज कहां स्थित हैं? – Derek

+0

रीडमी की: https://github.com/learnboost/socket.io https://github.com/learnboost/socket.io-client साइट http://socket.io/ और विकी https://github.com/learnboost/socket.io/wiki – 3rdEden

+0

मैंने एक [मल्टीरूम चैट का सरल डेमो] तैयार किया है (https://github.com/jgonera/socket.io-multichat) सॉकेट.आईओ के कमरे का उपयोग कर। यह एक बेंचमार्क के साथ आता है जो आपको यह जांचने देता है कि यह कितना तेज़ हो सकता है। –