क्या किसी को भी एकाधिक कोर पर node.js - socket.io आधारित ऐप को स्केल करने के लिए एक अच्छा समाधान पता है? मैं वर्तमान में socket.io प्रलेखन में प्रस्तुत किए गए समाधान का परीक्षण कर रहा हूं, कई नोड्स पर socket.io का उपयोग करने के लिए, लेकिन एक ठोस सफलता के बिना।स्केल नोड.जेएस [email protected]*.* क्लस्टर और सॉकेट.ओ-रेडिस के साथ हेरोकू
मैंने गिटूब पर इसके लिए एक खेल का मैदान बनाया है: https://github.com/liviuignat/socket.io-clusters जो सॉकेट.ओ साइट से चैट एप्लिकेशन की एक बिट संशोधित प्रति है। यह express
, cluster
, [email protected]
और socket.io-redis
का उपयोग करता है।
वर्तमान में शाखा feature/sticky
में sticky-session
का उपयोग करके एक कार्यान्वयन भी है जो बेहतर काम करता प्रतीत होता है।
अंत में आवेदन को पर प्रकाशित किया जाना चाहिए Heroku, एकाधिक डायनोस पर स्केल किया गया।
शुरू में मैं कुछ इस तरह कर रही tryied - केवल क्लस्टर नोड्स के लिए सर्वर शुरू करने के लिए, लेकिन मैं हमेशा त्रुटि मिलती है: में विफल रहा है: कनेक्शन एक हाथ मिलाना प्रतिक्रिया प्राप्त करने से पहले बंद कर दिया
if (cluster.isMaster) {
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', function(worker, code, signal) {
console.log('worker ' + worker.process.pid + ' died');
});
} else {
var server = new Server({
dirName: __dirname,
enableSocket: true
})
.setupApp()
.setupRoutes()
.start();
}
तो मैं करने की कोशिश की मास्टर नोड्स के लिए भी सर्वर शुरू कर:
if (cluster.isMaster) {
var server = new Server({
dirName: __dirname,
enableSocket: true
})
.setupApp()
.setupRoutes()
.start();
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', function(worker, code, signal) {
console.log('worker ' + worker.process.pid + ' died');
});
} else {
var server = new Server({
dirName: __dirname,
enableSocket: true
})
.setupApp()
.setupRoutes()
.start();
}
मैं भी शाखा feature/sticky
, जो लगता है दोनों में sticky-session
और socket.io-redis
का उपयोग कर इसे करने की कोशिश सफलता के साथ प्रदर्शन करते हैं, लेकिन अभी भी एक अच्छा समाधान हो रहा है नहीं करता है:
if (cluster.isMaster) {
sticky(function() {
var server = new Server({
dirName: __dirname,
enableSocket: true
})
.setupApp()
.setupRoutes();
return server.http;
}).listen(3000, function() {
console.log('server started on 3000 port');
});
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', function(worker, code, signal) {
console.log('worker ' + worker.process.pid + ' died');
});
} else {
sticky(function() {
var server = new Server({
dirName: __dirname,
enableSocket: true
})
.setupApp()
.setupRoutes();
return server.http;
}).listen(3000, function() {
console.log('server started on 3000 port');
});
}
मैं अगले दिनों के लिए और अधिक परीक्षण करना होगा, लेकिन, यह एक बहुत मदद मिलेगी अगर किसी को कुछ विचारों के साथ आ सकता है।
धन्यवाद,
हाय स्टीफन, मैं सफलता के साथ सॉकेट.ओ-रेडिस का उपयोग कर रहा हूं। –
मैंने एक उदाहरण जोड़ा है जो एक परियोजना से लिया गया है जिसे मैंने कुछ समय पहले काम किया था। उस समय चीजें थोड़ा अलग थीं, लेकिन मैंने इसे socket.io> = 1.0 – Steffen
के लिए सॉकेट.ओ-रेडिस का उपयोग करने के लिए अपडेट किया है, ऐसा लगता है कि मैंने इसे एक साधारण सर्वर के साथ काम करने में कामयाब रहा है (देखें: https://github.com/liviuignat/chat-example-cluster/blob/master/index.js)।मैं इसके साथ थोड़ा और खेलूँगा, क्योंकि मेरे मुख्य प्रोजेक्ट में अभी भी समस्याएं हैं। –