2013-04-09 3 views
10

ओएस एक्स 10.8.3सॉकेट बंद हो प्रतीत नहीं होते हैं का उपयोग करते समय Node.js http.get

नोड 0.10.0

मैं के अनुरोध करने की 'http' मॉड्यूल का उपयोग कर रहा फेसबुक ग्राफ एपीआई।

http.get(options, 
    function(res) { 
    ...some stuff... 
    DONE(RESULT); //DONE is a callback function 
    }).on('error', function(e) { 
     ...some error handling... 
}); 

क्या मैं देख सकते हैं कि मैं केवल के रूप में कई अनुरोधों क्या कर सकते हैं:

var options = {host: 'graph.facebook.com', 
       port: 80, 
       path: '/' + fb_id + '/picture'}; //fb_id is a Facebook user identifier 

मेरे कोड इस तरह दिखता है:

विकल्प यहां दिए है कि मैं 'http.get' को पारित कर रहे हैं http.globalAgent.maxSockets के मान के रूप में। एक बार जब मैं उन अनुरोधों तक पहुंच जाता हूं, तो http.get को अगली कॉल कभी नहीं (स्पष्ट रूप से) जोड़ती है। मैंने सत्यापित किया है कि मुझे अनुरोधों पर त्रुटियां नहीं मिल रही हैं।

यह के रूप में यद्यपि सॉकेट बंद नहीं किया जा रहा है के बाद जवाब में आता है।

वहाँ कुछ मैं सुनिश्चित करना है कि सॉकेट बंद कर दिया है प्रतिक्रिया हैंडलर के हिस्से के रूप क्या करने की जरूरत है?

क्या ये सॉकेट डिफ़ॉल्ट रखरखाव व्यवहार के कारण बंद नहीं हो रहे हैं?

मुझे इसे डीबग करने के लिए कैसे आगे बढ़ना चाहिए?

उत्तर

7

विकल्पों में agent: false सेट करने का प्रयास करें। डिफ़ॉल्ट व्यवहार HTTP के लिए खुले कनेक्शनों रखने के लिए वास्तव में है जीवित-रखें:

var options = {host: 'graph.facebook.com', 
       port: 80, 
       path: '/' + fb_id + '/picture', 
       agent: false}; 
+0

मैंने इसे दस्तावेज में देखा लेकिन इसे भ्रमित कर दिया: "यदि सॉकेट पर कोई लंबित HTTP अनुरोध इंतजार नहीं कर रहा है तो सॉकेट बंद हो गया है।इसका मतलब यह है कि लोड के दौरान नोड के पूल को जीवित रहने का लाभ होता है लेकिन अभी भी डेवलपर्स को रख-रखाव के जरिए HTTP क्लाइंट को मैन्युअल रूप से बंद करने की आवश्यकता नहीं होती है। " मुझे समझ में नहीं आता कि क्यों पूल, पहले से ही खुले कनेक्शन नहीं हैं बाद के अनुरोधों के लिए उपयोग किया जाता है। मैं एजेंट को कोशिश करूंगा: झूठी, और इससे अच्छी चीजों की उम्मीद करें। –

+0

मुझे लगता है कि 'http' मॉड्यूल पूल में कोई सॉकेट उपलब्ध नहीं है, जिसके लिए कोई अनुरोध नहीं है।' 'maxSockets' पहुंचा है और उन सभी अनुरोधों को अभी भी लंबित है, किसी भी बाद के अनुरोधों को पूल से मुफ्त सॉकेट नहीं मिल सकता है और केवल गिरा दिया जाएगा। – robertklep

+0

मुझे एहसास हुआ कि मेरा आवेदन आर्किटेक्चर मेरी समस्या में योगदान दे रहा था क्योंकि मुझे फिर से आवश्यकता थी प्रत्येक अनुरोध से पहले 'http' मॉड्यूल, जिसका अर्थ है कि प्रत्येक http संदर्भ स्टैंडअलोन था। मैंने इसे बदलने का प्रयास किया ताकि एचटी टीपी मॉड्यूल संदर्भ 'get' invocations में साझा किया गया था, लेकिन मुझे वही व्यवहार दिखाई देता है (पहले globalAgent.maxSockets अनुरोध ठीक हैं, शेष सॉकेट की इच्छा के लिए लटका है)। यह सवाल पूछता है - इस डिफ़ॉल्ट रखरखाव व्यवहार का लाभ कैसे उठाएगा? –

2

नोड के http मॉड्यूल कहा गया है कि वैश्विक एजेंट को एजेंट चूक: कि जीवित-रखें जिसका मतलब है http://nodejs.org/api/http.html#http_http_globalagent, मॉड्यूल है कि मूल की परवाह किए बिना साझा किया जाता है निवेदन।

बीटीडब्ल्यू, अप्रैल 9'13 को 20:47 पर वेस की टिप्पणी का जवाब: इससे कोई फ़र्क नहीं पड़ता कि आप नोड मॉड्यूल कितनी बार लोड करते हैं, यह केवल एक बार लोड हो जाएगा और सभी मॉड्यूल द्वारा साझा किया जाएगा।

जो आप अनुभव कर रहे हैं वह पूल थकावट समस्या है। इससे बचने का सबसे आसान तरीका अपने वांछित maxSockets के साथ एक नए एजेंट (http://nodejs.org/api/http.html#http_class_http_agent) का उपयोग करना है। याद रखें कि आपके द्वारा बनाए गए एजेंट को मॉड्यूल के बीच साझा किया जा सकता है यदि आप इसे उस मॉड्यूल के निर्यात में रखते हैं (नोड में मॉड्यूल स्टेटफुल हैं !!!)।

2

मुझे एक ही व्यवहार का अनुभव हुआ, सिवाय इसके कि मेरे कनेक्शन अंततः एक समय अवधि के बाद पुन: उपयोग किए गए थे। जांच करें कि कनेक्शन की एक निश्चित अवधि (कुछ मिनट) के बाद पुन: उपयोग किया जाता है, और यह भी जांचें कि प्रतिक्रिया शीर्षलेख में 'कनेक्शन: रखें-जिंदा' है या नहीं।

यदि ऐसा है तो एक संभावित समाधान 'जीवित रहने के बजाय' कनेक्शन: बंद करें 'शीर्षलेख का उपयोग करना होगा, इस तरह पूल किए गए कनेक्शन को सामान्य सेटअप के रूप में पहले पुन: उपयोग किया जा सकता है। मुझे यकीन नहीं है कि यह फेसबुक अंतराल का उपयोग कर किसी भी प्रदर्शन के मुद्दों की ओर जाता है।

var options = {host: 'graph.facebook.com', 
       port: 80, 
       path: '/' + fb_id + '/picture', 
       headers: { 'Connection':'Close' } 
}; 

मेरे लिए एजेंट का उपयोग करने के लिए: झूठी काम नहीं किया क्योंकि अनुरोधों की विशाल संख्या मैंने सर्वर संसाधनों को थका दिया।

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