এজেন্ট বস্তু
Node.js Agent HTTP/HTTPS client . host port , host port socket .
দুটি প্রাথমিক এজেন্ট বাস্তবায়ন আছে:
http.Agent
HTTP সংযোগ পরিচালনা করতে
https.Agent
HTTPS সংযোগ পরিচালনা করতে
এজেন্ট আমদানি করা হচ্ছে
// HTTP মডিউল আমদানি করুন const http = প্রয়োজন('http'); // ডিফল্ট এজেন্ট const defaultAgent = http.globalAgent; // একটি কাস্টম এজেন্ট তৈরি করুন const customAgent = নতুন http.Agent({ KeepAlive: সত্য, সর্বোচ্চ সকেট: 25 });
এজেন্ট বৈশিষ্ট্য
| বৈশিষ্ট্য | ব্যাখ্যা |
|---|---|
| agent.freeSockets | KeepAlive সক্রিয় থাকলে সকেট ধারণকারী একটি বস্তু বর্তমানে এজেন্ট দ্বারা ব্যবহারের জন্য অপেক্ষা করছে। সরাসরি পরিবর্তন করবেন না |
| agent.maxFreeSockets | মুক্ত অবস্থায় খোলা যেতে পারে এমন সর্বোচ্চ সংখ্যক সকেট সেট করে। KeepAlive সত্যে সেট করা থাকলেই কেবল প্রাসঙ্গিক। ডিফল্ট: 256 |
| agent.maxSockets | একজন এজেন্টের উৎপত্তি প্রতি সর্বাধিক কতগুলি খোলা সকেট থাকতে পারে তা সেট করে। ডিফল্ট: ইনফিনিটি |
| agent.maxTotalSockets | সর্বাধিক সংখ্যক সকেট সেট করে যা সমস্ত উত্স জুড়ে খোলা যেতে পারে। ডিফল্ট: ইনফিনিটি |
| agent.requests | সারিবদ্ধ অনুরোধ সমন্বিত একটি বস্তু যা এখনও সকেটগুলিতে বরাদ্দ করা হয়নি। সরাসরি পরিবর্তন করবেন না |
| agent.sockets | এজেন্টের দ্বারা বর্তমানে ব্যবহৃত সকেটের বিন্যাস ধারণকারী একটি বস্তু। সরাসরি পরিবর্তন করবেন না |
এজেন্ট পদ্ধতি
| পদ্ধতি | ব্যাখ্যা |
|---|---|
| agent.createConnection(options[, callback]) | HTTP অনুরোধের জন্য ব্যবহার করার জন্য একটি সকেট/স্ট্রিম তৈরি করে। ডিফল্টরূপে, এই ফাংশন net.createConnection() ব্যবহার করে তবে এটি ওভাররাইড করা যেতে পারে |
| agent.destroy() | এজেন্টের দ্বারা বর্তমানে ব্যবহৃত যেকোন সকেট সাফ করে |
| agent.getName(options) | একটি সংযোগ পুনরায় ব্যবহার করা যাবে কিনা তা নির্ধারণ করতে ব্যবহৃত অনুরোধ বিকল্পগুলির সেটের জন্য একটি অনন্য নাম পায়৷ |
| agent.keepSocketAlive(socket) | সকেট কল করা হয় যখন একটি অনুরোধ বিচ্ছিন্ন করা হয় এবং এজেন্ট দ্বারা অব্যাহত থাকতে পারে। ডিফল্ট আচরণ হল freeSockets তালিকায় সকেট যোগ করা |
| agent.reuseSocket(socket, request) | সকেট কিপ-লাইভ বিকল্পগুলির কারণে প্রতিষ্ঠিত হওয়ার পরে একটি অনুরোধের সাথে সংযোগ করার সময় কল করা হয় |
ডিফল্ট এজেন্ট ব্যবহার করে
ডিফল্টরূপে, HTTP/HTTPS ক্লায়েন্ট অনুরোধগুলি গ্লোবাল এজেন্ট ব্যবহার করে (http.globalAgent বা https.globalAgent):
const http = প্রয়োজন('http'); // ডিফল্ট এজেন্ট ব্যবহার করে একটি অনুরোধ করুন http.get('http://example.com', (res) => { console.log(`স্থিতি কোড: ${res.statusCode}`); // গ্লোবাল এজেন্ট তথ্য প্রদর্শন করুন const agent = http.globalAgent; console.log(`বর্তমান সকেট: ${Object.keys(agent.sockets).length}`); console.log(`ফ্রি সকেট: ${Object.keys(agent.freeSockets).length}`); console.log(`সারিবদ্ধ অনুরোধ: ${Object.keys(agent.requests).length}`); // প্রতিক্রিয়া ডেটা ব্যবহার করুন res.resume(); }).on('error', (err) => { console.error(`ত্রুটি: ${err.message}`); });
একটি কাস্টম এজেন্ট তৈরি করা
একটি কাস্টম এজেন্ট নির্দিষ্ট সেটিংস দিয়ে তৈরি করা যেতে পারে:
const http = প্রয়োজন('http'); // কিপ-লাইভ সক্ষম করে একটি কাস্টম এজেন্ট তৈরি করুন const keepAliveAgent = নতুন http.Agent({ KeepAlive: সত্য, // সংযোগগুলি পুনরায় ব্যবহারের জন্য খোলা রাখুন KeepAliveMsecs: 1000, // একটি TCP KeepAlive প্যাকেট পাঠানোর আগে মিলিসেকেন্ড অপেক্ষা করতে হবে maxSockets: 10, // হোস্ট প্রতি সকেটের সর্বোচ্চ সংখ্যা maxFreeSockets: 5, // KeepAlive সত্য হলে নিষ্ক্রিয় সকেটের সর্বাধিক সংখ্যা টাইমআউট: 60000, // মিলিসেকেন্ডে সকেট টাইমআউট সময়সূচী: 'fifo' // FIFO চাহিদা নির্ধারণ (LIFO এর পরিবর্তে) }); // একটি কাস্টম এজেন্ট ব্যবহার করে একটি অনুরোধ করুন const বিকল্প = { হোস্টনাম: 'example.com', পথ: '/', পদ্ধতি: 'GET', এজেন্ট: KeepAliveAgent // আমাদের কাস্টম এজেন্ট ব্যবহার করুন }; const req = http.request(options, (res) => { console.log(`স্থিতি কোড: ${res.statusCode}`); // কাস্টম এজেন্ট তথ্য প্রদর্শন করুন console.log(`বর্তমান সকেট: ${Object.keys(keepAliveAgent.sockets).length}`); console.log(`ফ্রি সকেট: ${Object.keys(keepAliveAgent.freeSockets).length}`); // প্রতিক্রিয়া ডেটা ব্যবহার করুন // সকেট পুনরায় ব্যবহার প্রদর্শনের জন্য একটি দ্বিতীয় অনুরোধ করুন setTimeout(() => { console.log('সকেট পুনরায় ব্যবহার প্রদর্শনের জন্য দ্বিতীয় অনুরোধ করা হচ্ছে...'); http.request(options, (res2) => { console.log(`দ্বিতীয় অনুরোধের স্থিতি: ${res2.statusCode}`); console.log(`বর্তমান সকেট: ${Object.keys(keepAliveAgent.sockets).length}`); console.log(`ফ্রি সকেট: ${Object.keys(keepAliveAgent.freeSockets).length}`); // পরিষ্কার করা setTimeout(() => { keepAliveAgent.destroy(); console.log('এজেন্ট ধ্বংস'); }, 1000); res2.resume(); }).শেষ(); }, 2000); }); req.on('error', (err) => { console.error(`ত্রুটি: ${err.message}`); }); req.end();
HTTPS Agent
HTTPS অনুরোধের জন্য, অতিরিক্ত SSL/TLS বিকল্পগুলির সাথে একটি HTTPS-নির্দিষ্ট এজেন্ট তৈরি করা যেতে পারে:
const https = প্রয়োজন('https'); const fs = প্রয়োজন('fs'); // SSL বিকল্পগুলির সাথে একটি কাস্টম HTTPS এজেন্ট তৈরি করুন const httpsAgent = নতুন https.Agent({ KeepAlive: সত্য, সর্বোচ্চ সকেট: 10, // SSL/TLS বিকল্প ca: fs.readFileSync('ca-cert.pem'), // শংসাপত্র কর্তৃপক্ষ শংসাপত্র: fs.readFileSync('client-cert.pem'), // ক্লায়েন্ট শংসাপত্র কী: fs.readFileSync('client-key.pem'), // ক্লায়েন্ট ব্যক্তিগত কী // অতিরিক্ত TLS বিকল্প প্রত্যাখ্যান অননুমোদিত: সত্য, // সার্ভার শংসাপত্র পরীক্ষা করুন নিরাপদ প্রোটোকল: 'TLSv1_2_method', // TLS v1.2 ব্যবহার করুন সাইফার: 'HIGH:!aNULL:!MD5', // অনুমোদিত সাইফার সেট করুন honorCipherOrder: true // সাইফার অর্ডারকে সম্মান করুন }); // HTTPS এজেন্ট ব্যবহার করে একটি নিরাপদ অনুরোধ করুন const বিকল্প = { হোস্টনাম: 'secure-example.com', পথ: '/', পদ্ধতি: 'GET', এজেন্ট: httpsAgent }; const req = https.request(options, (res) => { console.log(`স্থিতি কোড: ${res.statusCode}`); // TLS/SSL-নির্দিষ্ট তথ্য প্রদর্শন করুন console.log(`TLS প্রোটোকল: ${res.socket.getProtocol()}`); console.log(`সাইফার: ${res.socket.getCipher().name}`); console.log(`সার্ভার সার্টিফিকেট বৈধ: ${res.socket.authorized}`); // প্রতিক্রিয়া ডেটা ব্যবহার করুন // পরিষ্কার করা setTimeout(() => { httpsAgent.destroy(); console.log('HTTPS এজেন্ট ধ্বংস'); }, 1000); }); req.on('error', (err) => { console.error(`ত্রুটি: ${err.message}`); }); req.end();
সংযোগ পুলিং নিষ্ক্রিয় করা হচ্ছে
এজেন্টকে মিথ্যাতে সেট করে সংযোগ পুলিং অক্ষম করা যেতে পারে:
const http = প্রয়োজন('http'); // এজেন্টের সাথে একটি অনুরোধ করুন: সংযোগ পুলিং নিষ্ক্রিয় করতে মিথ্যা const বিকল্প = { হোস্টনাম: 'example.com', পথ: '/', পদ্ধতি: 'GET', এজেন্ট: মিথ্যা // সংযোগ পুলিং অক্ষম করুন }; const req = http.request(options, (res) => { console.log(`স্থিতি কোড: ${res.statusCode}`); console.log('একটি নতুন সংযোগ ব্যবহার করা হচ্ছে (কোন এজেন্ট নয়)'); // প্রতিক্রিয়া ডেটা ব্যবহার করুন res.resume(); }); req.on('error', (err) => { console.error(`ত্রুটি: ${err.message}`); }); req.end();
সংযোগ পুলিং এর উদাহরণ
এই উদাহরণটি একাধিক অনুরোধের সাথে সংযোগ পুলিংয়ের কার্যকারিতা সুবিধাগুলি প্রদর্শন করে:
const http = প্রয়োজন('http'); const { কর্মক্ষমতা } = প্রয়োজন('perf_hooks'); // একটি ফাংশন যা একটি প্রদত্ত এজেন্টের সাথে একাধিক অনুরোধ করে async ফাংশন makeMultipleRequests(useAgent, numRequests = 10) { // লক্ষ্য নির্ধারণ করুন const hostname = 'example.com'; const পাথ = '/'; // এজেন্ট নির্বাচন করুন const agent = useAgent? নতুন http.Agent({ keepAlive: true }): মিথ্যা; console.log(${useAgent? 'কাস্টম এজেন্ট' : 'নো এজেন্ট'}' দিয়ে ${numRequests} অনুরোধ করা হচ্ছে); const startTime = performance.now(); // একাধিক অনুরোধ করুন জন্য (আসুন i = 0; i < numRequests; i++) { অপেক্ষা করুন নতুন প্রতিশ্রুতি((সমাধান, প্রত্যাখ্যান) => { const req = http.request({ হোস্টনাম, পথ, পদ্ধতি: 'GET', এজেন্ট }, (res) => { // প্রতিক্রিয়া ডেটা ব্যবহার করুন res.resume(); res.on('end', () => { সমাধান(); }); }); req.on('error', (err) => { console.error(`Request ${i + 1} error: ${err.message}`); প্রত্যাখ্যান (ভ্রান্তি); }); req.end(); }).catch(() => {}); // একটি অনুরোধ ধরা ব্যর্থ হলেও লুপ চালিয়ে যান } const endTime = performance.now(); console.log(`সময় নেওয়া: ${(endTime - startTime).toFixed(2)}ms`); // পরিষ্কার করা যদি (ব্যবহারকারী এজেন্ট এবং এজেন্ট) { agent.destroy(); } রিটার্ন এন্ডটাইম - শুরুর সময়; } // তুলনা চালান async ফাংশন run Comparison() { console.log('এজেন্টের সাথে এবং ছাড়া HTTP অনুরোধের কর্মক্ষমতা পরীক্ষা করা'); console.log('----------------------------------------------------------------'); // এজেন্ট ছাড়া (কোন সংযোগ পুলিং) const timeWithoutAgent = await makeMultipleRequests(false); console.log(''); // বিভাজক // এজেন্টের সাথে (সংযোগ পুলিং) const timeWithAgent = await makeMultipleRequests(true); console.log(''); // বিভাজক console.log('ফলাফল:'); console.log(`এজেন্ট ছাড়া: ${timeWithoutAgent.toFixed(2)}ms`); console.log(`এজেন্টের সাথে: ${timeWithAgent.toFixed(2)}ms`); console.log(`পার্থক্য: ${(timeWithoutAgent - timeWithAgent).toFixed(2)}ms`); console.log(`কর্মক্ষমতা উন্নতি: ${(100 * (timeWithoutAgent - timeWithAgent) / timeWithoutAgent).toFixed(2)}%`); } // তুলনা চালান run Comparison().catch(console.error);
একটি প্রক্সি এজেন্ট তৈরি করা
একটি প্রক্সি এজেন্ট তৈরি করতে এজেন্ট ক্লাস বাড়ানো যেতে পারে:
const http = প্রয়োজন('http'); const net = প্রয়োজন ('নেট'); const { URL } = require('url'); // একটি সহজ HTTP প্রক্সি এজেন্ট বাস্তবায়ন ক্লাস HttpProxyAgent প্রসারিত করে http.Agent { কনস্ট্রাক্টর(proxyUri, options = {}) { সুপার (বিকল্প); this.proxyUri = নতুন URL(proxyUri); } // প্রক্সির মাধ্যমে সংযোগ করতে CreateConnection ওভাররাইড করুন সৃষ্টি সংযোগ (বিকল্প, কলব্যাক) { // প্রক্সি সার্ভারের সাথে সংযোগ করুন const proxySocket = net.connect({ হোস্ট: this.proxyUri.hostname, পোর্ট: this.proxyUri.port || 80, }, () => { // প্রক্সির মাধ্যমে গন্তব্যে একটি HTTP সংযোগের অনুরোধ করুন proxySocket.write( `কানেক্ট করুন ${options.host}:${options.port} HTTP/1.1\r\n` + `হোস্ট: ${options.host}:${options.port}\r\n` + `প্রক্সি-সংযোগ: বাঁচিয়ে রাখুন\r\n` + // প্রক্সি প্রমাণীকরণ প্রদান করা হলে যোগ করুন (this.proxyUri.username && this.proxyUri.password ? `প্রক্সি-অথোরাইজেশন: বেসিক ${Buffer.from( `${this.proxyUri.username}:${this.proxyUri.password}` .toString('base64')}\r\n` :') + '\r\n' ); // প্রক্সি প্রতিক্রিয়ার জন্য ডেটা হ্যান্ডলার যাক proxyResponse = ''; const onData = (খণ্ড) => { proxyResponse += chunk.toString(); // পরীক্ষা করুন যে আমরা সম্পূর্ণ প্রক্সি প্রতিক্রিয়া পেয়েছি যদি (proxyResponse.includes('\r\n\r\n')) { // স্ট্যাটাস লাইন পার্স করুন const statusLine = proxyResponse.split('\r\n')[0]; const statusCode = parseInt(statusLine.split('')[1], 10); // যদি প্রক্সি সংযোগ সফল হয় যদি (statusCode === 200) { // ডেটা লিসেনার সরান, এটি আর প্রয়োজন নেই proxySocket.removeListener('ডেটা', onData); // সকেট সহ কলব্যাক কলব্যাক (নাল, প্রক্সিসকেট); } অন্য { // প্রক্সি সংযোগ ব্যর্থ হয়েছে৷ proxySocket.destroy(); কলব্যাক(নতুন ত্রুটি(`প্রক্সি সংযোগ ব্যর্থ হয়েছে: ${statusLine}`)); } } }; proxySocket.on('ডেটা', onData); }); // সকেট ত্রুটিগুলি পরিচালনা করুন proxySocket.on('error', (err) => { কলব্যাক (ত্রুটি); }); রিটার্ন প্রক্সিসকেট; } } // প্রক্সি এজেন্ট ব্যবহারের উদাহরণ const proxyAgent = নতুন HttpProxyAgent('http://proxy.example.com:8080', { KeepAlive: সত্য }); // প্রক্সির মাধ্যমে একটি অনুরোধ করুন const বিকল্প = { হোস্টনাম: 'target-site.com', পথ: '/', পদ্ধতি: 'GET', এজেন্ট: proxyAgent }; const req = http.request(options, (res) => { console.log(`স্থিতি কোড: ${res.statusCode}`); // প্রতিক্রিয়া ডেটা ব্যবহার করুন // পরিষ্কার করা setTimeout(() => { proxyAgent.destroy(); console.log('প্রক্সি এজেন্ট ধ্বংস'); }, 1000); }); req.on('error', (err) => { console.error(`ত্রুটি: ${err.message}`); }); req.end();
সর্বোত্তম অনুশীলন
KeepAlive ব্যবহার করুন:একই সার্ভারে একাধিক অনুরোধ করার সময় কর্মক্ষমতা উন্নত করতে অবিরাম সংযোগের জন্য KeepAlive সক্ষম করুন
ম্যাক্স সকেট সেট করুন:টার্গেট সার্ভার বা আপনার নিজস্ব সিস্টেমের সংস্থান অপ্রতিরোধ্য প্রতিরোধ করতে maxSockets সীমাবদ্ধ করুন
পরিষ্কার করুন:এজেন্টের আর প্রয়োজন না থাকলে সংস্থান প্রকাশ করতে agent.destroy() এ কল করুন
কাস্টম এজেন্ট ব্যবহার করুন:বিভিন্ন সংযোগের প্রয়োজনীয়তা বা লক্ষ্য সার্ভারের জন্য বিভিন্ন এজেন্ট উদাহরণ তৈরি করুন
মনিটর এজেন্ট স্বাস্থ্য:সংযোগ সমস্যা সনাক্ত করতে সক্রিয় এবং বিনামূল্যে সকেট সংখ্যা নিরীক্ষণ
নিরাপত্তা:HTTPS এজেন্টদের জন্য, সর্বদা উপযুক্ত SSL/TLS বিকল্পগুলি সেট করুন এবং নিরাপত্তা সেটিংস আপ টু ডেট রাখুন
ত্রুটি হ্যান্ডলিং:HTTP অনুরোধে সর্বদা সম্ভাব্য ত্রুটিগুলি পরিচালনা করুন