2013-09-27 21 views
31

कोई बता सकता है कि request.js पूल हैश का उपयोग कैसे करें?अनुरोध जेएस (नोड जेएस मॉड्यूल) पूल का उपयोग कैसे करें

github notes पूल के बारे में यह कहना:

पूल - एक हैश इन अनुरोधों के लिए एजेंट युक्त वस्तु। यदि यह अनुरोध छोड़ा गया है तो वैश्विक पूल का उपयोग करेगा जो नोड के डिफ़ॉल्ट maxSockets पर सेट है।

pool.maxSockets - पूल में अधिकतम मात्रा में सॉकेट युक्त इंटीजर।

मेरे पास यह कोड CouchDB इंस्टेंस को लिखने के लिए है (प्रश्न चिह्नों को नोट करें)।

var request = require('request'); 

request({ 
    //pool:,  // ?????????????????? 
    'pool.maxSockets' : 100, // ?????????????????? 
    'method' : 'PUT', 
    'timeout' : 4000, 
    'strictSSL' : true, 
    'auth' : { 
     'username' : myUsername, 
     'password' : myPassword 
    }, 
    'headers' : { 
     'Content-Type': 'application/json;charset=utf-8', 
     'Content-Length': myData.length 
    }, 
    'json' : myData, 
    'url': myURL 
}, function (error, response, body){ 
    if (error == null) { 
     log('Success: ' + body); 
    } 
    else { 
     log('Error: ' + error); 
    } 
}); 

क्या उच्च throughput/प्रदर्शन के लिए सबसे अच्छा है: मूल रूप से, किसी भी उपयोगकर्ता जो मेरे नोड सर्वर से कनेक्ट एक दूसरे के डीबी स्वतंत्र करने के लिए लिखेंगे?
उच्च 'maxSockets' संख्या की कमी क्या हैं?
मैं वैश्विक पूल के बजाय उपयोग करने के लिए एक अलग पूल कैसे बना सकता हूं? मैं केवल एक अलग पूल क्यों बनाना चाहता हूं?

उत्तर

38

अनुरोध में पूल विकल्प एजेंट जो http.Agent मानक http पुस्तकालय से रूप में ही है उपयोग करता है। http.Agent के लिए प्रलेखन देखें और विकल्पों को http.request में देखें।

प्रयोग

pool = new http.Agent(); //Your pool/agent 
http.request({hostname:'localhost', port:80, path:'/', agent:pool}); 
request({url:"http://www.google.com", pool:pool }); 

आप को पता है क्या है कि आप इसे कंसोल से देख सकते हैं उत्सुक हैं।

{ domain: null, 
    _events: { free: [Function] }, 
    _maxListeners: 10, 
    options: {}, 
    requests: {}, 
    sockets: {}, 
    maxSockets: 5, 
    createConnection: [Function] } 

maxSockets निर्धारित करता है कितने समवर्ती सॉकेट एजेंट मेजबान प्रति खुला हो सकता है, मूल्य 5. आमतौर पर आप इसे पहले स्थापित करेगा साथ डिफ़ॉल्ट रूप से एक एजेंट में मौजूद है। pool.maxSockets पास करने से pool में अधिकतम सॉकेट संपत्ति को ओवरराइड कर दिया जाएगा। pool विकल्प पास करने पर यह विकल्प केवल समझ में आता है। इसका इस्तेमाल करने के

तो अलग अलग तरीकों से:

  1. agent विकल्प दे मत करो, हो undefinedhttp.globalAgent का उपयोग करेगा। डिफ़ॉल्ट मामला
  2. इसे झूठी दें, पूलिंग अक्षम कर देगा।
  3. उपरोक्त उदाहरण की तरह अपना खुद का एजेंट प्रदान करें।

अपने प्रश्नों को उल्टा में जवाब दें।

पूल प्रोग्राम द्वारा उपयोग किए जाने वाले कुछ सॉकेट रखने के लिए है। सबसे पहले विभिन्न अनुरोधों के लिए सॉकेट का पुन: उपयोग किया जाता है। तो यह नए सॉकेट बनाने के ऊपरी हिस्से को कम कर देता है। दूसरा यह अनुरोधों के लिए कम सॉकेट का उपयोग करता है, लेकिन लगातार। यह उपलब्ध सभी सॉकेट नहीं लेगा। तीसरा यह अनुरोधों की कतार बनाए रखता है। तो प्रतीक्षा समय निहित है।

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

अधिकतम सॉकेट संपत्ति अधिकतम समवर्तीता प्रदान करती है। यह समग्र थ्रूपुट/प्रदर्शन को बढ़ाता है। ड्रॉबैक थ्रॉटल प्रभाव कम हो गया है। आप चरम ओवरहेड को नियंत्रित नहीं कर सकते हैं। इसे बड़ी संख्या में सेट करना, बिल्कुल पूलिंग की तरह नहीं होगा। आपको सॉकेट जैसी त्रुटियां उपलब्ध नहीं होनी चाहिए। यह ओएस द्वारा निर्धारित अधिकतम सीमा से अधिक नहीं हो सकता है।

