Skip to content

Bun implementiert sein eigenes dns-Modul sowie das node:dns-Modul.

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);

DNS-Caching in Bun

Bun unterstützt DNS-Caching. Dieser Cache macht wiederholte Verbindungen zu denselben Hosts schneller.

Zum Zeitpunkt der Schreibweise cachen wir bis zu 255 Einträge für maximal 30 Sekunden (jeweils). Wenn Verbindungen zu einem Host fehlschlagen, entfernen wir den Eintrag aus dem Cache. Wenn mehrere Verbindungen gleichzeitig zum selben Host hergestellt werden, werden DNS-Lookups dedupliziert, um mehrere Anfragen für denselben Host zu vermeiden.

Dieser Cache wird automatisch verwendet von:

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

Wann sollte ich einen DNS-Eintrag vorab laden?

Webbrowser stellen <link rel="dns-prefetch"> bereit, um Entwicklern das Vorabladen von DNS-Einträgen zu ermöglichen. Dies ist nützlich, wenn Sie wissen, dass Sie in naher Zukunft eine Verbindung zu einem Host herstellen müssen und den anfänglichen DNS-Lookup vermeiden möchten.

In Bun können Sie die dns.prefetch-API verwenden, um denselben Effekt zu erzielen.

ts
import { dns } from "bun";

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

Ein Beispiel, bei dem Sie dies verwenden möchten, ist ein Datenbank-Treiber. Wenn Ihre Anwendung zum ersten Mal startet, können Sie den DNS-Eintrag für den Datenbank-Host vorab laden, sodass die DNS-Abfrage zum Auflösen des Datenbank-Hosts möglicherweise bereits abgeschlossen ist, wenn das Laden aller Komponenten beendet ist.

dns.prefetch

Um einen DNS-Eintrag vorab zu laden, können Sie die dns.prefetch-API verwenden. Diese API ist nützlich, wenn Sie wissen, dass Sie bald eine Verbindung zu einem Host herstellen müssen und den anfänglichen DNS-Lookup vermeiden möchten.

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

Hier ist ein Beispiel:

ts
import { dns } from "bun";

dns.prefetch("bun.com", 443);
//
// ... etwas später ...
await fetch("https://bun.com");

dns.getCacheStats()

Um die aktuellen Cache-Statistiken abzurufen, können Sie die dns.getCacheStats-API verwenden. Diese API gibt ein Objekt mit den folgenden Eigenschaften zurück:

ts
{
  cacheHitsCompleted: number; // Abgeschlossene Cache-Treffer
  cacheHitsInflight: number; // Laufende Cache-Treffer
  cacheMisses: number; // Cache-Fehlschläge
  size: number; // Anzahl der Elemente im DNS-Cache
  errors: number; // Anzahl der fehlgeschlagenen Verbindungen
  totalCount: number; // Anzahl der angeforderten Verbindungen insgesamt (einschließlich Cache-Treffer und Fehlschläge)
}

Beispiel:

ts
import { dns } from "bun";

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

Konfigurieren der DNS-Cache-TTL

Bun verwendet standardmäßig 30 Sekunden für die TTL von DNS-Cache-Einträgen. Um dies zu ändern, können Sie die Umgebungsvariable $BUN_CONFIG_DNS_TIME_TO_LIVE_SECONDS setzen. Um beispielsweise die TTL auf 5 Sekunden zu setzen:

sh
BUN_CONFIG_DNS_TIME_TO_LIVE_SECONDS=5 bun run my-script.ts

Warum ist 30 Sekunden der Standardwert?

Leider bietet die System-API darunter (getaddrinfo) keine Möglichkeit, die TTL eines DNS-Eintrags abzurufen. Das bedeutet, wir müssen eine Zahl willkürlich wählen. Wir haben 30 Sekunden gewählt, weil es lang genug ist, um die Vorteile des Cachings zu sehen, und kurz genug, um unwahrscheinlich Probleme zu verursachen, wenn sich ein DNS-Eintrag ändert. Amazon Web Services empfiehlt 5 Sekunden für die Java Virtual Machine, wobei die JVM standardmäßig unbegrenzt cached.

Bun von www.bunjs.com.cn bearbeitet