10

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

दूसरा, मैं एक प्रणाली बनाना चाहता हूं जो चार प्रकार के कार्यों को निष्पादित करे, वहां कई ग्राहक होंगे और प्रत्येक के पास समय-समय पर चलाने के लिए प्रत्येक प्रकार के कई कार्य होंगे। उदाहरण के लिए: ग्राहक 1 में task_type1 होगा, task_type2 दो दिनों के बाद और इसी तरह, ग्राहक 2 हो सकता है जिसके पास task1type1 को उसी समय निष्पादित किया जा सकता है जैसे ग्राहक 1 के task_type1। यानी समवर्तीता की आवश्यकता है। कार्यों को निष्पादित करने के लिए कॉन्फ़िगरेशन डीबी में संग्रहीत किया जाएगा और इन कार्यों के परिणामों को डीबी में भी संग्रहीत किया जा रहा है। ग्राहक सिस्टम के साथ बातचीत करने के लिए एक वेब ब्राउज़र (एचटीएमएल पेज) से सिस्टम का उपयोग करेंगे (मूल रूप से, कार्यों को कॉन्फ़िगर करें और परिणामों को देखें)। मैंने एक बाकी webservice (JAX-RS का उपयोग करके) का उपयोग करने के बारे में सोचा था, जहां HTML पृष्ठ समवर्ती निष्पादन के लिए बैकएंड उपयोग थ्रेड के साथ संवाद करेंगे। प्रश्न:

  1. यह आसान लगता है, लेकिन क्या मैं सही दिशा में जा रहा हूं? या मुझे उदाहरण के लिए जावा बीन्स जैसी अन्य तकनीकों या अवधारणाओं का उपयोग करना चाहिए?

2. यदि मेरा दृष्टिकोण ठीक है, तो मुझे जेएसपी जैसी स्क्रिप्टिंग भाषा का उपयोग करने की ज़रूरत है या मैं सीधे बाकी यूआरएल में एचटीएमएल फॉर्म जमा कर सकता हूं और परिणाम प्राप्त कर सकता हूं (उदाहरण के लिए जेएसओएन का उपयोग कर)?

  1. यदि मैं एप्लिकेशन को वितरित करना चाहता हूं, तो क्या यह मेरे विचार के साथ संभव है? यदि नहीं, तो मुझे क्या उपयोग करने की आवश्यकता होगी?

कई प्रश्न होने के लिए खेद है, लेकिन मैं वास्तव में इसके बारे में उलझन में हूं।

+0

क्या आप वास्तव में उम्मीद करते हैं कि 'task_type1', 'task_type2', आदि बहुत सीपीयू-गहन होने जा रहे हैं? क्या आपने इसकी पुष्टि करने के लिए * परीक्षण * किया है? क्या वास्तव में एक ही समय में एप्लिकेशन का उपयोग करने वाले बहुत सारे उपयोगकर्ता होने जा रहे हैं? ऐसा हो सकता है कि एक सर्वर लोड को ठीक से संभाल सके और एप्लिकेशन को वितरित करने से केवल कोई अतिरिक्त लाभ न हो। दूसरा, मान लें कि आपको धागे की आवश्यकता नहीं है क्योंकि "कार्यों को एक ही समय में निष्पादित करने की आवश्यकता है"। जब तक आपको कई सीपीयू का लाभ उठाने की आवश्यकता नहीं होती है, तब तक एक सिंगल थ्रेड कार्य कतार से खींचने वाले कार्यों को शायद ठीक काम करेगा। –

+0

@AlexD कार्यों स्वयं सीपीयू गहन नहीं हैं, लेकिन अगर मुझे कई कार्यों के साथ कई ग्राहक मिलते हैं तो यह भविष्य में एक समस्या हो सकती है, मैं भविष्य के लिए स्केलेबिलिटी पर विचार कर रहा हूं। मुझे लगता है कि एक सर्वर अब के लिए संभाल लेंगे। लेकिन मैं जानना चाहता था कि मुझे इसकी आवश्यकता होने पर इसे कैसे वितरित किया जाए। अर्थात।मैं वितरण की अवधारणाओं को समझना चाहता था। – Sami

