2010-01-29 20 views
28

Servlet 3.0 asynchronous processing के बाद से समर्थित है। हमेशा असीमित प्रक्रिया का उपयोग करने के लिए बेहतर होगा? या किस मामले में तुल्यकालिक प्रक्रिया बेहतर है?अतुल्यकालिक सर्वलेट्स बनाम तुल्यकालिक सर्वलेट्स

उत्तर

40

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

+2

+1 एक स्पष्ट सारांश के लिए +1। – BalusC

+2

क्या होता है यदि आप सर्वर पक्ष पर AJAX डेटा की जांच कर रहे हैं और उपयोगकर्ता किसी भिन्न वेबपृष्ठ पर जाता है? तो अब उन्हें उस डेटा की आवश्यकता नहीं है? या क्या होता है यदि उपयोगकर्ता पृष्ठ को रीफ्रेश करता है? क्या सर्वर से उस डेटा के लिए सर्वर की ओर से दो उदाहरण होंगे? – gmustudent

4

उन मामलों के लिए असिंक्रोनस प्रोसेसिंग शुरू की गई है जब पूरे अनुरोध प्रसंस्करण चक्र के दौरान धागे को पकड़ने की आवश्यकता नहीं है। इस तरह के मामले का सामान्य उदाहरण comet-जैसी कार्यक्षमता है।

सभी मामलों के लिए कुछ भी नहीं होता लायक में अतुल्यकालिक प्रसंस्करण का उपयोग करना, क्योंकि आमतौर पर बैक-एंड प्रोसेसिंग वैसे भी एक धागा खपत करता है।

20

लेख पढ़ना, सर्वलेट 3.0 spec में एसिंक्रोनस प्रसंस्करण समर्थन का एक बहुत ही विशिष्ट उपयोग केस है - यह उस मामले को संभालने के लिए डिज़ाइन किया गया है जहां आपके पास AJAX एप्लिकेशन है जो पृष्ठभूमि में संभावित रूप से लंबी चल रही प्रक्रियाओं को ट्रिगर करने वाले अनुरोध करता है।

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

विशेष रूप से, यदि कोई AJAX अनुरोध किसी डेटाबेस ऑपरेशन की तरह संभावित रूप से धीमा या अवरुद्ध करता है, तो हम वापस आते हैं जहां हमने शुरू किया - सर्वर के थ्रेडपूल से धागे संभावित रूप से निष्क्रिय हैं।

असिंक्रोनस प्रोसेसिंग समर्थन केंद्रीयकृत कतार में अनुरोध डालकर इसे कम करने का प्रयास करता है, जैसे थ्रेड हमेशा उन अनुरोधों के परिणामों की प्रतीक्षा नहीं कर रहे हैं जो अभी तक संसाधित नहीं हो सकते हैं। संक्षेप में, हम अपने धागे के लिए हर समय हमारे बकाया के लिए सबसे ज्यादा धक्का पाने की कोशिश कर रहे हैं - यानी, निष्क्रिय होने पर कितना समय कम हो रहा है (लेकिन कुछ अन्य कनेक्शन की सेवा कर सकता है)।

किसी भी नए घटनाक्रम की तरह, यह कुछ एक एक आकार फिट सभी उपकरण के रूप में प्रयोग की जाने वाली नहीं है। अपने आवेदन में विशिष्ट मामले की तलाश करें जहां यह उचित है।

+4

+1 "लेख पढ़ना ..." – user359996

2

मैं सिर्फ लिंक किए गए आलेख पर स्किम किया गया है, यह एक सर्वर-साइड सुधार है, क्लाइंट-साइड एसिंक्रोनस नहीं।

लेख का सारांश:

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

काम एक नौकरी कतार में अटक जाएगा और जब तक काम पूरा करता है और प्रतिक्रिया अंत में प्रतिबद्ध है संसाधनों यह पूरा करने के लिए अनुमति देने के लिए मुक्त जब धागा सेवानिवृत्त जा सकता है।

बहुत अच्छा सामान।

1

इसके requrirement के आधार पर जहां किसी भी संभावना है कि एक धागा है कि स्थिति यू अतुल्यकालिक सर्वलेट अन्यथा हम के beacause नहीं इस्तेमाल करना चाहिए इतने सारे धागे

नहीं कर सकता पर निष्क्रिय अवस्था में प्राप्त एक सर्वलेट या एक फिल्टर एक संभावित तक पहुँच जाता है अनुरोध को संसाधित करते समय अवरुद्ध करना, यह ऑपरेशन को एक असीमित निष्पादन संदर्भ में असाइन कर सकता है और प्रतिक्रिया उत्पन्न किए बिना तुरंत कंटेनर से अनुरोध के साथ जुड़े थ्रेड को वापस कर सकता है। अवरोधन ऑपरेशन एक अलग थ्रेड में एसिंक्रोनस निष्पादन संदर्भ में पूर्ण होता है, जो प्रतिक्रिया उत्पन्न कर सकता है या किसी अन्य सर्वलेट को अनुरोध भेज सकता है।

एक सर्वलेट पर अतुल्यकालिक प्रसंस्करण सक्षम करने के लिए पैरामीटर @WebServlet एनोटेशन पर सत्य पर asyncSupported सेट इस प्रकार है:

@WebServlet (urlPatterns = { "/ asyncservlet"}, asyncSupported = true) सार्वजनिक वर्ग AsyncServlet HttpServlet {...}

सिंक्रोनस (क्लासिक वेब-एप्लिकेशन मॉडल) एक सिंक्रोनस अनुरोध क्लाइंट को तब तक अवरुद्ध करता है जब तक ऑपरेशन पूरा नहीं हो जाता है यानी ब्राउज़र अनुत्तरदायी नहीं है। ऐसे मामले में, ब्राउज़र के जावा स्क्रिप्ट इंजन को अवरुद्ध कर दिया गया है।

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

तुल्यकालिक संचार में दोनों एक ही समय जहां के रूप में अतुल्यकालिक में एक ही समय में सक्रिय करने की कोई जरूरत उदाहरण के लिए अतुल्यकालिक संदेश भेजने के लिए संदर्भित करता वहाँ एक नया धागा करने के लिए आपरेशन को अवरुद्ध और कंटेनर से जुड़े धागा चल रहा में सक्रिय होते हैं

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

दो सामान्य परिदृश्य हैं जिनमें अनुरोध से जुड़े धागे निष्क्रिय बैठे जा सकते हैं।

The thread needs to wait for a resource to become available or process data before building the response. For example, an application may need to query a database or access data from a remote web service before generating the response. 

The thread needs to wait for an event before generating the response. For example, an application may have to wait for a JMS message, new information from another client, or new data available in a queue before generating the response. 
संबंधित मुद्दे