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 的默认配置是无限期缓存。