Skip to content

O Bun implementa seu próprio módulo dns, e o 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);

Cache DNS no Bun

O Bun suporta cache DNS. Este cache torna as conexões repetidas aos mesmos hosts mais rápidas.

No momento, fazemos cache de até 255 entradas por um máximo de 30 segundos (cada). Se alguma conexão a um host falhar, removemos a entrada do cache. Quando múltiplas conexões são feitas ao mesmo host simultaneamente, as consultas DNS são deduplicadas para evitar fazer múltiplas requisições para o mesmo host.

Este cache é automaticamente usado por:

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

Quando devo fazer prefetch de uma entrada DNS?

Browsers expõem <link rel="dns-prefetch"> para permitir que desenvolvedores façam prefetch de entradas DNS. Isto é útil quando você sabe que precisará conectar a um host em um futuro próximo e quer evitar a consulta DNS inicial.

No Bun, você pode usar a API dns.prefetch para alcançar o mesmo efeito.

ts
import { dns } from "bun";

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

Um exemplo onde você pode querer usar isto é um driver de banco de dados. Quando sua aplicação inicia pela primeira vez, você pode fazer prefetch da entrada DNS para o host do banco de dados para que quando terminar de carregar tudo, a consulta DNS para resolver o host do banco de dados já pode estar completa.

dns.prefetch

Para fazer prefetch de uma entrada DNS, você pode usar a API dns.prefetch. Esta API é útil quando você sabe que precisará conectar a um host em breve e quer evitar a consulta DNS inicial.

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

Aqui está um exemplo:

ts
import { dns } from "bun";

dns.prefetch("bun.com", 443);
//
// ... algum tempo depois ...
await fetch("https://bun.com");

dns.getCacheStats()

Para obter as estatísticas atuais do cache, você pode usar a API dns.getCacheStats. Esta API retorna um objeto com as seguintes propriedades:

ts
{
  cacheHitsCompleted: number; // Cache hits completados
  cacheHitsInflight: number; // Cache hits em andamento
  cacheMisses: number; // Cache misses
  size: number; // Número de itens no cache DNS
  errors: number; // Número de vezes que uma conexão falhou
  totalCount: number; // Número de vezes que uma conexão foi solicitada (incluindo cache hits e misses)
}

Exemplo:

ts
import { dns } from "bun";

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

Configurando TTL do cache DNS

O Bun usa padrão de 30 segundos para o TTL de entradas de cache DNS. Para mudar isto, você pode definir a variável de ambiente $BUN_CONFIG_DNS_TIME_TO_LIVE_SECONDS. Por exemplo, para definir o TTL para 5 segundos:

sh
BUN_CONFIG_DNS_TIME_TO_LIVE_SECONDS=5 bun run my-script.ts

Por que 30 segundos é o padrão?

Infelizmente, a API do sistema por baixo (getaddrinfo) não fornece uma maneira de obter o TTL de uma entrada DNS. Isto significa que temos que escolher um número arbitrariamente. Escolhemos 30 segundos porque é tempo suficiente para ver os benefícios do cache, e curto o suficiente para ser improvável causar problemas se uma entrada DNS mudar. Amazon Web Services recomenda 5 segundos para a Java Virtual Machine, no entanto a JVM padrão faz cache indefinidamente.

Bun by www.bunjs.com.cn edit