2009-09-17 4 views
12

मैं एक सामान्य जटिल जावा सर्वर अनुप्रयोग लिख रहा हूं जिसमें सामान्य अनुरोध-प्रतिक्रिया प्रसंस्करण के अतिरिक्त एक महत्वपूर्ण पृष्ठभूमि प्रसंस्करण भाग है। क्वार्ट्ज ढांचे का उपयोग कर क्रॉन-जैसी फैशन में कुछ पृष्ठभूमि प्रसंस्करण किया जाता है। अन्य कार्य अधिक मांग पर हैं - यदि कोई नया ग्राहक कनेक्ट करता है तो यह थोड़ी देर में इसे अपडेट करने के लिए अतिरिक्त नौकरी बनाता है। क्रॉन कार्यों को भी अलग किया जा सकता है - कुछ बाहरी अनुप्रयोगों की निगरानी करते हैं, कुछ आंकड़ों की गणना करते हैं और इसी तरह।जावा सर्वर के लिए सिंगल या एकाधिक थ्रेड पूल?

मैं उन सभी नौकरियों को चलाने के लिए कई थ्रेड पूल का उपयोग कर रहा हूं, इस विचार के साथ कि समान नौकरियां थ्रेड पूल साझा करेंगी लेकिन विभिन्न नौकरियां एक साझा नहीं होंगी। उदाहरण के लिए मॉनीटर जॉब्स कभी भी आंकड़े पूल पर नहीं चलेंगे, और आंकड़े नौकरियां मॉनीटर पूल पर कभी नहीं चलेंगी।

दूसरी तरफ मुझे पता है कि कुछ लोग सिर्फ एक धागा पूल रखना पसंद करेंगे और बिना किसी अलगाव के सब कुछ चलाएंगे।

मुझे आश्चर्य है कि इस तरह के परिदृश्य में सबसे अच्छा अभ्यास क्या माना जाता है।

धागे पूल को अलग करने के लिए विपक्ष क्या हैं?

क्या इससे कोई फर्क पड़ता है?

+2

+1 दिलचस्प प्रश्न। – KLE

उत्तर

0

यह वास्तव में नहीं एक सीधा जवाब है, लेकिन

आपका क्वार्ट्ज नौकरियों :-(एक और प्रस्ताव, रुका हुआ जा सकता है रद्द कर दिया और इतने पर, की यह कॉल है "कामयाब"। मुझे लगता है कि आप के लिए कुछ यूआई पैदा करेगा उन्हें प्रबंधित।

आपको पता है कि आप अपने अन्य काम ("मांग पर"), एक ही कार्य से लाभ नहीं होगा जब तक कि आप निश्चित रूप से इसे लागू करते हैं? तुम सब कुछ एक क्वार्ट्ज काम (यहां तक ​​कि अगर बनाने पर विचार किया एक समान कोड प्राप्त करने के लिए, तुरंत शुरू होता है)

+0

वास्तव में यह विकल्पों में से एक है। हालांकि दो मुद्दे हैं - एक यह है कि AFAIK क्वार्ट्ज एक को एक थ्रेड पूल का उपयोग करने के लिए मजबूर करता है - जबकि मेरी व्यक्तिगत प्राथमिकता एकाधिक का उपयोग करना है। दूसरा यह है कि क्वार्ट्ज एपीआई क्रॉन प्रकार की नौकरियों से बहुत अच्छी है लेकिन बोझिल है जब आपको केवल समानांतर में कुछ एल्गोरिदम चलाने की आवश्यकता होती है। –

+0

@ ग्रेगरी मैं थ्रेड पूल नंबर के लिए आपकी चिंता को समझता हूं। मुझे इस बिंदु पर बनाने की कोई सिफारिश नहीं है :-(बोझिल क्वार्ट्ज के बारे में, जब मैंने इसके साथ काम किया तो मुझे कैसा महसूस हुआ !! !!-) मैंने इसे घर से बना सरल विधि में समेट लिया। – KLE

+0

फ्रैंक होने के लिए, हमें क्लस्टर पर क्वार्ट्ज के साथ भी परेशानी है। नौकरी कहीं भी शुरू होती है, अनुरोध पर संसाधित करने वाले सर्वर पर नहीं।मुझे लगता है कि क्वार्ट्ज पहले नोड पर शुरू हुआ है, और अन्य नोड्स इसे शुरू नहीं करते हैं। इससे कई समस्याएं होती हैं ... – KLE

6

उत्तर इस बात पर निर्भर करता है कि आपको विभिन्न प्रकार की गतिविधि के बीच आवेदन संसाधनों को अलग करने की आवश्यकता है या नहीं।

उदाहरण के लिए, मैं वर्तमान में एक सर्वर अनुप्रयोग लिख रहा हूं जिसमें कुछ उच्च-थ्रूपुट लेखकों और संभावित रूप से कई पाठक शामिल हैं। पाठक ऐप को स्पोरैडिक रूप से एक्सेस करेंगे लेकिन संभावित रूप से बहुत सारे डेटा का अनुरोध कर सकते हैं (यानी लंबे समय तक चलने वाले अनुरोध)। मुझे यह सुनिश्चित करने की ज़रूरत है कि लेखक कभी भूखे न हों, इसलिए मैं अपने डिजाइन में पढ़ने/लिखने के लिए दो धागे पूल का उपयोग करने जा रहा हूं। यदि पाठक थ्रेड पूल अस्थायी रूप से समाप्त हो गया है तो लेखक अप्रभावित होंगे; केवल पढ़ने के अनुरोध में देरी होगी।

एक विकल्प PriorityQueue का उपयोग ThreadPoolExecutor के साथ संयोजन के लिए किया जाना चाहिए और अनुरोध लिखने के लिए उच्च प्राथमिकता असाइन करना होगा।

तो निष्कर्ष में - मेरी सलाह होगी: एक थ्रेड पूल से शुरू करें और ऐसा करने के लिए ठोस कारण होने पर केवल अपना डिज़ाइन अधिक जटिल बनाएं।