जावास्क्रिप्ट में HTTP क्लाइंट: अनुरोध सही तरीके से करें — उन्नत स्तर
\n\nfetch या axios के साथ बुनियादी HTTP अनुरोध करना केवल हिमशैल का सिरा है। वास्तविक प्रोडक्शन Node.js अनुप्रयोगों में, आप दर्जनों बारीकियों का सामना करते हैं: कनेक्शन पूल, विफलताओं पर पुनः प्रयास, लॉगिंग के लिए इंटरसेप्टर, बड़े डेटा की स्ट्रीमिंग और टाइमआउट की सूक्ष्म ट्यूनिंग। इस लेख में, हम जावास्क्रिप्ट में HTTP क्लाइंट के साथ काम करने की उन्नत तकनीकों पर चर्चा करेंगे। आप सीखेंगे कि keep-alive कैसे प्रबंधित करें, एक विश्वसनीय retry तंत्र कैसे लागू करें, इंटरसेप्टर का उपयोग कैसे करें और कस्टम एजेंट कैसे बनाएं। यह सामग्री उन डेवलपर्स के लिए है जो पहले से HTTP की मूल बातों से परिचित हैं और अधिक कुशल और दोष-सहिष्णु कोड लिखना चाहते हैं।
1. कनेक्शन प्रबंधन: Keep-Alive और कस्टम एजेंट
\n\nडिफ़ॉल्ट रूप से, Node.js एक वैश्विक HTTP एजेंट पूल का उपयोग करता है। हालांकि, उच्च-लोड सिस्टम के लिए समवर्ती कनेक्शनों की संख्या और उनके पुन: उपयोग को नियंत्रित करना महत्वपूर्ण है। आइए http मॉड्यूल और undici लाइब्रेरी का उपयोग करके keep-alive सेटअप देखें।
कस्टम एजेंट के साथ उदाहरण (Node.js built-in):
\nconst http = require('http');\nconst https = require('https');\n\n// कनेक्शन पूल के साथ कस्टम एजेंट बनाएं\nconst agent = new http.Agent({\n keepAlive: true,\n maxSockets: 50, // अधिकतम 50 समवर्ती सॉकेट\n maxFreeSockets: 10, // पूल में 10 से अधिक मुक्त नहीं\n timeout: 60000, // सॉकेट निष्क्रियता टाइमआउट (मि.से.)\n});\n\nconst options = {\n hostname: 'api.example.com',\n port: 80,\n path: '/data',\n agent: agent,\n};\n\nconst req = http.get(options, (res) => {\n let data = '';\n res.on('data', (chunk) => { data += chunk; });\n res.on('end', () => console.log('प्रतिक्रिया प्राप्त:', data));\n});\n\nreq.on('error', (e) => console.error('त्रुटि:', e.message));\n\nundici के साथ आधुनिक दृष्टिकोण (तेज़ और हल्का):
\nconst { Client, Pool } = require('undici');\n\n// keep-alive के साथ पूल बनाएं\nconst client = new Pool('https://api.example.com', {\n connections: 100,\n pipelining: 10,\n keepAliveTimeout: 30000,\n});\n\n// अनुरोध निष्पादित करें\nclient.request({\n method: 'GET',\n path: '/data',\n}).then(({ statusCode, body }) => {\n console.log('स्थिति:', statusCode);\n body.setEncoding('utf8');\n body.on('data', console.log);\n}).catch(err => console.error(err));\n\nकस्टम एजेंटों का उपयोग सॉकेट लीक की समस्याओं से बचने में मदद करता है और कनेक्शनों के पुन: उपयोग के माध्यम से प्रदर्शन में सुधार करता है।
\n\n2. पुनः प्रयासों का विश्वसनीय तंत्र (Retry)
\n\nनेटवर्क अस्थिर हैं। अस्थायी विफलताएं भी डेटा हानि का कारण बन सकती हैं। एक सही retry रणनीति को त्रुटि के प्रकार, प्रयासों की संख्या और एक्सपोनेंशियल विलंब को ध्यान में रखना चाहिए। आइए किसी भी HTTP क्लाइंट के लिए एक सार्वभौमिक retry डेकोरेटर लागू करें।
\n\nconst axios = require('axios');\nconst sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));\n\nasync function withRetry(requestFn, retries = 3, baseDelay = 1000) {\n for (let attempt = 1; attempt <= retries; attempt++) {\n try {\n return await requestFn();\n } catch (error) {\n // क्लाइंट त्रुटियों (4xx) पर पुनः प्रयास न करें\n if (error.response && error.response.status >= 400 && error.response.status < 500) {\n throw error;\n }\n if (attempt === retries) {\n throw error; // सभी प्रयास समाप्त\n }\n const delay = baseDelay * Math.pow(2, attempt - 1) + Math.random() * 1000;\n console.log(`प्रयास ${attempt} विफल। ${delay}ms प्रतीक्षा कर रहे हैं...`);\n await sleep(delay);\n }\n }\n}\n\n// उपयोग\nasync function fetchData() {\n const response = await withRetry(() => axios.get('https://api.example.com/data'), 5, 500);\n return response.data;\n}\n\nfetchData().then(console.log).catch(console.error);\n\nमुख्य बिंदु: 4xx को बाहर करना