Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js dns.resolve()与dns.lookup()的比较_Javascript_Node.js_Dns_Ipv6_Ipv4 - Fatal编程技术网

Javascript Node.js dns.resolve()与dns.lookup()的比较

Javascript Node.js dns.resolve()与dns.lookup()的比较,javascript,node.js,dns,ipv6,ipv4,Javascript,Node.js,Dns,Ipv6,Ipv4,我需要在Node.js中查找给定主机对应的IP。这似乎有两种本机方法: > dns.resolve('google.com', (error, addresses) => { console.error(error); console.log(addresses); }); QueryReqWrap { bindingName: 'queryA', callback: { [Function: asyncCallback] immediately: true }, hos

我需要在Node.js中查找给定主机对应的IP。这似乎有两种本机方法:

> 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' ]
以及:

两者都返回相同的IPv4地址。
dns.lookup()
dns.resolve()
之间有什么区别?另外,对于每秒的大量请求,哪种性能更好?

已经描述了区别:

尽管dns.lookup()和各种dns.resolve*()/dns.reverse()函数具有将网络名称与网络地址关联的相同目标(反之亦然),但它们的行为却截然不同。这些差异可能会对Node.js程序的行为产生微妙但重要的影响。

dns.lookup()
在幕后,dns.lookup()使用与大多数其他程序相同的操作系统功能。例如,dns.lookup()几乎总是以与ping命令相同的方式解析给定名称。在大多数类似POSIX的操作系统上,可以通过更改nsswitch.conf(5)和/或resolv.conf(5)中的设置来修改dns.lookup()函数的行为,但请注意,更改这些文件将更改在同一操作系统上运行的所有其他程序的行为。

尽管从JavaScript的角度来看,对dns.lookup()的调用是异步的,但它是作为对在libuv的线程池上运行的getaddrinfo(3)的同步调用实现的。由于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.lookup()
进行任何自动dns解析,比如当您将主机名传递给
http.request()

@mscdex时,答案非常完整,并且正在解释中。我可能会添加一个关于绕过线程阻塞的方法的信息

我们开发了一个模块,用于替换/扩展节点的
dns.lookup
方法。该模块缓存响应,具有多记录解析和TTL支持。此外,我们还具有良好的单元和功能。该模块在生产和高负载环境中进行了测试。在MIT许可证下。如下所示:


如果您需要对查找方法的支持,但无法解决应用程序阻塞或响应速度减慢等负面影响,则可以使用我们的模块。我相信这会有所帮助!

值得一提的是,每次解析的IP地址列表的顺序都不同。这可以用于负载平衡(DNS解析使用循环方法)。知道使用哪一组配置文件
DNS.resolve()
> 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