Skip to main content
Bun 实现了自己的 dns 模块和 node:dns 模块。

Bun 中的 DNS 缓存

Bun 会缓存 DNS 查找结果,从而加快与同一主机的重复连接。 缓存最多保存 256 个条目,每个条目的最长有效期为 30 秒。如果与某个主机的连接失败,Bun 会从缓存中移除该主机的条目。与同一主机的并发连接会共享一次 DNS 查找。 以下操作会自动使用此缓存:
  • bun install
  • fetch()
  • node:http(客户端)
  • Bun.connect
  • node:net
  • node:tls

什么时候应该预获取 DNS 记录?

Web 浏览器提供了 <link rel="dns-prefetch">,可以在需要之前解析主机名。在 Bun 中,dns.prefetch 的作用相同:当你知道很快就会连接到某个主机,并希望避免首次 DNS 查找时,可以使用它。
数据库驱动就是一个很好的例子:在应用启动时预获取数据库主机的 DNS 记录,这样等应用的其余部分加载完成时,DNS 查找可能已经完成。

dns.prefetch

此 API 处于实验阶段,将来可能会发生变化。
dns.prefetch 会在需要之前解析主机名。
示例:

dns.getCacheStats()

此 API 处于实验阶段,将来可能会发生变化。
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 的默认设置是无限期缓存。