Bun は独自の dns モジュールと node:dns モジュールを実装しています。
import * as dns from "node:dns";
const addrs = await dns.promises.resolve4("bun.com", { ttl: true });
console.log(addrs);
// => [{ address: "172.67.161.226", family: 4, ttl: 0 }, ...]import { dns } from "bun";
dns.prefetch("bun.com", 443);Bun での DNS キャッシング
Bun は DNS キャッシングをサポートしています。このキャッシュは同じホストへの繰り返し接続を高速化します。
執筆時点では、最大 255 エントリをそれぞれ最大 30 秒間キャッシュします。ホストへの接続が失敗した場合、そのエントリはキャッシュから削除されます。同じホストへの複数の接続が同時に実行された場合、DNS ルックアップは重複排除され、同じホストへの複数のリクエストが回避されます。
このキャッシュは以下によって自動的に使用されます。
bun installfetch()node:http(クライアント)Bun.connectnode:netnode:tls
DNS エントリをプリフェッチすべきなのはいつですか?
Web ブラウザーは開発者が DNS エントリをプリフェッチできるように <link rel="dns-prefetch"> を公開しています。これは近い将来ホストに接続する必要があることがわかっている場合に初期 DNS ルックアップを回避するために役立ちます。
Bun では、dns.prefetch API を使用して同じ効果を得ることができます。
import { dns } from "bun";
dns.prefetch("my.database-host.com", 5432);これを使用する必要がある例としては、データベースドライバーがあります。アプリケーションの起動時に、データベースホストの DNS エントリをプリフェッチできます。これにより、すべての読み込みが完了する頃には、データベースホストを解決するための DNS クエリがすでに完了している可能性があります。
dns.prefetch
DNS エントリをプリフェッチするには、dns.prefetch API を使用できます。この API は、近い将来ホストに接続する必要があり、初期 DNS ルックアップを回避したい場合に役立ちます。
dns.prefetch(hostname: string, port: number): void;以下に例を示します。
import { dns } from "bun";
dns.prefetch("bun.com", 443);
//
// ... しばらくして ...
await fetch("https://bun.com");dns.getCacheStats()
現在のキャッシュ統計を取得するには、dns.getCacheStats API を使用できます。この API は以下のプロパティを持つオブジェクトを返します。
{
cacheHitsCompleted: number; // キャッシュヒットが完了した数
cacheHitsInflight: number; // 進行中のキャッシュヒット数
cacheMisses: number; // キャッシュミス数
size: number; // DNS キャッシュ内のアイテム数
errors: number; // 接続が失敗した回数
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 Virtual Machine に対して 5 秒を推奨 していますが、JVM はデフォルトで無期限にキャッシュします。