मैं एक कार्य देय होने से 24, 8, 3, और 1 घंटे पहले उपयोगकर्ताओं को पिंग करने के लिए एक ईमेल अनुस्मारक प्रणाली विकसित कर रहा हूं।

मेरे पास एक सर्वर है जो Node.js पर चलता है। मेरा पहला विचार चार अलग-अलग सेटटाइमआउट() सेट करना था, हर बार जब उपयोगकर्ता को कोई कार्य सौंपा जाता है। हालांकि, मुझे लगता है कि सर्वर पर सैकड़ों सेटटाइमआउट() निष्क्रिय होना सर्वोत्तम प्रदर्शन-वार नहीं होगा।

जैसे, क्या मैं हर पांच मिनट में अधूरे कार्यों के लिए मतदान करने और उन उपयोगकर्ताओं को अनुस्मारक भेजने से बेहतर होगा जिनके पास समय सीमा के साथ कार्य हैं? यहाँ नकारात्मक पक्ष यह है कि मैं हर पाँच मिनट में एक संपूर्ण MongoDB संग्रह पढ़ रहा हूँ।

3
mitmath514 2 सितंबर 2021, 07:20
मुझे नहीं लगता कि टाइमआउट का उपयोग करना एक अच्छा विचार है, अगर किसी भी कारण से नोडज पुनरारंभ होता है तो सभी टाइमर खो जाते हैं। मैं यह जांचने के लिए एक शेड्यूल का उपयोग करने का सुझाव दूंगा कि कौन से उपयोगकर्ता हर मिनट पिंग किए जाने वाले हैं उदा। एक क्रोनजॉब जो "स्टैंडअलोन" जेएस स्क्रिप्ट यानी आपका दूसरा समाधान कहता है
 – 
apokryfos
2 सितंबर 2021, 08:03

1 उत्तर

सबसे बढ़िया उत्तर

Nodejs बहुत सारे और बहुत सारे टाइमर के साथ बहुत कुशल है। आपके पास बिना किसी सार्थक प्रभाव के आसानी से हज़ारों टाइमर हो सकते हैं। यह एक क्रमबद्ध, लिंक की गई सूची का उपयोग करता है जिसमें एक नया टाइमर डालने में केवल थोड़ा समय लगता है और एक बार डालने पर कुछ भी खर्च नहीं होता है।

सूची की शुरुआत में आग लगने वाले अगले टाइमर की नियमित रूप से इवेंट लूप में तुलना की जाती है। जब यह सक्रिय होता है, तो इसे लिंक की गई सूची के सामने से हटा दिया जाता है और सूची में अगला टाइमर अब शीर्ष पर होता है। क्योंकि यह एक लिंक की गई सूची है, टाइमर को सक्रिय करने और इसे लिंक की गई सूची के प्रारंभ से हटाने का समय इस बात से स्वतंत्र है कि सूची कितनी लंबी है (उदाहरण के लिए यह एक सरणी नहीं है जिसे नीचे कॉपी किया जाना है)।

इसलिए, आपके विशिष्ट एप्लिकेशन के लिए, टाइमर की संख्या को कम करने की तुलना में आपके डेटाबेस (जितना संभव हो उतना कम अनुरोध) के साथ कुशल होना कहीं अधिक महत्वपूर्ण है। इसलिए, जो भी टाइमर डिज़ाइन/कार्यान्वयन आपके डेटाबेस लोड को अनुकूलित करता है वह वही है जो मैं अनुशंसा करता हूं।


FYI करें, यदि आप किसी उपयोगकर्ता को आने वाले नियत कार्य के बारे में 4 बार याद दिलाना चाहते हैं, तो आप अभी भी प्रति कार्य एक समय में केवल एक टाइमर लाइव कर सकते हैं। पहले टाइमर को आग पर सेट करें, फिर जब यह सूचित करने के लिए आग लगती है, तो आप उस देय तिथि/समय पर थोड़ा समय गणना करते हैं जिसे आपने पहले सहेजा था और देखें कि अगला टाइमर कब सेट करना है। यह आपको चार के बजाय प्रति कार्य केवल एक टाइमर के साथ छोड़ देगा।

लेकिन, यहां मुख्य बिंदु अभी भी है कि आपको पहले डेटाबेस के कुशल उपयोग के लिए डिज़ाइन को अनुकूलित करना चाहिए।

और, टाइमर लगातार नहीं होते हैं इसलिए यदि आपका सर्वर पुनरारंभ होता है, तो आपको सर्वर स्टार्टअप पर उपयुक्त टाइमर बनाने के लिए एक तंत्र की आवश्यकता होती है (शायद एक डेटाबेस क्वेरी जो आपको एक निश्चित समय के भीतर लंबित कोई भी कार्य प्रदान करती है)।

2
jfriend00 2 सितंबर 2021, 09:54