Bun implementa il proprio modulo dns e il modulo 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);Cache DNS in Bun
Bun supporta la cache DNS. Questa cache rende le connessioni ripetute agli stessi host più veloci.
Al momento della scrittura, memorizziamo nella cache fino a 255 voci per un massimo di 30 secondi (ciascuna). Se qualsiasi connessione a un host fallisce, rimuoviamo la voce dalla cache. Quando vengono effettuate più connessioni contemporaneamente allo stesso host, le ricerche DNS sono deduplicate per evitare di effettuare richieste multiple per lo stesso host.
Questa cache viene automaticamente utilizzata da:
bun installfetch()node:http(client)Bun.connectnode:netnode:tls
Quando dovrei prefetchare una voce DNS?
I browser espongono <link rel="dns-prefetch"> per permettere agli sviluppatori di prefetchare voci DNS. Questo è utile quando sai che dovrai connetterti a un host nel prossimo futuro e vuoi evitare la ricerca DNS iniziale.
In Bun, puoi usare l'API dns.prefetch per ottenere lo stesso effetto.
import { dns } from "bun";
dns.prefetch("my.database-host.com", 5432);Un esempio dove potresti voler usare questo è un driver di database. Quando la tua applicazione si avvia per la prima volta, puoi prefetchare la voce DNS per l'host del database in modo che, quando termina di caricare tutto, la query DNS per risolvere l'host del database potrebbe già essere completata.
dns.prefetch
Per prefetchare una voce DNS, puoi usare l'API dns.prefetch. Questa API è utile quando sai che dovrai connetterti a un host presto e vuoi evitare la ricerca DNS iniziale.
dns.prefetch(hostname: string, port: number): void;Ecco un esempio:
import { dns } from "bun";
dns.prefetch("bun.com", 443);
//
// ... più tardi ...
await fetch("https://bun.com");dns.getCacheStats()
Per ottenere le statistiche della cache attuali, puoi usare l'API dns.getCacheStats. Questa API restituisce un oggetto con le seguenti proprietà:
{
cacheHitsCompleted: number; // Cache hits completati
cacheHitsInflight: number; // Cache hits in flight
cacheMisses: number; // Cache miss
size: number; // Numero di elementi nella cache DNS
errors: number; // Numero di volte che una connessione è fallita
totalCount: number; // Numero di volte che una connessione è stata richiesta in totale (inclusi cache hit e miss)
}Esempio:
import { dns } from "bun";
const stats = dns.getCacheStats();
console.log(stats);
// => { cacheHitsCompleted: 0, cacheHitsInflight: 0, cacheMisses: 0, size: 0, errors: 0, totalCount: 0 }Configurare il TTL della cache DNS
Bun usa come predefinito 30 secondi per il TTL delle voci della cache DNS. Per cambiarlo, puoi impostare la variabile d'ambiente $BUN_CONFIG_DNS_TIME_TO_LIVE_SECONDS. Ad esempio, per impostare il TTL a 5 secondi:
BUN_CONFIG_DNS_TIME_TO_LIVE_SECONDS=5 bun run my-script.tsPerché 30 secondi è il valore predefinito?
Sfortunatamente, l'API di sistema sottostante (getaddrinfo) non fornisce un modo per ottenere il TTL di una voce DNS. Questo significa che dobbiamo scegliere un numero arbitrariamente. Abbiamo scelto 30 secondi perché è abbastanza lungo da vedere i benefici della cache, e abbastanza corto da essere improbabile causare problemi se una voce DNS cambia. Amazon Web Services raccomanda 5 secondi per la Java Virtual Machine, tuttavia la JVM predefinita memorizza nella cache indefinitamente.