DNS தொகுதிக்கு அறிமுகம்
DNS (டொமைன் நேம் சிஸ்டம்) தொகுதி Node.js இல் பெயர் தீர்மானத்திற்கான செயல்பாட்டை வழங்குகிறது.
இது இரண்டு முக்கிய APIகளை வழங்குகிறது:
Callback-அடிப்படையிலான API
பாரம்பரிய Node.js பாணி callback செயல்பாடுகளுடன்
Promise-அடிப்படையிலான API
நவீன async/await ஆதரவு dns.promises மூலம்
முக்கிய அம்சங்கள்:
- டொமைன் பெயர்களை IP முகவரிகளாக தீர்மானித்தல் (A/AAAA records)
- தலைகீழ் DNS lookups செயல்படுத்துதல் (PTR records)
- பல்வேறு DNS record வகைகளை வினவுதல் (MX, TXT, SRV, முதலியன)
- குறிப்பிட்ட அமைப்புகளுடன் தனிப்பயன் DNS resolvers உருவாக்குதல்
- நிரலாக்க ரீதியாக DNS சேவையக அமைப்புகளை கட்டமைத்தல்
குறிப்பு:
DNS தொகுதி இரண்டு தனித்துவமான முறைகளில் செயல்பட முடியும் - இயக்க முறைமையின் வசதிகளைப் பயன்படுத்துதல் அல்லது நேரடி நெட்வொர்க் DNS வினவல்களை செயல்படுத்துதல்.
இது உங்கள் பயன்பாட்டில் hostname தீர்மானம் எவ்வாறு செயல்படுகிறது என்பதை பாதிக்கிறது.
DNS உடன் தொடங்குதல்
ஒரு டொமைனின் IP முகவரியைப் பார்க்க DNS தொகுதியைப் பயன்படுத்துவதற்கான விரைவான எடுத்துக்காட்டு இங்கே:
அடிப்படை DNS Lookup
const dns = require('dns');
// Look up a domain name
dns.lookup('example.com', (err, address, family) => {
if (err) {
console.error('Lookup error:', err);
return;
}
console.log(`IP address: ${address}`);
console.log(`IP version: IPv${family}`);
});
இறக்குமதி செய்தல் மற்றும் அமைப்பு
DNS தொகுதியைப் பயன்படுத்த, callback அல்லது promise-அடிப்படையிலான API ஐப் பயன்படுத்தி உங்கள் Node.js பயன்பாட்டில் அதை இறக்குமதி செய்யலாம்:
Callback-அடிப்படையிலான API
// Import the DNS module
const dns = require('dns');
// Example usage
dns.lookup('example.com', (err, address, family) => {
if (err) throw err;
console.log(`Resolved: ${address} (IPv${family})`);
});
Promise-அடிப்படையிலான API (Node.js 10.0.0+)
// Import the promises API
const { promises: dns } = require('dns');
// Or: const dns = require('dns').promises;
// Example with async/await
async function lookupDomain(domain) {
try {
const address = await dns.lookup(domain);
console.log(`Resolved: ${address.address} (IPv${address.family})`);
} catch (err) {
console.error('Lookup failed:', err);
}
}
lookupDomain('example.com');
குறிப்பு:
Promise-அடிப்படையிலான API பொதுவாக புதிய குறியீட்டிற்கு முன்னுரிமை அளிக்கப்படுகிறது, ஏனெனில் இது நவீன async/await முறைகளுடன் சிறப்பாக வேலை செய்கிறது மற்றும் சிறந்த பிழை கையாளலை வழங்குகிறது.
அடிப்படை DNS Lookups
DNS தொகுதி டொமைன் பெயர்கள் மற்றும் IP முகவரிகளைப் பார்க்க பல முறைகளை வழங்குகிறது. மிகவும் பொதுவான செயல்பாடுகள்:
dns.lookup()
hostnames தீர்க்க இயக்க முறைமையின் வசதிகளைப் பயன்படுத்துகிறது
dns.resolve*()
பெயர் சேவையகங்களுக்கு நேரடியாக DNS வினவல்களை செயல்படுத்துகிறது
dns.reverse()
தலைகீழ் DNS lookups செயல்படுத்துகிறது (IP to hostname)
டொமைன் பெயர்களை IP முகவரிகளாக தீர்மானித்தல்
const dns = require('dns');
// Callback-based API
dns.lookup('www.example.com', (err, address, family) => {
if (err) throw err;
console.log('IP address: %s', address);
console.log('IP version: IPv%s', family);
});
const dns = require('dns').promises;
// Promise-based API
async function lookupExample() {
try {
const result = await dns.lookup('www.example.com');
console.log('IP address:', result.address);
console.log('IP version: IPv' + result.family);
} catch (err) {
console.error('Lookup failed:', err);
}
}
lookupExample();
குறிப்பு:
dns.lookup() முறை பெயர் தீர்மானத்திற்கு இயக்க முறைமையின் வசதிகளைப் பயன்படுத்துகிறது மற்றும் எந்த நெட்வொர்க் தகவல்தொடர்பையும் அவசியம் செயல்படுத்தாது.
ஒரு டொமைனுக்கான அனைத்து IP முகவரிகளையும் பார்த்தல்
const dns = require('dns');
// Get all IPv4 addresses
dns.resolve4('www.google.com', (err, addresses) => {
if (err) throw err;
console.log('IPv4 addresses:');
addresses.forEach(address => {
console.log(` ${address}`);
});
// Perform a reverse lookup on the first IP
dns.reverse(addresses[0], (err, hostnames) => {
if (err) throw err;
console.log(`Reverse lookup for ${addresses[0]}:`);
hostnames.forEach(hostname => {
console.log(` ${hostname}`);
});
});
});
DNS Record வகைகள்
DNS தொகுதி பல்வேறு DNS record வகைகளுக்கான lookups ஆதரிக்கிறது:
| முறை | Record வகை | விளக்கம் |
|---|---|---|
| resolve4() | A | IPv4 முகவரிகள் |
| resolve6() | AAAA | IPv6 முகவரிகள் |
| resolveMx() | MX | மெயில் exchange records |
| resolveTxt() | TXT | உரை records |
| resolveSrv() | SRV | சேவை records |
| resolveNs() | NS | பெயர் சேவையக records |
| resolveCname() | CNAME | Canonical name records |
| resolveSoa() | SOA | Start of authority records |
| resolvePtr() | PTR | Pointer records |
| resolveNaptr() | NAPTR | Name authority pointer records |
| resolveAny() | ANY | Any records |
மேம்பட்ட DNS செயல்பாடுகள்
1. தனிப்பயன் DNS தீர்மானம்
DNS lookups மேல் அதிக கட்டுப்பாட்டிற்காக குறிப்பிட்ட அமைப்புகளுடன் ஒரு தனிப்பயன் DNS resolver உருவாக்கவும்:
const dns = require('dns');
// Create a new resolver
const resolver = new dns.Resolver();
// Set custom server (Google's public DNS)
resolver.setServers(['8.8.8.8', '8.8.4.4']);
// Use the custom resolver
resolver.resolve4('www.example.com', (err, addresses) => {
if (err) throw err;
console.log('Addresses resolved using Google DNS:');
addresses.forEach(addr => {
console.log(` ${addr}`);
});
});
// See what servers are configured
console.log('Current resolver servers:', resolver.getServers());
குறிப்பு:
தனிப்பயன் resolver உருவாக்குவது பயனுள்ளதாக இருக்கும், நீங்கள் கணினியின் இயல்புநிலைகளுக்குப் பதிலாக குறிப்பிட்ட DNS சேவையகங்களைப் பயன்படுத்த விரும்பும் போது, அல்லது வெவ்வேறு lookups க்கு வெவ்வேறு அமைப்புகள் தேவைப்படும் போது.
2. நெட்வொர்க் vs. இயக்க முறைமை நிலை தீர்மானம்
DNS தொகுதி பெயர் தீர்மானத்திற்கு இரண்டு வெவ்வேறு அணுகுமுறைகளை வழங்குகிறது:
| செயல்பாடு | செயல்படுத்தல் | நெட்வொர்க் அழைப்புகள் | பயன்படுத்துகிறது |
|---|---|---|---|
| dns.lookup() | getaddrinfo() system call ஐப் பயன்படுத்துகிறது | நேரடி நெட்வொர்க் அழைப்புகள் இல்லை | உள்ளூர் கட்டமைப்பைப் பின்பற்றுகிறது (hosts கோப்பு, முதலியன) |
| dns.resolve*(), dns.reverse() | உண்மையான நெட்வொர்க் கோரிக்கைகளை செய்கிறது | எப்போதும் DNS சேவையகங்களுடன் இணைகிறது | உள்ளூர் கட்டமைப்பைத் தவிர்க்கிறது, நேரடி DNS வினவல்கள் |
எச்சரிக்கை:
இந்த வேறுபாடுகள் காரணமாக, dns.lookup() மற்றும் dns.resolve*() முறைகளிலிருந்து வரும் முடிவுகள் எப்போதும் பொருந்தாமல் இருக்கலாம், குறிப்பாக தனிப்பயன் host கட்டமைப்புகள் உள்ள சூழல்களில்.
3. பிழை கையாளுதல் மற்றும் மீண்டும் முயற்சிகள்
வலுவான DNS கையாளுதலுக்கு சரியான பிழை மேலாண்மை தேவை. பொதுவான DNS பிழைகளைக் கையாள்வது மற்றும் மீண்டும் முயற்சி தர்க்கத்தை செயல்படுத்துவது எப்படி என்பது இங்கே:
const dns = require('dns');
function lookupWithErrorHandling(domain) {
dns.lookup(domain, (err, address, family) => {
if (err) {
console.error(`DNS lookup failed for ${domain}`);
// Check specific error codes
switch (err.code) {
case 'ENOTFOUND':
console.error(' Domain name not found');
break;
case 'ETIMEDOUT':
console.error(' DNS lookup timed out');
break;
case 'ENODATA':
console.error(' Domain exists but no data of requested type');
break;
case 'ESERVFAIL':
console.error(' DNS server returned general failure');
break;
default:
console.error(` Error code: ${err.code}`);
}
return;
}
console.log(`DNS lookup successful for ${domain}`);
console.log(` IP address: ${address}`);
console.log(` IP version: IPv${family}`);
});
}
// Test with valid and invalid domains
lookupWithErrorHandling('www.google.com');
lookupWithErrorHandling('this-domain-does-not-exist-123456789.com');
குறிப்பு:
DNS பிழைகள் நெட்வொர்க் சிக்கல்கள் அல்லது DNS பரவல் தாமதங்கள் காரணமாக தற்காலிகமாக இருக்கலாம்.
உற்பத்தி பயன்பாடுகளில், நீங்கள் அதிவேக பின்வாங்கல் மூலம் மீண்டும் முயற்சி தர்க்கத்தை செயல்படுத்த விரும்பலாம்.
செயல்திறன் மேம்படுத்தல்
DNS lookups பயன்பாடுகளில் செயல்திறன் தடையாக இருக்கலாம். DNS தீர்மானத்தை மேம்படுத்துவதற்கான உத்திகள் இங்கே:
1. Caching
அதே டொமைனுக்கான மீண்டும் மீண்டும் lookups தவிர்க்க ஒரு எளிய DNS cache ஐ செயல்படுத்தவும்:
const dns = require('dns');
const util = require('util');
const lookup = util.promisify(dns.lookup);
const dnsCache = new Map();
async function cachedLookup(domain) {
if (dnsCache.has(domain)) {
console.log('Cache hit for:', domain);
return dnsCache.get(domain);
}
console.log('Cache miss for:', domain);
const result = await lookup(domain);
dnsCache.set(domain, result);
return result;
}
// Example usage
(async () => {
const domains = ['google.com', 'facebook.com', 'google.com'];
for (const domain of domains) {
const result = await cachedLookup(domain);
console.log(`${domain} → ${result.address}`);
}
})();
2. Parallel Lookups
பல DNS lookups ஐ இணையாக செயல்படுத்த Promise.all() ஐப் பயன்படுத்தவும்:
const dns = require('dns').promises;
async function lookupMultiple(domains) {
try {
const lookups = domains.map(domain => dns.lookup(domain));
const results = await Promise.all(lookups);
return domains.map((domain, i) => ({
domain,
...results[i]
}));
} catch (err) {
console.error('One or more lookups failed:', err);
throw err;
}
}
// Example usage
lookupMultiple(['google.com', 'facebook.com', 'github.com'])
.then(results => console.log(results))
.catch(console.error);
3. தனிப்பயன் Resolvers மற்றும் Timeouts
சிறந்த கட்டுப்பாட்டிற்காக தனிப்பயன் DNS சேவையகங்கள் மற்றும் timeouts ஐ கட்டமைக்கவும்:
const dns = require('dns');
const { Resolver } = dns;
// Create a custom resolver with timeout
const resolver = new Resolver();
resolver.setServers(['8.8.8.8', '1.1.1.1']); // Google and Cloudflare DNS
// Set timeout for all operations (in ms)
const TIMEOUT = 2000;
async function resolveWithTimeout(domain, rrtype = 'A') {
return new Promise((resolve, reject) => {
const timer = setTimeout(() => {
reject(new Error(`DNS query timed out after ${TIMEOUT}ms`));
}, TIMEOUT);
resolver.resolve(domain, rrtype, (err, addresses) => {
clearTimeout(timer);
if (err) return reject(err);
resolve(addresses);
});
});
}
// Example usage
resolveWithTimeout('example.com')
.then(console.log)
.catch(console.error);
DNS தொகுதி vs. Third-Party DNS நூலகங்கள்
| அம்சம் | Node.js DNS தொகுதி | Third-Party நூலகங்கள் |
|---|---|---|
| நிறுவல் | உள்ளமைக்கப்பட்ட, எந்த சார்புகளும் இல்லை | நிறுவல் மற்றும் மேலாண்மை தேவை |
| அம்ச தொகுப்பு | அடிப்படை DNS செயல்பாடுகள் | பெரும்பாலும் மிகவும் விரிவான |
| Caching | உள்ளமைக்கப்படவில்லை | பெரும்பாலும் caching உள்ளடக்கியது |
| மேம்பட்ட அம்சங்கள் | வரையறுக்கப்பட்ட | DNSSEC, DoH, DoT ஆதரவை உள்ளடக்கியிருக்கலாம் |
| செயல்திறன் | அடிப்படை பயன்பாட்டிற்கு நல்லது | குறிப்பிட்ட பயன்பாட்டு நிகழ்வுகளுக்கு மேம்படுத்தப்படலாம் |
Node.js க்கான பிரபலமான third-party DNS நூலகங்கள்:
- dns-packet: குறைந்த-நிலை DNS பாக்கெட் குறியாக்கம்/குறிவிலக்கம்
- native-dns: மிகவும் முழுமையான DNS செயல்படுத்தல்
- dns2: Promise ஆதரவுடன் நவீன DNS நூலகம்
சுருக்கம்
Node.js DNS தொகுதி டொமைன் நேம் சிஸ்டத்துடன் தொடர்பு கொள்வதற்கான அத்தியாவசிய செயல்பாட்டை வழங்குகிறது. முக்கிய அம்சங்கள்:
டொமைன் பெயர்களை IP முகவரிகளாகப் பார்த்தல்
டொமைன் பெயர்களை IP முகவரிகளாக தீர்மானித்தல்
பல்வேறு DNS record வகைகளை தீர்மானித்தல்
A, AAAA, MX, TXT, முதலியன
தலைகீழ் DNS lookups செயல்படுத்துதல்
IP முகவரிகளை டொமைன் பெயர்களாக தீர்மானித்தல்
குறிப்பிட்ட அமைப்புகளுடன் தனிப்பயன் resolvers உருவாக்குதல்
விருப்ப DNS சேவையகங்கள் மற்றும் அமைப்புகள்
இரண்டு APIகள்
Callback-அடிப்படையிலான மற்றும் Promise-அடிப்படையிலான
DNS தொகுதியைப் புரிந்துகொள்வது, டொமைன் பெயரால் நெட்வொர்க் வளங்களுடன் தொடர்பு கொள்ள வேண்டிய பயன்பாடுகளுக்கு, தனிப்பயன் பெயர் தீர்மான தர்க்கத்தை செயல்படுத்துவதற்கு அல்லது டொமைன் தொடர்பான தகவலைச் சரிபார்க்க முக்கியமானது.