2016-12-05 4 views
5

Мне нужно найти данный хост для его соответствующего IP-адреса в Node.js. Там, кажется, два нативные методы сделать это: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' ] 

И:

> 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() функции имеют ту же цель связывая имя сети с сетью адреса (или наоборот), их поведение совсем другое. Эти различия могут иметь незначительные, но существенные последствия для поведения программ Node.js.

dns.lookup()
Под капотом dns.lookup() использует те же средства операционной системы, как и большинство других программ. Например, dns.lookup() почти всегда будет разрешать данное имя так же, как команда ping. В большинстве POSIX-подобных операционных систем поведение функции dns.lookup() может быть изменено путем изменения настроек в nsswitch.conf (5) и/или resolv.conf (5), но обратите внимание, что изменение этих файлов приведет к изменению поведение всех других программ, работающих в одной и той же операционной системе.

Хотя вызов dns.lookup() будет асинхронным с точки зрения JavaScript, он реализуется как синхронный вызов getaddrinfo (3), который работает на threadpool libuv. Поскольку поток потока libuv имеет фиксированный размер, это означает, что если по какой-либо причине вызов getaddrinfo (3) занимает много времени, другие операции, которые могут выполняться в поточном потоке libuv (например, операции с файловой системой), будут иметь ухудшенную производительность. Чтобы смягчить эту проблему, одним из возможных решений является увеличение размера потока thread libv, установив переменную среды UV_THREADPOOL_SIZE в значение больше 4 (текущее значение по умолчанию). Для получения дополнительной информации о threadpool libuv см. Официальную документацию libuv.

dns.resolve(), dns.resolve *() и dns.reverse()
Эти функции реализуются совсем по-другому, чем dns.lookup(). Они не используют getaddrinfo (3), и они всегда выполняют DNS-запрос в сети. Эта сетевая связь всегда выполняется асинхронно и не использует threadpool libuv.

В результате эти функции не могут оказывать такое же негативное влияние на другую обработку, которая происходит на threadpool libuv, которую может иметь dns.lookup().

Они не используют тот же набор конфигурационных файлов, что и dns.lookup(). Например, они не используют конфигурацию из/etc/hosts.

Насколько параллелизм идет, вы лучше использовать dns.resolve*() потому, что эти запросы не попадают в пул потоков, в то время как dns.lookup() запросов сделать потому что они взывать к OS DNS распознаватель, который обычно блокирует (хотя сейчас есть какие-то асинхронные интерфейсы, но они не всегда реализуются повсюду).

В настоящее время узел внутренне использует dns.lookup() для любого автоматического разрешения DNS, например, когда вы передаете имя хоста http.request().

+0

Следует упомянуть, что список разрешенных IP-адресов приходит каждый раз в другом порядке. Это можно использовать для балансировки нагрузки (разрешение DNS с использованием метода round robin). https://www.nginx.com/resources/glossary/dns-load-balancing/ – rocketspacer

 Смежные вопросы

  • Нет связанных вопросов^_^