2016-12-05 1 views
5

ich einen bestimmten Host zu seinem entsprechenden IP in Node.js. entsprechenden Hilfe Es scheint zwei nativen Methoden, um dies zu tun:Node.js dns.resolve() vs 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' ] 

Und:

> 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 

Beide geben die gleiche IPv4-Adresse. Was ist der Unterschied zwischen dns.lookup() und dns.resolve()? Auch, welches ist für viele Anfragen pro Sekunde leistungsfähiger?

Antwort

6

Die dns documentation beschreibt bereits den Unterschied:

Obwohl dns.lookup() und die verschiedenen dns.resolve *()/dns.reverse() -Funktionen haben das gleiche Ziel einen Netzwerknamen mit einem Netzwerk von Assoziieren Adresse (oder umgekehrt), ihr Verhalten ist ganz anders. Diese Unterschiede können subtile, aber signifikante Auswirkungen auf das Verhalten von Node.js-Programmen haben.

dns.lookup()
Unter der Haube dns.lookup() verwendet die gleichen Betriebssystem Einrichtungen wie die meisten anderen Programme. Zum Beispiel löst dns.lookup() einen gegebenen Namen fast immer auf die gleiche Weise auf wie der Befehl ping. Auf den meisten POSIX-ähnlichen Betriebssystemen kann das Verhalten der Funktion dns.lookup() geändert werden, indem die Einstellungen in nsswitch.conf (5) und/oder resolv.conf (5) geändert werden. Beachten Sie jedoch, dass das Ändern dieser Dateien die Einstellung ändert Verhalten aller anderen Programme, die auf demselben Betriebssystem ausgeführt werden.

Obwohl der Aufruf von dns.lookup() aus JavaScript-Perspektive asynchron ist, wird er als synchroner Aufruf von getaddrinfo (3) implementiert, der auf libuvs Threadpool ausgeführt wird. Da libuvs Threadpool eine feste Größe hat, bedeutet dies, dass der Aufruf von getaddrinfo (3) aus irgendeinem Grund lange dauert. Andere Operationen, die auf libuvs Threadpool ausgeführt werden könnten (wie z. B. Dateisystemoperationen), haben eine schlechtere Leistung. Um dieses Problem zu beheben, besteht eine mögliche Lösung darin, die Größe des libuv-Threadpools zu erhöhen, indem die Umgebungsvariable 'UV_THREADPOOL_SIZE' auf einen Wert größer als 4 (der aktuelle Standardwert) gesetzt wird. Weitere Informationen zum libuv-Threadpool finden Sie in der offiziellen libuv-Dokumentation.

dns.resolve(), dns.resolve *() und dns.reverse()
sind ganz anders als dns.lookup Diese Funktionen implementiert(). Sie verwenden nicht getaddrinfo (3) und führen immer eine DNS-Abfrage im Netzwerk durch. Diese Netzwerkkommunikation erfolgt immer asynchron und verwendet nicht den Threadpool von libuv.

Als Ergebnis können diese Funktionen nicht die gleichen negativen Auswirkungen auf andere Verarbeitung, die Thread diesem dns.lookup auf libuv das geschieht() haben kann.

Sie verwenden nicht den gleichen Satz von Konfigurationsdateien als das, was dns.lookup() verwendet. Zum Beispiel verwenden sie nicht die Konfiguration von/etc/hosts.

Soweit Gleichzeitigkeit geht, sind Sie besser dran dns.resolve*() verwenden, da diese Anforderungen im Thread-Pool nicht am Ende, während dns.lookup() Anfragen tun, weil sie an die O DNS-Resolver rufen die typischerweise Blöcke (obwohl es jetzt einige asynchrone Schnittstellen gibt, die aber nicht unbedingt überall implementiert werden müssen.

Derzeit verwendet der Knoten intern dns.lookup() für eine automatische DNS-Auflösung, z. B. wenn Sie einen Hostnamen an http.request() übergeben.

+0

Es ist erwähnenswert, dass die Liste der aufgelösten IP-Adressen jedes Mal in einer anderen Reihenfolge kommt. Dies kann für den Lastenausgleich verwendet werden (DNS-Auflösung mit Round-Robin-Methode). https://www.nginx.com/resources/glossary/dns-load-balancing/ – rocketspacer