2011-03-24 17 views
7

पर सर्वर द्वारा भेजे गए ईवेंट मैं वास्तव में एक वेब-एप्लिकेशन बनाने की कोशिश कर रहा हूं जो Server-Sent Events draft का उपयोग करेगा। मेरे ज्ञान से, एसएसई प्रति कनेक्शन एक थ्रेड का उपयोग करते हैं, और चूंकि सर्वर लगातार क्लाइंट को डेटा पंप करने जा रहा है, बिना किसी सेकेंड के निष्क्रिय होने के बावजूद, मैं धागे को पूल में वापस नहीं रख पाऊंगा।नोड.जेएस

इसलिए मैं सर्वर से कनेक्शन को संभालने के लिए नोड.जेएस (जिसे मैंने आज तक उपयोग नहीं किया है) का उपयोग करने की कोशिश कर रहा हूं। मैं HTML5 Rocks introduction to SSE के माध्यम से रहा हूं और नोड.जेएस के साथ एसएसई को एकीकृत करने वाला एक कोड नमूना है।

हालांकि, मैं उलझन में हूं कि नोड.जेएस हजारों क्लाइंट कनेक्शन को एक साथ संभाल लेगा और सर्वर को अपाचे सर्वर से अधिक कुशलता से उपयोग करेगा? क्या कोई मुझे यह समझने में मदद कर सकता है कि वास्तव में नोड कैसे कार्य करेगा?

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

+0

यदि आपके पास नहीं, तो इस परिचय वीडियो देखने के (हाँ यह लंबे समय से है, लेकिन यह अच्छा है) http://www.yuiblog.com/blog/2010/05/20/वीडियो-डाहल/ – generalhenry

+0

आप जानते हैं कि आईई और एफएफ इस विधि के लिए सही नहीं हैं? –

+0

@generalhenry - लिंक के लिए धन्यवाद। इसे जांच लेंगे। – 0xff0000

उत्तर

4

php:

do { 
    sendMsg($startedAt , time()); 
    sleep(5); 
} while(true); 

बनाम

setInterval(function() { 
    constructSSE(res, id, (new Date()).toLocaleTimeString()); 
}, 5000); 

अंतर यह नींद ब्लॉक php धागा 5 सेकंड Node.js। उन 5 सेकंड के दौरान सर्वर को समर्पित धागा पूरी तरह से कुछ भी करने की आवश्यकता नहीं है। प्रति उपयोगकर्ता एक धागा।

node.js संस्करण के साथ setInterval धागे को अवरुद्ध नहीं करता है। एक node.js धागा सभी उपयोगकर्ताओं को संभाल सकता है।

+0

इसे अपने अंतिम वाक्य के साथ साफ़ करने के लिए धन्यवाद। यही वह है जिसे मैं ढूंढ रहा था। तो अगर मैं इस हैंडलिंग को और अनुकूलित करना चाहता हूं और कहें कि नोड। जेएस 20k + समवर्ती कनेक्शन हैंडल करें, तो मुझे क्या करना होगा? शायद मुझे यह पूछना चाहिए कि एक अलग सेक्शन – 0xff0000

+0

कुंजी यह सुनिश्चित कर रही है कि गणना नोड के साथ गड़बड़ नहीं हो रही है, एक बुरा जबकि लूप काम को गम करेगा। – generalhenry

2

हालांकि, मैं करने के लिए है कि क्या Node.js ग्राहक कनेक्शन के हजारों समवर्ती संभाल लेंगे और और अधिक कुशलता से सर्वर का उपयोग एक अपाचे सर्वर से के रूप में उलझन में हूँ? क्या कोई मदद कर सकता है मुझे समझ में आता है कि कैसे नोड यहां कार्य करेगा?

मुझे लगता है कि आपको ईवेंट-लूप के बारे में बेहतर समझने के लिए Understanding event loops and writing great code for Node.js पढ़ना चाहिए। Node.js में कुछ भी अवरुद्ध नहीं है जो आपको सीपीयू-चक्रों को बचाएगा।

भी TJ's ebook आपको घटनाओं को समझने में मदद कर सकता है। जब कुछ होता है तो उस घटना से जुड़े आपके कॉलबैक को बुलाया जाएगा।

+0

लिंक के लिए बहुत बहुत धन्यवाद। हालांकि, जब मैं सर्वर-प्रेषित घटनाओं को वितरित करने के लिए नोड.जेएस का उपयोग कर रहा हूं, तो मुझे कुछ स्पष्ट पाइपिंग कोड को नोड.जेएस में लिखने की आवश्यकता है या क्या यह स्वचालित रूप से कुछ हद तक ऐसा करेगा? – 0xff0000

+0

आपको अपने संदेशों को स्टोर करने के लिए शायद डेटास्टोर (रेडिस) का उपयोग करना चाहिए। रेडिस से पबब सेमिनेंटिक्स भी बहुत शक्तिशाली हैं। मैं आपको सॉकेट.ओओ पर एक नज़र डालने की सलाह भी दूंगा जो कि बहुत शक्तिशाली है। – Alfred

3

समवर्ती कनेक्शन के संबंध में Understanding the node.js event loop आलेख देखने का प्रयास करें। मैं एक वेब एप्लिकेशन बनाने की अनुशंसा करता हूं जो वेबस्केट्स का उपयोग करता है बल्कि सर्वर से भेजे गए ईवेंट का कारण बनता है क्योंकि एसएसई वेबस्केट्स की तुलना में ब्राउज़र द्वारा कम समर्थित हैं। इसके अलावा गिटहब में स्रोत कोड वाले नोड.जेएस मॉड्यूल आधारित वेबस्केट्स हैं जो आपको "प्रेरित" कर सकते हैं।

+0

वह और socket.io यह ध्यान में रखना आसान बनाता है कि ब्राउज़र किस परिवहन का समर्थन करता है क्योंकि यह सूचकांक के लिए धन्यवाद i6 – generalhenry

+0

में सॉकेट का अनुकरण कर सकता है। मैं मूल्यवान बैंडविड्थ को सहेजने वाले सर्वर-प्रेषित घटनाओं की लाइनों पर और सोच रहा था क्योंकि यह केवल एक अनुरोध स्वीकार कर रहा है और उसके बाद लगातार डेटा को धक्का दे रहा है। – 0xff0000

1

express + connect-sse उपयोग करके देखें:

var sse, express, app; 

sse = require('connect-sse')(); 
express = require('express') 

app = express() 
app.get('/events', sse, function (req, res) { 
    res.json("this is an event"); 
    res.json({here: "is", another: "event"}); 
}); 
संबंधित मुद्दे