2014-10-15 9 views
5

काम नहीं कर रहा है मुझे अपने आवेदन को नोड.जेएस, सॉकेट.ओ और नोड.जेएस क्लस्टर्स के साथ क्लस्टर करने में समस्या है।नोड.जेएस, सॉकेट.आईओ और क्लस्टर में वेबसॉकेट हैंडशेक

मैं सभी कर्मचारियों के लिए जानकारी साझा करने के लिए socket.io-redis का उपयोग कर रहा हूं, लेकिन काम नहीं कर रहा हूं।

मेरे कोड:

var cluster = require('cluster'); 
var numCPUs = require('os').cpus().length; 

if (cluster.isMaster) { 
    // Fork workers. 
    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 express = require("express"); 
     //Server 
     var server = express(); 
     //Socket.io 
     var http = require('http').Server(server); 
     var io = require('socket.io')(http); 
     var redis_io = require('socket.io-redis'); 
     var redis = require("redis"); 

     io.adapter(redis_io({host: "127.0.0.1", port: 6379 })); 

    ... 
} 

क्लाइंट में, मैं 400 त्रुटि की तरह हाथ मिलाना में त्रुटियों या WebSocket से पहले कनेक्शन स्थापित हो जाने से बंद है।

इसे हल करने के लिए मैं क्या कर सकता हूं?

इम Node.js के पिछले संस्करण और socket.io

धन्यवाद का उपयोग कर!

उत्तर

15

मुझे यह वही समस्या थी और इसे समझने में मुझे कुछ समय लगा। कुछ शोधों ने समझाया कि ऐसा इसलिए है क्योंकि कुछ मतदान, जैसे लंबी मतदान, इष्टतम कनेक्शन स्थापित करने के लिए कई अनुरोध करने की आवश्यकता है। अनुरोधों पर राज्य आयोजित किया जाता है, इसलिए यदि अलग-अलग क्लस्टर श्रमिकों को लगातार विभिन्न अनुरोध भेजे जाते हैं, तो कनेक्शन विफल हो जाता है।

http://socket.io/docs/using-multiple-nodes/ जो एक कस्टम cluster मॉड्यूल sticky-session कहा जाता है जो इस के आसपास काम करता है का हवाला देते पर इसके बारे में एक पृष्ठ है: https://github.com/indutny/sticky-session

मैं वास्तव में के बाद से है कि मूल रूप से सब काम Node.js टीम पर ध्यान नहीं देता इसका इस्तेमाल नहीं करना चाहता था क्लस्टर मॉड्यूल के पीछे टीसीपी लोड संतुलन में निवेश कर रहा है।

चूंकि वेब सॉकेट प्रोटोकॉल को केवल एक कनेक्शन की आवश्यकता है, इसलिए मैं websocket को पहले और एकमात्र परिवहन के लिए मजबूर कर इस पर काम करने में सक्षम था। मैं ऐसा इसलिए कर सकता हूं क्योंकि मैं क्लाइंट और सर्वर को नियंत्रित करता हूं। सार्वजनिक वेब पेज के लिए, यह आपके लिए सुरक्षित नहीं हो सकता है क्योंकि आपको ब्राउज़र संगतता के बारे में चिंता करने की ज़रूरत है। मेरे मामले में, ग्राहक एक मोबाइल ऐप है।

यहाँ जावास्क्रिप्ट ग्राहक कोड अपने परीक्षण पृष्ठ में डाल दिया है (फिर से, वास्तविक ग्राहक एक मोबाइल एप्लिकेशन है, इसलिए अपने वेब पेज यहाँ वास्तव में सिर्फ एक मदद करने के लिए निर्माण और परीक्षण सहायता है):

var socket = io('http://localhost:8080/', { 
    transports: [ 'websocket' ] 
}); 
+0

ब्रैंडन, धन्यवाद !!! आपका समाधान सबसे अच्छा है! –

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