Skip to content

Bun implementa su propio módulo dns, y el módulo 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);

Caché DNS en Bun

Bun soporta caché DNS. Esta caché hace que las conexiones repetidas a los mismos hosts sean más rápidas.

Al momento de escribir esto, almacenamos en caché hasta 255 entradas por un máximo de 30 segundos (cada una). Si alguna conexión a un host falla, eliminamos la entrada de la caché. Cuando se realizan múltiples conexiones al mismo host simultáneamente, las búsquedas DNS se deduplican para evitar hacer múltiples solicitudes para el mismo host.

Esta caché es usada automáticamente por:

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

¿Cuándo debo hacer prefetch de una entrada DNS?

Los navegadores web exponen <link rel="dns-prefetch"> para permitir a los desarrolladores hacer prefetch de entradas DNS. Esto es útil cuando sabes que necesitarás conectarte a un host en el futuro cercano y quieres evitar la búsqueda DNS inicial.

En Bun, puedes usar la API dns.prefetch para lograr el mismo efecto.

ts
import { dns } from "bun";

dns.prefetch("mi-host-base-datos.com", 5432);

Un ejemplo donde podrías querer usar esto es un controlador de base de datos. Cuando tu aplicación se inicia por primera vez, puedes hacer prefetch de la entrada DNS para el host de la base de datos para que cuando termine de cargar todo, la consulta DNS para resolver el host de la base de datos ya pueda estar completada.

dns.prefetch

Para hacer prefetch de una entrada DNS, puedes usar la API dns.prefetch. Esta API es útil cuando sabes que necesitarás conectarte a un host pronto y quieres evitar la búsqueda DNS inicial.

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

Aquí hay un ejemplo:

ts
import { dns } from "bun";

dns.prefetch("bun.com", 443);
//
// ... algún tiempo después ...
await fetch("https://bun.com");

dns.getCacheStats()

Para obtener las estadísticas actuales de la caché, puedes usar la API dns.getCacheStats. Esta API devuelve un objeto con las siguientes propiedades:

ts
{
  cacheHitsCompleted: number; // Aciertos de caché completados
  cacheHitsInflight: number; // Aciertos de caché en vuelo
  cacheMisses: number; // Fallos de caché
  size: number; // Número de elementos en la caché DNS
  errors: number; // Número de veces que falló una conexión
  totalCount: number; // Número de veces que se solicitó una conexión en total (incluyendo aciertos y fallos de caché)
}

Ejemplo:

ts
import { dns } from "bun";

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

Configurar TTL de caché DNS

Bun usa 30 segundos por defecto para el TTL de las entradas de caché DNS. Para cambiar esto, puedes establecer la variable de entorno $BUN_CONFIG_DNS_TIME_TO_LIVE_SECONDS. Por ejemplo, para establecer el TTL a 5 segundos:

sh
BUN_CONFIG_DNS_TIME_TO_LIVE_SECONDS=5 bun run my-script.ts

¿Por qué 30 segundos es el predeterminado?

Desafortunadamente, la API del sistema subyacente (getaddrinfo) no proporciona una forma de obtener el TTL de una entrada DNS. Esto significa que tenemos que elegir un número arbitrariamente. Elegimos 30 segundos porque es lo suficientemente largo para ver los beneficios de la caché, y lo suficientemente corto para que sea poco probable que cause problemas si una entrada DNS cambia. Amazon Web Services recomienda 5 segundos para la Máquina Virtual Java, sin embargo la JVM predetermina la caché indefinidamente.

Bun por www.bunjs.com.cn editar