2016-12-05 17 views
5

मुझे किसी दिए गए होस्ट को Node.js. में इसके संबंधित आईपी को देखने की आवश्यकता है।Node.js dns.resolve() बनाम dns.lookup()

> dns.resolve('google.com', (error, addresses) => { console.error(error); console.log(addresses); }); 
QueryReqWrap { 
    bindingName: 'queryA', 
    callback: { [Function: asyncCallback] immediately: true }, 
    hostname: 'google.com', 
    oncomplete: [Function: onresolve], 
    domain: 
    Domain { 
    domain: null, 
    _events: { error: [Function] }, 
    _eventsCount: 1, 
    _maxListeners: undefined, 
    members: [] } } 
> null 
[ '216.58.194.174' ] 

और::

> dns.lookup('google.com', (error, address, family) => { console.error(error); console.log(address); console.log(family); }); 
GetAddrInfoReqWrap { 
    callback: { [Function: asyncCallback] immediately: true }, 
    family: 0, 
    hostname: 'google.com', 
    oncomplete: [Function: onlookup], 
    domain: 
    Domain { 
    domain: null, 
    _events: { error: [Function] }, 
    _eventsCount: 1, 
    _maxListeners: undefined, 
    members: [] } } 
> null 
216.58.194.174 
4 

दोनों एक ही IPv4 पता लौट ऐसा करने के दो देशी तरीकों हो रहा है। dns.lookup() और dns.resolve() के बीच क्या अंतर है? इसके अलावा, जो प्रति सेकेंड के कई अनुरोधों के लिए अधिक प्रदर्शनकारी है?

उत्तर

6

dns documentation पहले से ही अंतर बताता है:

हालांकि dns.lookup() और विभिन्न dns.resolve *()/dns.reverse() फ़ंक्शन एक नेटवर्क के साथ एक नेटवर्क का नाम जोड़ का एक ही लक्ष्य है पता (या इसके विपरीत), उनका व्यवहार काफी अलग है। इन मतभेदों में नोड.जेएस कार्यक्रमों के व्यवहार पर सूक्ष्म लेकिन महत्वपूर्ण परिणाम हो सकते हैं।

dns.lookup()
हुड के अंतर्गत, dns.lookup() सबसे अन्य कार्यक्रमों के रूप में एक ही ऑपरेटिंग सिस्टम की सुविधा का उपयोग करता है। उदाहरण के लिए, dns.lookup() लगभग हमेशा दिए गए नाम को पिंग कमांड के समान ही हल करेगा। अधिकांश POSIX- जैसे ऑपरेटिंग सिस्टम पर, dns.lookup() फ़ंक्शन का व्यवहार nsswitch.conf (5) और/या resolv.conf (5) में सेटिंग्स को बदलकर संशोधित किया जा सकता है, लेकिन ध्यान दें कि इन फ़ाइलों को बदलने से बदल जाएगा एक ही ऑपरेटिंग सिस्टम पर चल रहे सभी अन्य कार्यक्रमों का व्यवहार।

हालांकि dns.lookup() को कॉल करने के लिए जावास्क्रिप्ट के परिप्रेक्ष्य से असीमित होगा, इसे getaddrinfo (3) के लिए सिंक्रोनस कॉल के रूप में कार्यान्वित किया जाता है जो libuv के थ्रेडपूल पर चलता है। चूंकि libuv के थ्रेडपूल का एक निश्चित आकार है, इसका मतलब है कि अगर किसी भी कारण से getaddrinfo (3) को कॉल करने में काफी समय लगता है, तो अन्य ऑपरेशन जो libuv के थ्रेडपूल (जैसे फाइल सिस्टम ऑपरेशंस) पर चल सकते हैं, खराब प्रदर्शन का अनुभव करेंगे। इस समस्या को कम करने के लिए, एक संभावित समाधान 'UV_THREADPOOL_SIZE' पर्यावरण परिवर्तक को 4 से अधिक मान (इसके वर्तमान डिफ़ॉल्ट मान) पर सेट करके libuv के थ्रेडपूल के आकार को बढ़ाने के लिए है। Libuv के थ्रेडपूल पर अधिक जानकारी के लिए, आधिकारिक libuv दस्तावेज देखें।

dns.resolve(), dns.resolve *() और dns.reverse()
इन कार्यों dns.lookup की तुलना में काफी अलग ढंग से लागू किया जाता है()। वे getaddrinfo (3) का उपयोग नहीं करते हैं और वे हमेशा नेटवर्क पर एक DNS क्वेरी करते हैं। यह नेटवर्क संचार हमेशा असंकालिक रूप से किया जाता है, और libuv के थ्रेडपूल का उपयोग नहीं करता है।

नतीजतन, इन कार्यों को अन्य प्रसंस्करण पर नकारात्मक प्रभाव नहीं पड़ सकता है जो libuv के थ्रेडपूल पर होता है जो dns.lookup() हो सकता है।

वे dns.lookup() उपयोगों की तुलना में कॉन्फ़िगरेशन फ़ाइलों के उसी सेट का उपयोग नहीं करते हैं। उदाहरण के लिए, वे/etc/hosts से कॉन्फ़िगरेशन का उपयोग नहीं करते हैं।

जहाँ तक के रूप में संगामिति चला जाता है, आप dns.resolve*() का उपयोग कर से बेहतर हैं, क्योंकि उन अनुरोधों थ्रेड पूल में न करना पड़े, dns.lookup() अनुरोध जबकि करना क्योंकि वे ओएस DNS रिसोल्वर जो आम तौर पर ब्लॉक करने के लिए कॉल (यद्यपि अब कुछ प्रकार के एसिंक इंटरफेस हैं - लेकिन वे हर जगह जरूरी नहीं हैं)।

वर्तमान में, नोड आंतरिक रूप से किसी भी स्वचालित DNS रिज़ॉल्यूशन के लिए dns.lookup() का उपयोग करता है, जैसे कि जब आप http.request() पर होस्टनाम पास करते हैं।

+0

यह उल्लेखनीय है कि आईपी पते की सूची हल हो जाती है हर बार एक अलग क्रम में आता है। इसका उपयोग भार संतुलन के लिए किया जा सकता है (राउंड रॉबिन विधि का उपयोग करके DNS संकल्प)। https://www.nginx.com/resources/glossary/dns-load-balancing/ – rocketspacer

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