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 항목을 언제 프리페치해야 하나요?
웹 브라우저는 개발자가 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 은 기본적으로 무제한으로 캐시합니다.