2011-01-03 13 views
28

में जावा वेब एप्लिकेशन एक सर्वलेट कंटेनर (जैसे टोमकैट) बनाम चलाने के लिए एक छोटा जावा वेब ऐप बनाने के क्या फायदे हैं। एक अंतर्निहित वेब सर्वर के साथ एक स्टैंडअलोन जावा ऐप बनाना और चलाना यह एक रिवर्स प्रॉक्सी के पीछे है?एक सर्वलेट कंटेनर बनाम स्टैंडअलोन

मैं लगभग एक साल तक जावा के साथ खेल रहा हूं। मैंने देखा है कि टॉमकैट लॉन्च करने में समय लगता है, और कक्षा लोडर मुद्दों के कारण गर्म-पुनर्वितरण करना हमेशा संभव नहीं होता है। सर्वलेट एपीआई कुछ हद तक मेरे लिए घिरा हुआ लगता है, खासकर कॉन्फ़िगरेशन और रीस्टफुल डिज़ाइन के परिप्रेक्ष्य से (जो वास्तव में पूरी तरह से समर्थन नहीं करता है)।

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

हालांकि, मुझे यह कहते हुए याद दिलाया जाता है कि आमतौर पर सच होने के लिए बहुत अच्छा लगता है। तो मेरा सवाल यह है कि, मैं अपने वेब ऐप्स को स्टैंडअलोन क्यों नहीं बनाना चाहूंगा? एक सर्वलेट कंटेनर मुझे और/या मेरे अंतिम उपयोगकर्ताओं को क्या देता है जिन्हें हमें वास्तव में चाहिए लेकिन पता नहीं है?

उत्तर

13

यहाँ में 2 अलग सवाल हैं:

  1. मैं एक एम्बेडेड सर्वर का उपयोग करना चाहिए, या एक कंटेनर में तैनात?

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

    दूसरी ओर, अनुप्रयोग सर्वर आप जैसे कुछ अच्छा लाभ देने में निर्मित प्रबंधन, निर्मित आदि एक सेवा के रूप में चलाने की क्षमता है,

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

    बीटीडब्ल्यू, यह अजीब बात है कि आपके पास हॉट-रीडेयमेंट के साथ समस्याएं हैं; बिलाव इसके साथ मुद्दों जब तक आप कुछ अजीब कोने मामले में चल रहे हैं ...

  2. मैं सर्वलेट एपीआई का उपयोग किया जाना चाहिए नहीं होने की जानी चाहिए?

    यह # 1 से ऑर्थोगोनल है। आप जेटी और को बहुत अच्छी तरह से एम्बेड कर सकते हैं Servlets लागू करें। आप किसी सर्वर सर्वर http://www.restlet.org/documentation/1.0/faq#02 के माध्यम से टॉमकैट के अंदर रेस्टलेट एपीआई का उपयोग भी कर सकते हैं।

    मैं व्यक्तिगत रूप से को सर्वलेट एपीआई straight-forward.You संगामिति और राज्य प्रबंधन की तरह अच्छा काम करने में बहुत हो पाते हैं। मैं काफी पता नहीं क्या इसका मतलब है कि RESTful डिजाइन समर्थित नहीं है, लेकिन अगर Restlets बेहतर अपनी आवश्यकताओं को संबोधित, तो उस का उपयोग करें ...

0

सर्वलेट कंटेनर अक्सर स्वचालित सत्र प्रबंधन, हॉट-तैनाती, फेलओवर और क्लस्टरिंग के लिए ढांचे जैसे उपयोगी सामान का एक गुच्छा प्रदान करते हैं। यह निश्चित रूप से कंटेनर पर निर्भर करता है, लेकिन कभी-कभी ये बहुत उपयोगी उपकरण होते हैं। कभी-कभी वे नहीं होते हैं।

संपादित करें: हॉट-रेडियोजन के बारे में आपकी टिप्पणी पर ध्यान दें। हां, कभी-कभी कंटेनर बग्गी और दर्द के साथ काम करते हैं, और वे सभी अपने स्वयं के quirks होते हैं। फिर भी, कभी-कभी वे कुछ वाकई अच्छी चीजें प्रदान करते हैं।

3

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

पीएस दो दृष्टिकोण एक-दूसरे को बाहर नहीं करते हैं। आप विकास के दौरान जेटी के साथ बहुत अच्छी तरह से काम कर सकते हैं और फिर क्यूए/उत्पादन के लिए कुछ (गैर-एम्बेडेड) कंटेनर में अपना युद्ध तैनात कर सकते हैं। या ... उत्पादन के लिए जेटी के साथ चिपके रहें, अगर वह वास्तव में आपकी आवश्यकताओं के अनुरूप है।

4

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

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

आपकी शिकायत के लिए कि सर्वलेट एपीआई रीस्टफुल डिज़ाइन का समर्थन नहीं करता है - आप बिंदु खो रहे हैं, ऐसा कभी नहीं करना था। लेकिन बहुत सारे REST पुस्तकालय हैं जो Servlet API के शीर्ष पर चलते हैं।

0

इन-प्रोसेस में सर्वलेट कंटेनर कंटेनर हैं जो वेब सर्वर के जेवीएम के अंदर काम करते हैं, ये अच्छे प्रदर्शन प्रदान करते हैं लेकिन स्केलेबिलिटी में खराब होते हैं।

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

इन प्रकार के कंटेनरों के अलावा, तीसरा प्रकार है जो स्टैंड-अलोन सर्वलेट कंटेनर है। ये वेब सर्वर का एक अभिन्न हिस्सा हैं।

-1

यदि आपको अपने गर्म तैनाती के साथ समस्याएं आ रही हैं, तो संभवतः आप अपने बाहरी कनेक्शन या अन्य संसाधनों की सफाई नहीं कर रहे हैं। इसे संभालने के लिए, आमतौर पर आप एक श्रोता को कार्यान्वित करना चाहते हैं जो आपको कुछ बताएगा या बंद होने पर आपको बताएगा।

आप शायद अपने युद्धों में कुछ इस तरह लागू करना चाहिए (बिल्ला 6):

public class MyTomcatInitCleanupListener implements ServletContextListener 
{ 
    @Override 
    public void contextInitialized(ServletContextEvent arg0) 
    { 
     super.contextInitialized(arg0); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent arg0) 
    { 
     super.contextDestroyed(arg0); 
    } 
} 
बिल्ला के लिए

7+, आप गूगल कर सकते हैं "बिल्ला जीवन चक्र श्रोता"

संबंधित मुद्दे