EJB's - रिमोट और / या स्थानीय इंटरफेस का उपयोग कब करें?


180

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

अगर ऊपर दी गई मेरी धारणा सही है, तो आप यह कैसे चुनेंगे कि किसी नए एप्लिकेशन के लिए लोकल या रिमोट इंटरफेस का इस्तेमाल किया जाए या नहीं, जहां आपकी अनिश्चितता ट्रैफिक की मात्रा के बारे में है? स्थानीय इंटरफेस का उपयोग करके शुरू करें, और जहां लागू हो वहां धीरे-धीरे रिमोट इंटरफेस में अपग्रेड करें?

किसी भी स्पष्टीकरण और सुझावों के लिए धन्यवाद।

जवाबों:


186

मैं जावा ईई के लिए बहुत नया हूं और मैं स्थानीय इंटरफेस और रिमोट इंटरफेस की अवधारणा को समझने की कोशिश कर रहा हूं।

EJB विनिर्देश के शुरुआती संस्करणों में, EJB को "दूरस्थ" घटक माना जाता था और उन्हें आह्वान करने का एकमात्र तरीका RMI शब्दार्थ और सभी उपरि का उपयोग करके दूरस्थ कॉल करना था (यह एक नेटवर्क कॉल और प्रत्येक के लिए ऑब्जेक्ट क्रमांकन था। मेथड कॉल)। EJB ग्राहकों को EJB कंटेनर के साथ एक ही वर्चुअल मशीन में धराशायी होने पर भी यह प्रदर्शन जुर्माना देना पड़ता था।

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

मुझे बताया गया है कि जावा ईई का एक बड़ा फायदा यह है कि इसे स्केल करना आसान है (जो मेरा मानना ​​है कि आप विभिन्न घटकों को अलग-अलग सर्वरों पर तैनात कर सकते हैं)

जावा ईई पैमाने कर सकते हैं, लेकिन यह जरूरी नहीं कि घटकों को वितरित करने का मतलब है । आप वेब टियर और EJB टियर को अलग किए बिना क्लस्टर पर वेब + ईजेबी एप्लिकेशन चला सकते हैं।

यदि आप अपने अनुप्रयोग को विभिन्न सर्वरों पर अलग-अलग घटकों की अपेक्षा करते हैं, तो क्या आप रिमोट इंटरफेस का उपयोग करने वाले हैं? और स्थानीय इंटरफेस का उपयोग करें यदि आपका आवेदन केवल एक सर्वर पर रहने वाला है?

मैं इसे इस तरह वाक्यांश देता हूं: यदि ग्राहक एक ही जेवीएम में नहीं हैं तो रिमोट इंटरफेस का उपयोग करें (इसका मतलब केवल एक सर्वर / जेवीएम का उपयोग करना नहीं है)।

(...) स्थानीय इंटरफेस का उपयोग करके शुरू करें, और जहां लागू हो वहां धीरे-धीरे दूरस्थ इंटरफेस में अपग्रेड करें?

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

मैं नीचे उल्लिखित संसाधनों की जांच करने का सुझाव देता हूं (2 पहले वाले काफी पुराने हैं, लेकिन अभी भी प्रासंगिक हैं, 2 अन्य हाल के हैं)।

साधन


2
मुझे यह सवाल दिलचस्प लगा। "रिमोट इंटरफेस पर स्विच करना बिल्कुल अनिवार्य नहीं है" से आपका क्या मतलब है? क्या इसका मतलब है कि जब आप एक ही JVM के बाहर एक नया ग्राहक जोड़ते हैं, तो आपको एक दूरस्थ इंटरफ़ेस बनाने की आवश्यकता नहीं है?
मुहम्मिदा

2
@ जोसेक थैंक्स, खुशी है कि आप इसे पसंद करते हैं @mohamida मैंने शब्दांकन में थोड़ा बदलाव किया। मेरा आशय यह है कि आप एक ढँकी हुई संरचना को बंद कर सकते हैं।
पास्कल थिवेंट

1
उत्तर और अतिरिक्त संसाधनों के लिए धन्यवाद, वे बहुत मददगार रहे हैं। ऐसा लगता है कि वेब एप्लिकेशन को स्केल करने के कुछ तरीके हैं ... यानी इटैलिकानेन्ट्स को वितरित करना (जो कि मैं इसे अलग-अलग JVM पर अलग-अलग स्तरों को तोड़कर?) या लोड बैलेंसिंग का उपयोग कर रहा हूं (जो पूरे ऐप पर होगा। कई सर्वर;) और मुझे लगता है कि आप दोनों के संयोजन का उपयोग कर सकते हैं? क्या आप संयोग से इस विषय पर अच्छी पुस्तकों के बारे में जानते हैं? एक बार फिर धन्यवाद!
बजे ब्रायन डायकासा

