dns 模块和 node:dns 模块。
选择解析器后端
Bun.dns.lookup() 接受一个 backend 选项,用于选择解析器实现:
"c-ares":异步解析器 c-ares。它会直接读取/etc/resolv.conf,因此不会查询诸如systemd-resolved之类的 NSS 模块。这是 Linux 上Bun.dns.lookup()的默认设置"system":平台自身的解析器(macOS 上使用非阻塞系统 API,在其他平台上则使用线程池中的getaddrinfo)。这是 macOS、Windows 和 Android 上的默认设置"getaddrinfo"(别名为"libc"):线程池中的 POSIXgetaddrinfo(3)函数
node:dns.lookup() 始终使用 "system" 后端,以匹配 Node.js,因为 Node.js 的文档说明其 dns.lookup() 会调用 getaddrinfo(3)。node:dns.resolve*() 函数使用 c-ares,与 Node.js 中的行为一致。
Bun 中的 DNS 缓存
Bun 会缓存 DNS 查找结果,从而加快与同一主机的重复连接。 缓存最多保存 256 个条目,每个条目的最长有效期为 30 秒。如果与某个主机的连接失败,Bun 会从缓存中移除该主机的条目。与同一主机的并发连接会共享一次 DNS 查找。 以下操作会自动使用此缓存:bun installfetch()node:http(客户端)Bun.connectnode:netnode:tls
什么时候应该预获取 DNS 记录?
Web 浏览器提供了<link rel="dns-prefetch">,可以在需要之前解析主机名。在 Bun 中,dns.prefetch 的作用相同:当你知道很快就会连接到某个主机,并希望避免首次 DNS 查找时,可以使用它。
dns.prefetch
dns.prefetch 会在需要之前解析主机名。
dns.getCacheStats()
dns.getCacheStats() 将当前缓存统计信息作为对象返回,该对象包含以下属性:
配置 DNS 缓存 TTL
Bun 默认会将 DNS 条目缓存 30 秒。若要更改 TTL,请设置$BUN_CONFIG_DNS_TIME_TO_LIVE_SECONDS 环境变量。例如,以下命令会将其设置为 5 秒:
为什么默认是 30 秒?
底层的系统 API(getaddrinfo)不会公开 DNS 条目的 TTL,因此 Bun 必须自行选择一个数值。我们选择 30 秒,是因为这个时长足以体现缓存的优势,同时又足够短,在 DNS 条目发生变化时不太可能造成问题。Amazon Web Services 建议 Java 虚拟机使用 5 秒,不过 JVM 的默认设置是无限期缓存。