+0

@AlexD धागे के संबंध में, मुझे विशिष्ट समय पर कार्यों को निष्पादित करने की आवश्यकता है, उदाहरण के लिए, work1type1 को ग्राहक 1 के लिए 10:00 बजे निष्पादित किया जा सकता है और ग्राहक 2 के लिए अन्य task_type1 10:00 बजे भी हो सकता है। मुझे निष्पादन में कुछ प्रकार की सहमति की आवश्यकता है। i.e: समानांतर में दो कार्यों को संसाधित करना। – Sami

उत्तर

5

शब्द "वितरित आवेदन" का अर्थ है कि आवेदन प्रणाली के कुछ हिस्सों को विभिन्न कम्प्यूटेशनल नोड्स पर निष्पादित किया जाएगा (जो विभिन्न मशीनों पर अलग-अलग CPU/कोर हो सकते हैं या एक ही मशीन पर एकाधिक CPU/कोर के बीच हो सकते हैं)।

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

बाद में यदि आप स्केलेबिलिटी समस्याओं में भाग लेते हैं तो आप व्यवसाय तर्क के कुछ हिस्सों को ईजेबी 3 घटकों में माइग्रेट करना शुरू कर सकते हैं, जो कि अंततः ग्लासफिश जैसे अनुप्रयोग सर्वर के संदर्भ में कई कम्प्यूटेशनल नोड्स पर तैनात किए जा सकते हैं। मुझे नहीं लगता कि आपको इस समस्या से निपटने की आवश्यकता नहीं है जब तक आप इसे चलाने के लिए नहीं। यह कहना मुश्किल है कि क्या आप बिना किसी काम के प्रकृति के बारे में और जानेंगे कि ग्राहक क्या करेगा।

4

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

उपरोक्त टिप्पणियों में उल्लिखित @AlexD के रूप में, आपको हमेशा एक आवेदन वितरित करने की आवश्यकता नहीं है, हालांकि यदि आप ऐसा करना चाहते हैं, तो आपको शायद JMS पर विचार करना चाहिए, जो एक संदेश API है, जो आपको अनुमति दे सकता है लगभग किसी भी कार्यकर्ता अनुप्रयोग मशीन चलाने के लिए, संदेश कतार से संदेशों को पढ़ना और उन्हें संसाधित करना।

यदि आप गतिशील रूप से वितरित अनुप्रयोग का उत्पादन करना चाहते हैं, तो कहने के लिए, एकाधिक कम-संसाधन वाले वीएम (जैसे अमेज़ॅन ईसी 2 माइक्रो इंस्टेंस) या भौतिक हार्डवेयर, जिसे मांग से निपटने के लिए इच्छा में जोड़ा और हटाया जा सकता है, फिर आप इसे Project Shoal के साथ एकीकृत करने पर विचार करना चाहेंगे, जो जावा फ्रेमवर्क है जो एप्लिकेशन नोड्स के क्लस्टरिंग की अनुमति देता है, और उन्हें किसी भी समय प्रकट/गायब होने की अनुमति देता है। परियोजना शोल अंतर्निहित संचार प्रोटोकॉल के रूप में जेXTए और जेग्रुप का उपयोग करता है।

एक और मार्ग EJB एस अनुप्रयोग सर्वर पर चल रहे अपने एप्लिकेशन को वितरित करने के लिए हो सकता है।

6

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

आपको लगता है कि आप scalability के लिए आपके आवेदन वितरित करने के लिए आवश्यकता हो सकती है, तो पहली बात आप के बारे में सोचना चाहिए नहीं वेब सेवाओं और बहु ​​सूत्रण और संदेश कतार और उद्यम JavaBeans और ...

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

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

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

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