2
@ ब्रायन It seems like there are a couple ways of scaling a web application (...) and I suppose you could use a combination of both?हां, बिलकुल ऐसा ही है। Do you, by chance know of good books on this topic?अफसोस की बात है, नहीं, मैं "ZE" निरपेक्ष संसाधन नहीं जानता, अगर वहाँ एक है। मैंने कुछ संदर्भों के साथ अधिक संसाधन जोड़े हैं।
पास्कल थिवेंट

पहला संसाधन लिंक मर चुका है
Viacheslav Dobromyslov

48

जबकि मैं ऊपर लिखे गए अधिकांश बातों से सहमत हूं, मैं विचारों को थोड़ा "कैसे शुरू करें" को परिष्कृत करना चाहूंगा।

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

इस तरह, आप आसानी से दूरस्थ और स्थानीय कार्यान्वयन के बीच स्विच कर सकते हैं - और यदि आप स्प्रिंग जैसे IoC कंटेनर का उपयोग करते हैं, तो आप इसे केवल कॉन्फ़िगरेशन के माध्यम से कर सकते हैं।

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

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

सौभाग्य।


2
प्रभावी जावा प्रति परिवर्तनशीलता को कम करने के लिए एक और कारण की तरह लगता है। क्या यह EJB के साथ RMI टाइप इंटरफेस के लिए "रिमोट में स्विच" करने के लिए लचीलेपन में मदद करेगा?
थफिर

19

EJB Spec 3.2 के अनुसार एक EJB स्थानीय या दूरस्थ हो सकता है । एक व्यावसायिक इंटरफ़ेस एक ही समय में स्थानीय और दूरस्थ दोनों नहीं हो सकता।

@Local एनोटेट बीन्स को केवल तभी एक्सेस किया जा सकता है जब वे एक ही एप्लिकेशन में हों।

@Remote एनोटेट किए गए बीन्स को विभिन्न अनुप्रयोगों में, अलग-अलग जेवीएम में या एप्लिकेशन सर्वर पर रहते हुए एक्सेस किया जा सकता है।

तो ध्यान रखने योग्य महत्वपूर्ण बातें हैं:

  1. यदि एक बीन क्लास में @Remoteएनोटेशन होता है , तो सभी कार्यान्वित इंटरफेस को दूरस्थ होना है।
  2. यदि बीन क्लास में कोई एनोटेशन नहीं है या यदि है @Local एनोटेशन निर्दिष्ट है, तो सभी कार्यान्वित इंटरफ़ेस को स्थानीय माना जाता है।
  3. किसी भी इंटरफेस को स्पष्ट रूप से एक बीन के लिए परिभाषित किया गया है जिसमें कोई इंटरफ़ेस शामिल नहीं है, इसे @Local घोषित किया जाना चाहिए।
  4. ईजेबी 3.2 रिलीज़ उन स्थितियों के लिए अधिक ग्रैन्युलैरिटी प्रदान करने के लिए जाता है जहां स्थानीय और दूरस्थ इंटरफेस को स्पष्ट रूप से परिभाषित करने की आवश्यकता होती है।

1
प्रश्न: क्या आप @Localकिसी अन्य एप्लिकेशन (JAR, WAR, EAR) में EJB को लागू करने के लिए उपयोग कर सकते हैं , लेकिन वही JVM?
कार्लिटोस वे

@PritamBanerjee कार्लिटोस वा पर कोई विचार, मैं भी इसी मुद्दे का सामना कर रहा हूं। EJB अलग क्लस्टर में है और क्लाइंट सर्वलेट ऐप अलग-अलग में है।
गोवि एस।

@ गोविंदासखरे मैं उस बारे में निश्चित नहीं हूं। क्षमा करें :(
प्रीतम बैनर्जी

7

यह आपकी चिंताओं का जवाब दे सकता है:

जब आप वितरित वातावरण में बीन का उपयोग करने की योजना बनाते हैं, तो आमतौर पर आपके एंटरप्राइज़ जावा बीन को उन मामलों में एक दूरस्थ क्लाइंट दृश्य की आवश्यकता होगी। विशेष रूप से, ये ऐसे मामले हैं जब क्लाइंट जो इसके साथ काम करेगा वह एक अलग जावा वर्चुअल मशीन (जेवीएम) में होगा। दूरस्थ क्लाइंट दृश्य के मामले में, दूरस्थ होम इंटरफ़ेस और / या दूरस्थ घटक इंटरफ़ेस से किसी भी विधि को कॉल करना दूरस्थ विधि मंगलाचरण (RMI) के माध्यम से नियंत्रित किया जाएगा।

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

स्रोत: http://www.onjava.com/pub/a/onjava/2004/11/03/localremote.html?page=last&x-showcontent=text

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.