Bun 实现了 node:dns
模块。
import * as dns from "node:dns";
const addrs = await dns.promises.resolve4("bun.sh", { ttl: true });
console.log(addrs);
// => [{ address: "172.67.161.226", family: 4, ttl: 0 }, ...]
Bun 中的 DNS 缓存
在 Bun v1.1.9 中,我们添加了对 DNS 缓存的支持。此缓存使重复连接到相同主机变得更快。
在撰写本文时,我们最多缓存 255 个条目,最长 30 秒(每个)。如果与主机的任何连接失败,我们会从缓存中删除该条目。当同时建立与同一主机的多个连接时,DNS 查找会去重,以避免为同一主机发出多个请求。
此缓存由以下项自动使用
bun install
fetch()
node:http
(客户端)Bun.connect
node:net
node:tls
我应该何时预取 DNS 条目?
Web 浏览器公开 <link rel="dns-prefetch">
以允许开发人员预取 DNS 条目。当您知道在不久的将来需要连接到主机并想避免初始 DNS 查找时,这非常有用。
在 Bun 中,您可以使用 dns.prefetch
API 来达到相同的效果。
import {dns} from "bun";
dns.prefetch("my.database-host.com", 5432);
您可能想要使用它的一个示例是数据库驱动程序。当您的应用程序首次启动时,您可以预取数据库主机的 DNS 条目,以便在它完成所有加载时,解析数据库主机的 DNS 查询可能已经完成。
dns.prefetch
🚧 — 此 API 是实验性的,将来可能会更改。
要预取 DNS 条目,您可以使用 dns.prefetch
API。当您知道很快需要连接到主机并想避免初始 DNS 查找时,此 API 非常有用。
dns.prefetch(hostname: string, port: number): void;
这是一个例子
import {dns} from "bun";
dns.prefetch("bun.sh", 443);
//
// ... sometime later ...
await fetch("https://bun.net.cn");
dns.getCacheStats()
🚧 — 此 API 是实验性的,将来可能会更改。
要获取当前缓存统计信息,您可以使用 dns.getCacheStats
API。
此 API 返回一个具有以下属性的对象
{
// Cache hits
cacheHitsCompleted: number;
cacheHitsInflight: number;
cacheMisses: number;
// Number of items in the DNS cache
size: number;
// Number of times a connection failed
errors: number;
// Number of times a connection was requested at all (including cache hits and misses)
totalCount: number;
}
例子
import {dns} from "bun";
const stats = dns.getCacheStats();
console.log(stats);
// => { cacheHitsCompleted: 0, cacheHitsInflight: 0, cacheMisses: 0, size: 0, errors: 0, totalCount: 0 }
配置 DNS 缓存 TTL
Bun 默认将 DNS 缓存条目的 TTL 设置为 30 秒。要更改此设置,您可以设置环境变量 $BUN_CONFIG_DNS_TIME_TO_LIVE_SECONDS
。例如,要将 TTL 设置为 5 秒
BUN_CONFIG_DNS_TIME_TO_LIVE_SECONDS=5 bun run my-script.ts
为什么默认是 30 秒?
遗憾的是,底层的系统 API (`getaddrinfo`) 没有提供获取 DNS 条目 TTL 的方法。这意味着我们必须任意选择一个数字。我们选择 30 秒是因为它足够长,可以看到缓存的好处,并且足够短,不太可能在 DNS 条目更改时引起问题。Amazon Web Services 建议 Java 虚拟机使用 5 秒,但 JVM 默认无限期缓存。