ينفذ Bun وحدة dns الخاصة به، ووحدة node:dns.
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 في Bun
يدعم Bun التخزين المؤقت لـ DNS. يجعل هذا التخزين المؤقت الاتصالات المتكررة لنفس المضيفين أسرع.
في وقت الكتابة، نخزن ما يصل إلى 255 إدخالًا كحد أقصى لمدة 30 ثانية (لكل منها). إذا فشلت أي اتصالات بمضيف، نقوم بإزالة الإدخال من التخزين المؤقت. عند إجراء اتصالات متعددة لنفس المضيف في وقت واحد، يتم إهدار عمليات بحث DNS لتجنب إجراء طلبات متعددة لنفس المضيف.
يتم استخدام هذا التخزين المؤقت تلقائيًا بواسطة:
bun installfetch()node:http(العميل)Bun.connectnode:netnode:tls
متى يجب أن أقوم بالجلب المسبق لإدخال DNS؟
تعرض متصفحات الويب <link rel="dns-prefetch"> للسماح للمطورين بالجلب المسبق لإدخالات DNS. هذا مفيد عندما تعرف أنك ستحتاج للاتصال بمضيف في المستقبل القريب وتريد تجنب بحث DNS الأولي.
في Bun، يمكنك استخدام واجهة برمجة تطبيقات dns.prefetch لتحقيق نفس التأثير.
import { dns } from "bun";
dns.prefetch("my.database-host.com", 5432);مثال على حيث قد ترغب في استخدام هذا هو برنامج تشغيل قاعدة بيانات. عندما يبدأ تطبيقك لأول مرة، يمكنك الجلب المسبق لإدخال DNS لمضيف قاعدة البيانات بحيث بحلول الوقت الذي ينتهي فيه من تحميل كل شيء، قد يكون استعلام DNS لحل مضيف قاعدة البيانات مكتملًا بالفعل.
dns.prefetch
للجلب المسبق لإدخال DNS، يمكنك استخدام واجهة برمجة تطبيقات dns.prefetch. واجهة برمجة التطبيقات هذه مفيدة عندما تعرف أنك ستحتاج للاتصال بمضيف قريبًا وتريد تجنب بحث DNS الأولي.
dns.prefetch(hostname: string, port: number): void;إليك مثال:
import { dns } from "bun";
dns.prefetch("bun.com", 443);
//
// ... في وقت لاحق ...
await fetch("https://bun.com");dns.getCacheStats()
للحصول على إحصائيات التخزين المؤقت الحالية، يمكنك استخدام واجهة برمجة تطبيقات dns.getCacheStats. واجهة برمجة التطبيقات هذه ترجع كائنًا بالخصائص التالية:
{
cacheHitsCompleted: number; // عمليات جلب ناجحة من التخزين المؤقت مكتملة
cacheHitsInflight: number; // عمليات جلب ناجحة من التخزين المؤقت قيد التنفيذ
cacheMisses: number; // عمليات فشل في العثور على التخزين المؤقت
size: number; // عدد العناصر في تخزين DNS المؤقت
errors: number; // عدد مرات فشل الاتصال
totalCount: number; // عدد مرات طلب اتصال على الإطلاق (بما في ذلك عمليات التخزين المؤقت الناجحة والفاشلة)
}مثال:
import { dns } from "bun";
const stats = dns.getCacheStats();
console.log(stats);
// => { cacheHitsCompleted: 0, cacheHitsInflight: 0, cacheMisses: 0, size: 0, errors: 0, totalCount: 0 }تكوين TTL للتخزين المؤقت لـ DNS
يفترض Bun 30 ثانية كـ TTL لإدخالات تخزين DNS المؤقت. لتغيير هذا، يمكنك تعيين متغير البيئة $BUN_CONFIG_DNS_TIME_TO_LIVE_SECONDS. على سبيل المثال، لتعيين TTL إلى 5 ثوانٍ:
BUN_CONFIG_DNS_TIME_TO_LIVE_SECONDS=5 bun run my-script.tsلماذا 30 ثانية هي الافتراضية؟
لسوء الحظ، لا توفر واجهة برمجة تطبيقات النظام الأساسية (getaddrinfo) طريقة للحصول على TTL لإدخال DNS. هذا يعني أننا يجب أن نختار رقمًا بشكل تعسفي. اخترنا 30 ثانية لأنها طويلة بما يكفي لرؤية فوائد التخزين المؤقت، وقصيرة بما يكفي لعدم التسبب في مشاكل على الأرجح إذا تغير إدخال DNS. توصي Amazon Web Services بـ 5 ثوانٍ لـ Java Virtual Machine، ومع ذلك فإن JVM افتراضيًا تخزن مؤقتًا إلى أجل غير مسمى.