Canary Deployments JavaScript: बिना डर के अपडेट कैसे जारी करें
\n\nक्या आपने कभी आधी रात को कोई नई फीचर डिप्लॉय की है, यह प्रार्थना करते हुए कि सर्वर क्रैश न हो? या फिर "सभी पेजों पर 500 एरर" का नोटिफिकेशन देखकर नींद से जागे हैं? परिचित लगता है, है ना? रिलीज़ हमेशा तनावपूर्ण होती हैं। लेकिन एक तरीका है जो इसे छुट्टी के दिन की सुबह जितना शांत बना सकता है: Canary Deployments (कैनरी डिप्लॉयमेंट)।
\n\nयह नाम पुरानी खनिक प्रथा से आया है - खदान में कैनरी पक्षी को साथ ले जाना। अगर पक्षी चुप हो जाता, तो इसका मतलब था कि हवा जहरीली है और तुरंत बाहर निकलना चाहिए। JavaScript डेवलपमेंट की दुनिया में भी यही सिद्धांत है: पहले नए वर्जन पर उपयोगकर्ताओं का एक छोटा प्रतिशत छोड़ें, सिस्टम की "सेहत" पर नज़र रखें, और फिर पूर्ण रिलीज़ करें।
\n\nइस लेख में, हम सीखेंगे कि शुद्ध JavaScript (और थोड़ा Node.js) में canary deployment कैसे लागू करें। कोई जटिल कॉर्पोरेट टूल नहीं - सिर्फ कोड, तर्क और सामान्य ज्ञान।
\n\nCanary ही क्यों, Blue-Green या Rolling Update क्यों नहीं?
\n\nडिप्लॉय की कई रणनीतियाँ हैं। Blue-green में आपके पास दो समान वातावरण होते हैं, और आप बस ट्रैफ़िक स्विच कर देते हैं। Rolling update Kubernetes में पॉड्स को धीरे-धीरे बदलना है। लेकिन canary के पास एक सुपरपावर है: वास्तविक उपयोगकर्ताओं पर लाइव A/B टेस्ट।
\n\n- \n
- कम जोखिम: अगर नया वर्जन डेटाबेस को "खत्म" कर देता है, तो सिर्फ 1% उपयोगकर्ता प्रभावित होंगे, 100% नहीं। \n
- त्वरित प्रतिक्रिया: नए कोड के मेट्रिक्स आपको तब दिख जाते हैं जब वह सभी तक नहीं पहुँचा होता। \n
- ऑटोमैटिक रोलबैक: अगर एरर बढ़ती है, तो canary अपने आप बंद हो जाता है। \n
JavaScript में Canary Deployment की आर्किटेक्चर
\n\nकल्पना करें कि हमारे पास एक Express ऐप है जो HTML पेज सर्व करता है। हम होम पेज का नया लेआउट रिलीज़ करना चाहते हैं। सभी के लिए राउटर बदलने के बजाय, हम एक बीच की परत बनाएंगे - canary middleware।
\n\nसिस्टम के घटक
\n- \n
- Feature flag - एक फ्लैग जो किसी विशेष समूह के लिए नया वर्जन चालू करता है। \n
- ट्रैफ़िक वितरक - तर्क जो तय करता है: पुराना वर्जन (v1) देना है या नया (v2)। \n
- मॉनिटरिंग - मेट्रिक्स का संग्रह (एरर, लेटेंसी, कन्वर्ज़न)। \n
- ऑटोमैटिक रोलबैक - अगर मेट्रिक्स एक सीमा से नीचे गिर जाएँ। \n
Node.js और Express पर एक सरल उदाहरण
\n\nचलिए एक बेसिक सर्वर से शुरू करते हैं। मान लीजिए हमारे पास दो हैंडलर हैं: v1 (पुराना) और v2 (नया)।
const express = require('express');\nconst app = express();\nconst PORT = 3000;\n\n// पुराना वर्जन\napp.get('/api/v1/home', (req, res) => {\n res.json({ version: 'v1', message: 'पुराना भरोसेमंद डिज़ाइन' });\n});\n\n// नया वर्जन (canary)\napp.get('/api/v2/home', (req, res) => {\n res.json({ version: 'v2', message: 'नया, चमकदार डिज़ाइन!' });\n});\n\napp.listen(PORT, () => console.log(`Server ${PORT} पोर्ट पर चल रहा है`));\n\n\nअब हमें तय करना है कि किसे v2 दिखाना है। सबसे आसान तरीका है user ID के आधार पर रैंडम चयन।
\n\nट्रैफ़िक वितरण: नियतात्मक रैंडम
\n\nहम नहीं चाहते कि एक ही उपयोगकर्ता हर अनुरोध पर वर्जन के बीच कूदता रहे। इसलिए हम user ID का हैश इस्तेमाल करेंगे:
\n\nfunction getCanaryGroup(userId, percentage = 5) {\n // सबसे सरल हैश: कैरेक्टर कोड का योग\n const hash = userId.split('').reduce((acc, char) => acc + char.charCodeAt(0), 0);\n return (hash % 100) < percentage;\n}\n\n// उपयोग का उदाहरण\nconsole.log(getCanaryGroup('user_123')); // true या false\n\n\nअब middleware में हम जाँचेंगे कि उपयोगकर्ता canary-ग्रुप में आता है या नहीं:
\n\napp.use('/api/home', (req, res, next) => {\n const userId = req.headers['x-user-id'] || 'anonymous';\n \n if (getCanaryGroup(userId, 5)) { // 5% ट्रैफ़िक\n req.url = '/api/v2/home';\n } else {\n