जावा में अत्यधिक स्केलेबल वेब सेवाओं को कैसे डिज़ाइन करें?


15

मैं कुछ वेब सेवाएँ बना रहा हूँ जिनमें 2000 समवर्ती उपयोगकर्ता होंगे। सेवाओं को मुफ्त में दिया जाता है और इसलिए उन्हें बड़ा उपयोगकर्ता आधार मिलने की उम्मीद है। भविष्य में इसे 50,000 उपयोगकर्ताओं तक स्केल करने की आवश्यकता हो सकती है।

पहले से ही कुछ अन्य प्रश्न हैं जो इस मुद्दे को संबोधित करते हैं जैसे - /programming/2567254/building-highly-scalable-web-services

हालाँकि मेरी आवश्यकताएं ऊपर के प्रश्न से भिन्न हैं।

उदाहरण के लिए - मेरे आवेदन में उपयोगकर्ता इंटरफ़ेस नहीं है, इसलिए छवियां, सीएसएस, जावास्क्रिप्ट एक मुद्दा नहीं हैं। यह जावा में है इसलिए PHP को मूल कोड में अनुवाद करने के लिए हिपहॉप का उपयोग करने जैसे सुझाव बेकार हैं।

इसलिए मैंने अपना प्रश्न अलग से पूछने का निश्चय किया।

यह मेरा प्रोजेक्ट सेटअप है -

  1. Apache CXF का उपयोग करके वेब आधारित बाकी सेवाएँ
  2. Hibernate 3.0 (आलसी लोडिंग और धुन के लिए कस्टम HQL जैसी प्रासंगिक अनुकूलन के साथ)
  3. टोमाटैक 6.0
  4. MySql 5.5

जावा आधारित एप्लिकेशन को स्केलेबल बनाने के लिए किन सर्वोत्तम प्रथाओं का पालन करना है?


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

@ebaxt आपके सुझाव के लिए धन्यवाद। गिगास्पेस ओपनसोर्स होने लगता है। लेकिन हेज़ल कास्ट दिलचस्प लग रही है।
क्षितिज शर्मा

1
@ebaxt "क्या आप सुनिश्चित हैं कि आपको एक रिलेशनल डेटाबेस की आवश्यकता है?" नोस्कोल को अपनाने से एप्लिकेशन आर्किटेक्चर पर काफी बदलाव होगा। हम जटिलता को न्यूनतम रखने की कोशिश कर रहे हैं। लागत हालांकि हमारे लिए कोई कारक नहीं है। तो हम संबंधपरक दृष्टिकोण के साथ रहेंगे।
क्षितिज शर्मा

1
आप Postgres, MySQL या कभी भी का उपयोग कर सकते हैं। आपके बुनियादी ढांचे के बारे में क्या है? क्या आप डिस्क-सरणियों का उपयोग कर सकते हैं? क्या सर्वर उसी स्थान पर होस्ट किए गए हैं? क्या आप अपने क्लस्टर को दिल की धड़कन आदि से जोड़ सकते हैं? क्या आप उन्हें एक ही सबनेट में डाल सकते हैं?
एडजाद करें

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

जवाबों:


8

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

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

आपको याद रखना चाहिए कि फ़ाइलें, लेनदेन और अन्य संसाधन उन्हें खुले रखने के मामले में महंगे हैं। सुनिश्चित करें कि आप जितनी जल्दी हो सके फाइलों और लेनदेन को बंद कर दें, या आप उन बगों के साथ समाप्त हो जाएंगे जो बड़े पैमाने पर सेटअपों में पुन: उत्पन्न होंगे

इसके अलावा आपको समझना चाहिए कि 2000 समवर्ती उपयोगकर्ता क्या हैं - इसका मतलब यह है कि 2000 उपयोगकर्ता एक बार में आपके सर्वर तक पहुंच रहे हैं, या वे आपके सिस्टम का उपयोग कर रहे हैं? उन मामलों के बीच भेद करें जहां 2000 उपयोगकर्ता आपके सर्वर पर एक सॉकेट खोलने की कोशिश करते हैं, और एक मामला जहां केवल 500 हैं, और 1500 वर्तमान में परिणाम देख रहे हैं, क्लाइंट साइड पर इनपुट भरने के।

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

