Skip to content

Bun implémente son propre module dns, ainsi que le module node:dns.

ts
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 }, ...]
ts
import { dns } from "bun";

dns.prefetch("bun.com", 443);

Mise en cache DNS dans Bun

Bun prend en charge la mise en cache DNS. Ce cache rend les connexions répétées aux mêmes hôtes plus rapides.

Au moment de la rédaction, nous mettons en cache jusqu'à 255 entrées pendant un maximum de 30 secondes (chacune). Si des connexions à un hôte échouent, nous supprimons l'entrée du cache. Lorsque plusieurs connexions sont établies simultanément au même hôte, les recherches DNS sont dédupliquées pour éviter d'effectuer plusieurs requêtes pour le même hôte.

Ce cache est automatiquement utilisé par :

  • bun install
  • fetch()
  • node:http (client)
  • Bun.connect
  • node:net
  • node:tls

Quand dois-je précharger une entrée DNS ?

Les navigateurs web exposent <link rel="dns-prefetch"> pour permettre aux développeurs de précharger les entrées DNS. Cela est utile lorsque vous savez que vous devrez vous connecter à un hôte dans un avenir proche et que vous souhaitez éviter la recherche DNS initiale.

Dans Bun, vous pouvez utiliser l'API dns.prefetch pour obtenir le même effet.

ts
import { dns } from "bun";

dns.prefetch("my.database-host.com", 5432);

Un exemple où vous pourriez vouloir utiliser ceci est un pilote de base de données. Lorsque votre application démarre pour la première fois, vous pouvez précharger l'entrée DNS pour l'hôte de la base de données afin que lorsqu'elle aura fini de tout charger, la requête DNS pour résoudre l'hôte de la base de données puisse déjà être terminée.

dns.prefetch

Pour précharger une entrée DNS, vous pouvez utiliser l'API dns.prefetch. Cette API est utile lorsque vous savez que vous devrez vous connecter à un hôte bientôt et que vous souhaitez éviter la recherche DNS initiale.

ts
dns.prefetch(hostname: string, port: number): void;

Voici un exemple :

ts
import { dns } from "bun";

dns.prefetch("bun.com", 443);
//
// ... quelque temps plus tard ...
await fetch("https://bun.com");

dns.getCacheStats()

Pour obtenir les statistiques actuelles du cache, vous pouvez utiliser l'API dns.getCacheStats. Cette API renvoie un objet avec les propriétés suivantes :

ts
{
  cacheHitsCompleted: number; // Requêtes DNS réussies depuis le cache
  cacheHitsInflight: number; // Requêtes DNS en cours depuis le cache
  cacheMisses: number; // Échecs du cache
  size: number; // Nombre d'éléments dans le cache DNS
  errors: number; // Nombre de fois où une connexion a échoué
  totalCount: number; // Nombre total de fois où une connexion a été demandée (y compris les succès et échecs du cache)
}

Exemple :

ts
import { dns } from "bun";

const stats = dns.getCacheStats();
console.log(stats);
// => { cacheHitsCompleted: 0, cacheHitsInflight: 0, cacheMisses: 0, size: 0, errors: 0, totalCount: 0 }

Configuration du TTL du cache DNS

Bun utilise par défaut 30 secondes pour le TTL des entrées du cache DNS. Pour modifier cela, vous pouvez définir la variable d'environnement $BUN_CONFIG_DNS_TIME_TO_LIVE_SECONDS. Par exemple, pour définir le TTL à 5 secondes :

sh
BUN_CONFIG_DNS_TIME_TO_LIVE_SECONDS=5 bun run my-script.ts

Pourquoi 30 secondes est la valeur par défaut ?

Malheureusement, l'API système sous-jacente (getaddrinfo) ne fournit pas de moyen d'obtenir le TTL d'une entrée DNS. Cela signifie que nous devons choisir un nombre arbitrairement. Nous avons choisi 30 secondes car c'est assez long pour voir les avantages de la mise en cache, et assez court pour qu'il soit peu probable que cela cause des problèmes si une entrée DNS change. Amazon Web Services recommande 5 secondes pour la machine virtuelle Java, cependant la JVM met par défaut en cache indéfiniment.

Bun édité par www.bunjs.com.cn