तो उच्च थ्रूपुट/प्रदर्शन के लिए सबसे अच्छा क्या है? थ्रूपुट में एक भौतिक सीमा है। यदि आप सीमा तक पहुंचते हैं, तो कनेक्शन की संख्या के साथ प्रतिक्रिया समय बढ़ेगा। आप तब तक maxSockets बढ़ाना जारी रख सकते हैं, लेकिन इसके बाद यह बढ़ने में मदद नहीं करेगा।

+0

आपके पहले उपयोग उदाहरण में, दूसरी पंक्ति 'http.request ({...}) का बिंदु क्या है; '- क्या यह दिखाने के लिए यह कोर HTTP मॉड्यूल का उपयोग करते समय काम करेगा, या कथन आवश्यक है 'अनुरोध' लाइब्रेरी में उपयोग के लिए पूल को सही तरीके से प्रारंभ करने के लिए बुलाया जा सकता है? धन्यवाद! –

+0

आपका उत्तर अब तक का सबसे अच्छा संसाधन है जो मुझे एजेंट पूलिंग और पेशेवरों और उनका उपयोग करने के विपक्ष पर मिला है। इस लिखने के लिए समय लेने के लिए बहुत कुछ धन्यवाद (y) –

+0

** नोट ** कि _Node.js_ के हाल के संस्करणों में डिफ़ॉल्ट रूप से 'maxSockets' के रूप में 'इन्फिनिटी' है। –

13

आपको forever-agent मॉड्यूल पर एक नज़र डालना चाहिए, जो http.Agent पर एक रैपर है।

आम तौर पर पूल एक हैश ऑब्जेक्ट है जिसमें कई http एजेंट होते हैं। यह "रख-रखाव" कनेक्शन से निर्मित सॉकेट का पुन: उपयोग करने का प्रयास करता है। प्रति मेजबान: बंदरगाह। उदाहरण के लिए, आपने www.domain1.com:80 और www.domain2.com:80 होस्ट करने के लिए कई अनुरोध किए हैं, यदि किसी भी प्रतिक्रिया में कोई शीर्षलेख Connection: close नहीं है, तो यह सॉकेट को पूल में रखेगा और लंबित अनुरोधों को देगा।

यदि कोई लंबित अनुरोध इस पूल किए गए सॉकेट की आवश्यकता नहीं है, तो यह नष्ट हो जाएगा।

maxSockets का अर्थ है एक मेजबान के लिए अधिकतम समवर्ती सॉकेट: पोर्ट, डिफ़ॉल्ट मान है। मैं एक साथ अपने परिदृश्य के साथ इस मूल्य के बारे में सोच सुझाव है:

  • उन गर्म साइटों के अनुसार यात्रा का अनुरोध करता है, तो आप बेहतर अलग पूल बनाएंगे। ताकि नए अनुरोध निष्क्रिय सॉकेट को बहुत तेजी से उठा सकें। मुद्दा यह है कि, आपको पूल के मूल्य maxSockets मूल्य बढ़ाकर कुछ साइटों पर लंबित अनुरोधों की संख्या को कम करने की आवश्यकता है। ध्यान दें कि इससे कोई फर्क नहीं पड़ता कि आप maxSockets पर बहुत अधिक संख्या निर्धारित करते हैं जब कनेक्शन हेडर Connection: close के माध्यम से मूल सर्वर द्वारा कनेक्शन प्रबंधित किया जाता है।

  • उन साइटों के अनुसार जो आपके अनुरोध शायद ही कभी यात्रा करते हैं, पूल को अक्षम करने के लिए pool: false का उपयोग करें।

आप अपने अनुरोध के लिए अलग पूल निर्दिष्ट करने के लिए इस तरह से उपयोग कर सकते हैं:

// create a separate socket pool with 10 concurrent sockets as max value. 
var separateReqPool = {maxSockets: 10}; 
var request = require('request'); 

request({url: 'http://localhost:8080/', pool: separateReqPool}, function(e, resp){ 
}); 
+2

यह "sepearateReqPool" मेरे लिए काम करना प्रतीत होता था और बहुत कम कोड था। हमेशा के लिए एजेंट बिट (कोशिश नहीं की) के बारे में निश्चित नहीं है, लेकिन दूसरा आधा बहुत उपयोगी था। – jeremy

+0

यदि मैं पूल सेट करता हूं तो क्या ओएस खत्म हो जाएगा: झूठा? मेरा मतलब है, क्या यह अभी भी जीवित कनेक्शन का पुन: उपयोग करेगा, या वह अनन्य अनुप्रयोग तर्क है? – lucaswxp