यदि आपको सिंक्रनाइज़ेशन कोड की आवश्यकता है - तो सिंक्रनाइज़ेशन रणनीति को सावधानीपूर्वक चुनें। मैंने कुछ प्रणालियाँ देखीं जिनमें एक साधारण लॉक का इस्तेमाल किया गया था, लेकिन एक रीडरवेयरचीजों में सुधार हो सकता था, क्योंकि ज्यादातर पहुंच केवल पढ़ने के लिए थी।

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

मैंने पहले हाइबरनेट का उल्लेख किया है - मैं इसे ध्यान से उपयोग करने पर विचार करने के लिए आपको पुनः बताऊंगा - यदि आपको बहुत सारे लेखन करने की आवश्यकता है, और कम पढ़ता है, तो हाइबरनेट आपके लिए आदर्श नहीं हो सकता है, और आपको शायद एक आवरण के रूप में स्प्रिंग-जेबीसीबीसी के साथ काम करने पर विचार करना चाहिए। JDBC।

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

मैं बताना चाहूंगा कि अतीत में, मैंने jsoss 4.2.1 के साथ mysql पर एक प्रणाली (एकल नोड) (ज्यादातर केवल पहुंच पढ़ें) के साथ निपटाया और 2000 समानांतर तक पहुंचने में कामयाब रहा उपयोगकर्ताओं
(हमारे सर्वर के खिलाफ 2000 सॉकेट खोलने के संदर्भ में एक बार में एक्सेस नहीं करना), लेकिन हमारे सिस्टम का उपयोग करना / ब्राउज़ करना, JBoss कैश का उपयोग करना और कैश तक कुछ सबसे अधिक एक्सेस किए गए डेटा या हमारे द्वारा महसूस किए गए डेटा को लोड करना, "हॉट एंड पॉपुलर" होने जा रहा है। "लेकिन हमारा समाधान हमारी वास्तुकला और हमारे प्रवाह के लिए अच्छा था,
इसलिए जैसा कि मैं इन मामलों में कहता हूं -
अधिक युक्तियां और तरकीबें हैं, लेकिन यह वास्तव में आपकी वास्तुकला पर निर्भर करता है, और आपके सिस्टम में क्या प्रवाह होना चाहिए। सौभाग्य!


मैं संग्रहीत प्रोक्स को छोड़कर सहमत हूं, संग्रहीत प्रोक्स का उपयोग न करें। और आप
थ्रेडसेफ़

3

अच्छा प्रश्न। शायद यह कहना कठिन है कि सबसे अच्छा तरीका क्या है, लेकिन मैं अपने अनुभव से कोशिश करूंगा।

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

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

 Are there faster alternatives to Mysql?

आप MySQL क्लस्टर के लिए जा सकते हैं जिसमें इन-मेमोरी डेटास्टोर है। लेकिन इस तथ्य से सावधान रहें कि एप्लिकेशन को कुछ परिवर्तनों की आवश्यकता हो सकती है। sql joinsअच्छी तरह से MySQL क्लस्टर में समर्थित नहीं हैं, हालांकि नवीनतम संस्करण में वहाँ उसी के लिए सुधार कर रहे हैं। यदि लागत एक कारक नहीं है, तो आप Oracle की कोशिश कर सकते हैं।

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

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


"मैं आपको लोड संतुलन के लिए अपाचे का उपयोग करने की तुलना में लोड बैलेंसर का उपयोग करने का सुझाव दूंगा" आप अपाचे नहीं तो कौन सा दृष्टिकोण / सॉफ्टवेयर सुझाएंगे?
क्षितिज शर्मा

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

हम एक ही काम करने के लिए httpd के साथ एक समर्पित सर्वर का उपयोग कर रहे हैं। हार्डवेयर कोई मुद्दा नहीं है।
क्षितिज शर्मा

यदि मुझे सही याद है, तो आप httpd और mod_cluster का उपयोग कर सकते हैं। मैं हार्डवेयर एलबी के "ओवरकिल" समाधान पर जाने से पहले सावधानी से विचार करूंगा, httpd और mod_cluster की जाँच करने से पहले

