2012-04-19 9 views
9

मैं नोड.जेएस के लिए काफी नया हूं और मेरे पास ऐसे एप्लिकेशन के लिए अनुरोध है जो यूडीपी पैकेट का पेलोड प्राप्त करेगा और इसे संसाधित करेगा।एक बहुत तेज़ node.js कैसे स्थापित करें यूडीपी सर्वर

मैं प्रति सेकंड 400 से अधिक संदेशों के बारे में बात कर रहा हूं, जो 200,000 संदेश/मिनट की तरह कुछ पहुंच जाएगा।

मैंने एक यूडीपी सर्वर स्थापित करने के लिए एक कोड लिखा है (वास्तव में http://nodejs.org/api/all.html#all_udp_datagram_sockets दस्तावेज़ों से पकड़ा गया है) लेकिन यह लगभग 5% पैकेट खो रहा है।

मुझे वास्तव में विकसित करने की आवश्यकता है जो एक सर्वर है जो पैकेट प्राप्त करेगा और उसे कार्यकर्ता संदेश के साथ नौकरी भेजें। लेकिन लगता है कि node.js में थ्रेडिंग एक दुःस्वप्न है।

यह मेरा मूल है है के रूप में:

var dgram = require("dgram"); 
var fs = require("fs"); 
var stream = fs.createWriteStream("received.json",{ flags: 'w', 
    encoding: "utf8", 
    mode: 0666 }); 

var server = dgram.createSocket("udp4"); 
server.on("message", function (msg, rinfo) { 
    console.log("server got: " + msg + " from " + 
    rinfo.address + ":" + rinfo.port); 
    stream.write(msg); 
}); 

server.on("listening", function() { 
    var address = server.address(); 
    console.log("server listening " + 
     address.address + ":" + address.port); 
}); 

server.bind(41234); 
// server listening 0.0.0.0:41234 
+2

याद रखें कि टीसीपी सॉकेट के विपरीत डेटाग्राम, गारेंटेड रसीद नहीं हैं। इसके बजाए, व्यक्तिगत संदेश स्वीकार किए बिना, डेटाग्राम गति पर ध्यान केंद्रित करते हैं। – skeggse

+0

यह ऐसी चीजें हैं जिसने मुझे गो पर स्विच किया और कभी पीछे नहीं देखा। –

+0

@AParacha कृपया विस्तृत करें, मैं सुन रहा हूं: डी –

उत्तर

2

आप अवधारणाओं याद कर रहे हैं, NodeJS की आप मतलब है, अनुरोध एक चक्र में संभाला जाना चाहिए संदर्भ में बहु धागा होना नहीं है। कोई अन्य धागा मौजूद नहीं है इसलिए कोई संदर्भ-स्विच नहीं होता है। बहु-कोर वातावरण में, आप नोड के क्लस्टर मॉड्यूल के माध्यम से क्लस्टर बना सकते हैं, मेरे पास इस here के बारे में ब्लॉग-पोस्ट है।

आप पैरेंट प्रक्रियाओं को फोर्क बाल प्रक्रियाओं में सेट करते हैं, और केवल बाल प्रक्रियाओं को बंदरगाह से बांधना चाहिए। आपके माता-पिता की प्रक्रिया बच्चों के बीच लोड संतुलन को संभालेगी।

नोट: अपने ब्लॉग पोस्ट में, मैं i < os.cpus().length/2; बनाया लेकिन यह i < os.cpus().length;

+0

मुझे खेद है, मुझे लगता है कि मैंने मुझे काफी अच्छी तरह से समझाया नहीं है, लेकिन बात यह है कि: यूडीपी क्लाइंट के रूप में मैं एक सेकंड में 10k यूडीपी पैकेट भेज सकता हूं, लेकिन स्थानीयहोस्ट वातावरण में स्थानीयहोस्ट में यूडीपी सर्वर लगभग 5% गुम है। वैसे भी, मेरा सर्वर पहले से ही काफी उत्तरदायी है, यह 1000 से अधिक (1 केबी) संदेश/सेकंड का जवाब दे रहा है जो मेरे लिए पर्याप्त है। – Panthro

+0

आपने लिखा है "मुझे वास्तव में विकसित करने की ज़रूरत है एक ऐसा सर्वर है जो पैकेट प्राप्त करेगा और उसे किसी अन्य कार्यकर्ता को संदेश के साथ नौकरी भेज देगा।", लेकिन मुझे लगता है कि आप 5% त्रुटि दर को कम करना चाहते हैं? क्या आप अपना प्रश्न दोबारा लिख ​​सकते हैं? – Mustafa

0

होना चाहिए मैं एक ऐसी ही संरचना के साथ एक साबुन/xml अग्रेषण सेवा ने लिखा है, और पाया कि जानकारी 2 पैकेट में आएगा। मुझे संदेश के 2 हिस्सों का पता लगाने और उन्हें एक साथ वापस रखने के लिए अपना कोड अपडेट करने की आवश्यकता थी। यह पेलोड आकार की चीज़ एक udp समस्या से अधिक HTTP समस्या हो सकती है, लेकिन मेरा सुझाव यह है कि आप जो कुछ भी प्राप्त कर रहे हैं उसे लिखने के लिए लॉगिंग जोड़ते हैं और फिर इसे दांत दांत के साथ ले जाते हैं। ऐसा लगता है कि आप जो भी प्राप्त कर रहे हैं उसे लॉगिंग करेंगे, लेकिन आपको खोने वाले 5% में खोदना पड़ सकता है।

आप इसे 5% कैसे जानते हैं? यदि आप फिर से यातायात भेजते हैं, तो यह हमेशा 5% होगा? वही संदेश हमेशा खो जाते हैं।

मैंने रूबी और इवेंट मशीन का उपयोग करके वीओआईपी/एसआईपी कॉल डेटा के लिए यूडीपी सर्वर बनाया, और अब तक चीजें अच्छी तरह से काम कर रही हैं। (मैं आपके परीक्षण दृष्टिकोण के बारे में उत्सुक हूं, हालांकि, मैं नेटकैट, या एक छोटे रूबी क्लाइंट पर सबकुछ कर रहा था, मैंने कभी 10k संदेश नहीं किए थे)

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