Bun implementiert sein eigenes dns-Modul sowie das node:dns-Modul.
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);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 installfetch()node:http(Client)Bun.connectnode:netnode: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.
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.
dns.prefetch(hostname: string, port: number): void;Hier ist ein Beispiel:
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:
{
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:
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:
BUN_CONFIG_DNS_TIME_TO_LIVE_SECONDS=5 bun run my-script.tsWarum 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.