@ ज़ैस्के - आप शायद सही कह रहे हैं कि हार्डवेयर लोड बैलेंसर शायद एक ओवरकिल है। लेकिन अगर आपको अधिक सर्वर जोड़ने की जरूरत है, तो इसे और आसान बनाने की जरूरत है।

2

मैं वर्तमान में एक समान प्रणाली (पेशेवर स्तर पर) स्थापित कर रहा हूं और यह वह डिजाइन है जिसे मैंने चुना है:

  • दो नग्नेक्स लोडबलैंसर (दोनों सक्रिय, दोनों दूसरे के लिए विफलता, डीएनएस राउंड रॉबिन के साथ संतुलित)
  • मास्टर मास्टर प्रतिकृति मोड में दो MySQL डेटाबेस
  • टॉमकैट क्लस्टर के रूप में दो टॉमकैट उदाहरण हैं
  • टॉमकैट क्लस्टर के लिए कैशिंग और सेशन स्टेट शेयरिंग के लिए दो मैमकेड इंस्टेंसेस

यह एक निरर्थक, उच्च उपलब्धता, स्केलेबल समाधान प्राप्त करेगा।

भारोत्तोलक (शालीन हार्डवेयर पर) आसानी से एक संतृप्त 1gbit रेखा को प्रत्येक पर भारित करेगा। यह एसएसएल ऑफलोडिंग के लिए भी एक शानदार जगह है।

आप अपने सत्र की जानकारी को संस्मरण में सहेज सकते हैं। यदि एक टमकाट इंस्टेंस विफल हो जाता है, तो एक और टेंकैट इंस्टेंस प्रासंगिक सत्र की जानकारी को पुनः प्राप्त कर सकता है और ग्राहक किसी चीज़ को नोटिस नहीं करेंगे। यह भी चिपचिपा सत्र के साथ गठबंधन करने के लिए मत भूलना। (नेटवर्क ट्रैफिक को नीचे रखने के लिए)

टॉमकैट क्लस्टरिंग में मेम्केड का उपयोग किए बिना, वास्तविक समय में क्लस्टर के बीच सत्र की जानकारी साझा करने का विकल्प भी है। हालांकि मुझे लगता है कि प्रदर्शन के लिहाज से मेम्केड का इस्तेमाल करना बेहतर होगा।

यदि आपको इनमें से किसी भी एप्लिकेशन में अधिक शक्ति चाहिए:

  • Nginx: अधिक लोडबेलेंसर जोड़ें, हालांकि मुझे नहीं लगता कि यह बहुत जल्द अड़चन होगी।
  • टॉमकैट: आप आसानी से टॉमकैट क्लस्टर का आकार बढ़ा सकते हैं या अधिक क्लस्टर जोड़ सकते हैं
  • मैसकल: कुछ रीड-ओनली स्लेव्स जोड़ें या क्लस्टर साइज़ बढ़ाएँ (आपके आवेदन के आधार पर, लेकिन जब से आपने REST- आधारित एप्लिकेशन लिखा है, तो यह समस्या नहीं होनी चाहिए)
  • मेम्केड: अधिक नोड्स जोड़ें, मेम्केडेड स्केल बहुत अच्छी तरह से मेरा मानना ​​है।

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

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

यदि आप इस प्रक्रिया के दौरान समान प्रदर्शन परीक्षण चलाते रहते हैं, तो आप अपने लिए देख सकते हैं कि क्या X का उपयोग करना आपके सेटअप में Y का उपयोग करने से बेहतर है , या कैशिंग का क्या प्रभाव पड़ेगा, आदि।

अंत में, इस तरह का एक सेटअप वास्तव में आपके आवेदन और उसके ग्राहकों की आवश्यकताओं पर निर्भर करता है, सब कुछ विभिन्न तरीकों से किया जा सकता है, प्रत्येक की अपनी ताकत और कमजोरियां हैं।

कोई और प्रश्न?

सौभाग्य!

वेस्ले


हेज़लकास्ट? hazelcast.com
NimChimpsky

क्या आप कैशिंग परत के लिए एक फ्रेमवर्क का उपयोग करते हैं, या SQL प्रश्नों पर मैन्युअल हैश का एक गुच्छा?
djechlin
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.