🎧 Listen to this article: English
🌍 Read this in your language: हिंदी · தமிழ் · తెలుగు · ಕನ್ನಡ · മലയാളം · ଓଡ଼ିଆ · 日本語 · 中文
सॉफ़्टवेयर के साथ काम करते समय, यह सुनिश्चित करना महत्वपूर्ण है कि कार्य सुचारू रूप से और बिना डुप्लिकेशन के चलें। हम डिस्ट्रिब्यूटेड सिस्टम्स में एक आम कमी पर गहराई से विचार कर रहे हैं: कैसे एक इन-प्रोसेस शेड्यूलर एक नाइटली जॉब को कई बार चला सकता है, जिससे आपके डेटाबेस में डुप्लिकेट रिकॉर्ड्स बन सकते हैं। यह विषय विशेष रूप से प्रासंगिक है क्योंकि अधिक कंपनियाँ माइक्रोसर्विसेज आर्किटेक्चर अपना रही हैं, जहाँ सर्विसेज़ क्षैतिज रूप से (horizontally) स्केल होती हैं।
सेटअप
कल्पना करें कि आपके पास एक नाइटली जॉब है जो आपके एप्लिकेशन में सक्रिय एंटिटीज़ के लिए रिकॉर्ड्स बनाता है। इस जॉब को दिन में एक बार चलना चाहिए, प्रत्येक एंटिटी के लिए एक नया रिकॉर्ड बनाना चाहिए। NestJS, जो सर्वर-साइड एप्लिकेशन बनाने के लिए एक लोकप्रिय फ़्रेमवर्क है, का उपयोग करने वाले एक सामान्य सेटअप में, आप उपयोग कर सकते हैं @Cron इस जॉब को शेड्यूल करने के लिए डेकोरेटर। यहाँ इसका एक सरलीकृत संस्करण दिया गया है कि यह कैसा दिख सकता है:
@Injectable()
export class WindowGenerationService {
@Cron('0 8 * * *') // every day at 08:00
async generateNextWindows() {
const entities = await this.repo.findActiveEndingSoon();
for (const entity of entities) {
await this.repo.createNextWindow(entity);
}
}
}
यह कोड पूरी तरह से काम करता है जब आपकी सर्विस का एक ही इंस्टेंस चल रहा हो। हालाँकि, जब आप कई इंस्टेंस चलाकर अपने एप्लिकेशन को क्षैतिज रूप से (horizontally) स्केल करते हैं, तो चीजें गलत हो सकती हैं।
समस्या
एक स्केल्ड सेटअप में, यदि आपके पास अपनी सर्विस के तीन इंस्टेंस हैं, तो प्रत्येक इंस्टेंस उसी समय शेड्यूल्ड जॉब की अपनी कॉपी चलाएगा। इसलिए, 08:00 बजे चलने वाले एक जॉब के बजाय, आपको एक साथ तीन जॉब्स फ़ायर होते हुए मिलते हैं। प्रत्येक इंस्टेंस यह जांचे बिना कि क्या वे पहले से मौजूद हैं, अपने स्वयं के रिकॉर्ड्स बनाता है। इसके परिणामस्वरूप आपके डेटाबेस में डुप्लिकेट एंट्रीज़ होती हैं, जहाँ एक ही एंटिटी के लिए दो समान रिकॉर्ड्स कुछ ही सेकंड के अंतराल पर बनाए जाते हैं।
यह क्यों मायने रखता है
डुप्लिकेट डेटा डेटा इंटिग्रिटी समस्याओं और संसाधनों की बर्बादी सहित विभिन्न मुद्दों का कारण बन सकता है। न केवल आप अनावश्यक रिकॉर्ड्स बना रहे हैं, बल्कि आप एक ही काम करने वाले तीन कंटेनरों के कंप्यूट रिसोर्सेस के लिए भी भुगतान कर रहे हैं।
संभावित समाधान
समस्या की पहचान करने के बाद, इसे हल करने के कई तरीके हैं:
विकल्प 1: डिस्ट्रिब्यूटेड लॉक का उपयोग करें
एक समाधान डिस्ट्रिब्यूटेड लॉक लागू करना हो सकता है। यह इंस्टेंसेस को लॉक के लिए प्रतिस्पर्धा करने की अनुमति देगा, जिससे केवल एक इंस्टेंस जॉब चला सकेगा। हालाँकि, इस दृष्टिकोण के अपने नुकसान हैं। यदि लॉक बैकएंड विफल हो जाता है या लॉक को होल्ड करते समय कोई इंस्टेंस क्रैश हो जाता है, तो जॉब बिल्कुल नहीं चल सकता है, जिससे एग्जीक्यूशन छूट सकते हैं।
विकल्प 2: इडेम्पोटेंसी (Idempotency) लागू करें
एक अन्य विकल्प इडेम्पोटेंसी चेक जोड़ना है। इसका मतलब यह है कि यदि जॉब फिर से चलता है, तो यह रिकॉर्ड्स बनाने को छोड़ देगा यदि वे पहले से मौजूद हैं। हालाँकि यह एक सस्ता समाधान है, यह अभी भी सभी इंस्टेंसेस को जगाता है, जिससे अनावश्यक काम होता है।
विकल्प 3: शेड्यूलिंग को ऐप के बाहर ले जाएँ
जैसा कि पाया गया है, सबसे अच्छा समाधान एप्लिकेशन से शेड्यूलिंग को बाहर निकालना है। ऐप को जॉब्स चलने का प्रबंधन करने देने के बजाय, एक बाहरी शेड्यूलर को इसे संभालने दें। इस तरह, आप एक HTTP एंडपॉइंट बना सकते हैं जिसे बाहरी शेड्यूलर निर्धारित समय पर एक बार ट्रिगर करता है। यह कैसा दिख सकता है, यहाँ दिया गया है:
@Post('jobs/run')
async runJob(@Body() body: RunJobDto) {
this.assertValidSecret(body.secret);
return this.jobs.run(body.jobKey);
}
इस सेटअप के साथ, केवल एक इंस्टेंस जॉब ट्रिगर का जवाब देगा, जिससे डुप्लिकेट रिकॉर्ड्स बनने से रोके जा सकेंगे। इडेम्पोटेंसी चेक यह सुनिश्चित करने के लिए जगह पर रहता है कि भले ही जॉब कई बार ट्रिगर हो, यह डुप्लिकेट नहीं बनाएगा।
इसमें क्या खर्च आता है
जब आप किसी जॉब को HTTP एंडपॉइंट के रूप में एक्सपोज़ करते हैं, तो आपको सुरक्षा पर विचार करने की आवश्यकता होती है। जो कोई भी इस एंडपॉइंट को ढूंढता है वह संभावित रूप से इसे ट्रिगर कर सकता है। अनधिकृत पहुँच को रोकने के लिए, रिक्वेस्ट्स को वैलिडेट करने के लिए एक शेयर्ड सीक्रेट का उपयोग किया जाता है। यह सुनिश्चित करता है कि केवल वैध ट्रिगर्स ही जॉब को निष्पादित कर सकते हैं।
एक और विचार शेड्यूलिंग का समय है। जॉब सभी उपयोगकर्ताओं के लिए दिन की शुरुआत के बाद चलना चाहिए, जो कई टाइम ज़ोन से निपटने के दौरान मुश्किल हो सकता है। एक निश्चित UTC घंटा चुनना इसे विभिन्न क्षेत्रों में मानकीकृत (standardize) करने में मदद कर सकता है।
सबक
यह अनुभव एक महत्वपूर्ण सबक पर प्रकाश डालता है: एक इन-प्रोसेस शेड्यूलर डिस्ट्रिब्यूटेड सिस्टम में अप्रत्याशित व्यवहार का कारण बन सकता है। अपने एप्लिकेशन को स्केल करते समय, एप्लिकेशन लॉजिक से शेड्यूलिंग की चिंता को अलग करना आवश्यक है। ऐसा करके, आप डुप्लिकेट राइट्स (writes) की कमियों से बच सकते हैं और यह सुनिश्चित कर सकते हैं कि आपके जॉब्स इच्छानुसार चलें।
निष्कर्ष
संक्षेप में, माइक्रोसर्विसेज आर्किटेक्चर में क्रॉन जॉब्स के प्रबंधन के लिए सावधानीपूर्वक योजना बनाने की आवश्यकता होती है। शेड्यूलिंग को अपने एप्लिकेशन के बाहर ले जाकर और उचित चेक्स को लागू करके, आप डुप्लिकेट रिकॉर्ड्स जैसी समस्याओं को रोक सकते हैं और अपनी सर्विसेज़ की दक्षता में सुधार कर सकते हैं।
लाभ
- डेटाबेस में डुप्लिकेट रिकॉर्ड्स को रोकता है।
- अनावश्यक कंप्यूट कॉस्ट्स को कम करता है।
- शेड्यूलिंग को बाहरी बनाकर जॉब मैनेजमेंट को सरल बनाता है।
नुकसान
- एक बाहरी शेड्यूलर के लिए अतिरिक्त सेटअप की आवश्यकता होती है।
- HTTP रिक्वेस्ट्स और सुरक्षा को संभालने में जटिलता का परिचय देता है।
सावधानी
यह लेख एक शैक्षिक अवलोकन के रूप में कार्य करता है। किसी भी प्लेसहोल्डर वैल्यूज़ को अपने वास्तविक कॉन्फ़िगरेशन से बदलना सुनिश्चित करें और उन पर भरोसा करने से पहले मूल स्रोत के विरुद्ध दावों को सत्यापित करें।
अक्सर पूछे जाने वाले प्रश्न
- क्रॉन जॉब क्या है? — क्रॉन जॉब एक निर्धारित कार्य है जो निर्दिष्ट अंतराल पर स्वचालित रूप से चलता है।
- मेरा क्रॉन जॉब कई बार क्यों चला? — ऐसा तब हो सकता है जब जॉब आपके एप्लिकेशन के कई इंस्टेंस में निर्धारित किया गया हो।
- मैं डेटाबेस में डुप्लिकेट रिकॉर्ड्स को कैसे रोक सकता हूँ? — इडेम्पोटेंसी चेक्स लागू करें या शेड्यूलिंग को एप्लिकेशन के बाहर ले जाएँ।
- प्रोग्रामिंग में इडेम्पोटेंसी (idempotency) क्या है? — इडेम्पोटेंसी का अर्थ है कि किसी फ़ंक्शन को प्रारंभिक अनुप्रयोग से परे परिणाम बदले बिना कई बार कॉल किया जा सकता है।
- NestJS क्या है? — NestJS कुशल (efficient), स्केलेबल Node.js सर्वर-साइड एप्लिकेशन बनाने के लिए एक फ़्रेमवर्क है।
- मैं अपने HTTP एंडपॉइंट्स को कैसे सुरक्षित करूँ? — रिक्वेस्ट्स को वैलिडेट करने के लिए शेयर्ड सीक्रेट्स या टोकन जैसे प्रमाणीकरण तरीकों का उपयोग करें।
टैग्स
#cron #nestjs #microservices #scheduling #softwareengineering #dataintegrity #cloudcomputing #distributedsystems
Docker Security Checklist
Lock down your containers from build to runtime — 29 practical controls covering images, runtime flags, secrets, and the daemon. Enter your email — you'll get the PDF instantly, plus new posts on Docker, Linux & security.
Free. No spam — unsubscribe in one click.


Responses
Sign in to leave a response.