में वितरित लेनदेन और/या डेटा साझा करने के लिए जावा समाधान जावा सर्वर अनुप्रयोग को क्लस्टरिंग/वितरित करने के लिए सबसे अच्छे दृष्टिकोण क्या हैं? मैं एक ऐसे दृष्टिकोण की तलाश में हूं जो आपको अधिक एप्लिकेशन सर्वर, और अधिक डेटाबेस सर्वर जोड़कर क्षैतिज पैमाने पर स्केल करने की अनुमति देता है।क्लस्टर
- इस प्रकार की समस्या से निपटने के लिए आप कौन सी तकनीकों (सॉफ्टवेयर इंजीनियरिंग तकनीक या विशिष्ट तकनीकों) का सुझाव देंगे?
- कई पाठकों/लेखकों को स्केल करने के लिए एक स्थिरता परत को डिजाइन करने के लिए आप किस तकनीक का उपयोग करते हैं साझा डेटा लेनदेन और साझा डेटा तक स्केल पहुंच (साझा डेटा को खत्म करने का सर्वोत्तम तरीका है; साझा डेटा को खत्म करने के लिए आप कौन सी तकनीकों को लागू कर सकते हैं)।
- अलग दृष्टिकोण है कि क्या अपने लेनदेन पढ़ने के लिए या भारी लिख रहे हैं पर निर्भर करता है की जरूरत हो लगते हैं, लेकिन मुझे लगता है कि अगर आप एक "लिखने" भारी अनुप्रयोग है कि यह भी के लिए कुशल होगा अनुकूलन कर सकते हैं
इस "पढ़ें" "सर्वश्रेष्ठ" समाधान आपको एक एकल नोड के लिए जावा एप्लिकेशन लिखने की अनुमति देगा और उम्मीद है कि साझा डेटा को एक्सेस/लॉक करने के अधिकांश विवरण "छुपाएं"।
एक वितरित वातावरण में साझा डेटा तक पहुंचने के लिए कई लेन-देन हमेशा सबसे कठिन समस्या आते हैं। ऐसा लगता है कि समवर्ती लेनदेन के लिए 2 आम दृष्टिकोण हैं।
- Explicit locks (जो बहुत ही त्रुटि है प्रवण और धीमी गति से एक वितरित प्रणाली में एक से अधिक नोड्स भर में समन्वय करने के लिए)
- Software transactional memory (एसटीएम) उर्फ आशावादी संगामिति जहां एक सौदे एक के दौरान वापस लुढ़का हुआ है प्रतिबद्ध अगर यह पता चलता है कि साझा राज्य बदल गया है (और लेनदेन बाद में पुनः प्रयास किया जा सकता है)। कौन सा दृष्टिकोण स्केल बेहतर है और वितरित सिस्टम में ट्रेड-ऑफ क्या हैं?
मैं स्केलिंग समाधान (और सामान्य अनुप्रयोगों कि कैसे पैमाने पर करने के तरीके का उदाहरण में) जैसे शोध किया गया है:
- Terracotta - प्रदान करता है "पारदर्शी" स्केलिंग के लिए जावा स्मृति मॉडल का विस्तार करके जावा की समवर्ती लॉकिंग तंत्र (सिंक्रनाइज़, रीेंट्रंट रीडवाइट लॉक) का उपयोग करके वितरित साझा मेमोरी शामिल करें।
- Google App Engine Java - आपको जावा (या पायथन) अनुप्रयोगों को लिखने की अनुमति देता है जो "क्लाउड" सर्वरों के बीच वितरित किए जाएंगे, जहां आप वितरित करते हैं कि कौन सा सर्वर लेनदेन को संभालता है और आप अपने लगातार डेटा को स्टोर करने के लिए बिगटेबल का उपयोग करते हैं (सुनिश्चित नहीं है कि आप साझा किए गए लेन-देन कैसे करते हैं प्रभावी ढंग से स्केल करने में सक्षम होने के लिए डेटा या लॉक विवादों को संभाल लें)
- Darkstar MMO Server - डार्कस्टार सूर्य का ओपन सोर्स एमएमओ (बड़े पैमाने पर मल्टीप्लेयर ऑनलाइन) गेम सर्वर है जो वे एक थ्रेड ट्रांजैक्शनल तरीके से लेनदेन को स्केल करते हैं, जो किसी दिए गए लेनदेन को केवल एक निश्चित राशि के लिए चलाने की इजाजत देता है और काम करना और यदि यह लंबे समय तक चलता है तो यह रोलबैक होगा (सॉफ़्टवेयर ट्रांजैक्शनल मेमोरी की तरह)। वे स्केलिंग के लिए supporting a multi-node server setup में शोध कर रहे हैं।
- Hibernate's optimistic locking - अगर आप हाइबरनेट उपयोग कर रहे हैं आप software transactional memory प्रकार व्यवहार
- Apache CouchDB कई रीडर/राइटर डीबी के लिए "पैमाने" एक जाल विन्यास में स्वाभाविक रूप से माना जाता है कि समर्थन करने के लिए उनके आशावादी संगामिति समर्थन उपयोग कर सकते हैं। (क्या आप लॉकिंग डेटा को प्रबंधित करने या लेनदेन अलगाव सुनिश्चित करने का एक अच्छा उदाहरण है?):
- JCache - सामान्य प्रश्नों के परिणामों को कैश करके "पढ़ने" भारी ऐप्स स्केलिंग, जिसे आप Google एपेंगिन में memcached तक पहुंचने और अन्य बार पढ़ने वाले डेटा को कैश करने के लिए उपयोग कर सकते हैं।
टेराकोटा स्केलिंग का समर्थन करने के लिए मौजूदा सर्वर एप्लिकेशन को "आसानी से" संशोधित कर सकता है (@Root ऑब्जेक्ट्स और @ ऑटो लॉक रीड/लिखें विधियों को परिभाषित करने के बाद)। समस्या वास्तव में एक वितरित अनुप्रयोग से सबसे अधिक प्रदर्शन प्राप्त करने के लिए है, वितरित सिस्टम के लिए अनुकूलन वास्तव में एक विचार के बाद नहीं है कि आपको इसे ज्ञान के साथ डिजाइन करना होगा कि ऑब्जेक्ट एक्सेस संभावित रूप से नेटवर्क I/O द्वारा अवरोधित किया जा सकता है।
ठीक से पैमाने पर करने के लिए ऐसा लगता है जैसे कि यह हमेशा विभाजन डेटा और लोड संतुलन लेनदेन करने के लिए नीचे आता है इस तरह कि किसी दिए गए "निष्पादन इकाई" (सीपीयू कोर -> धागा -> वितरित अनुप्रयोग नोड -> डीबी मास्टर नोड)
ऐसा लगता है कि क्लस्टरिंग द्वारा किसी ऐप स्केल को सही तरीके से बनाने के लिए आपको अपने डेटा एक्सेस पढ़ने/लिखने के संदर्भ में अपने लेन-देन को विभाजित करने में सक्षम होना चाहिए। लोग अपने एप्लिकेशन डेटा (ओरेकल, Google बिगटेबल, माईएसक्यूएल, डाटा वेयरहाउसिंग) को वितरित करने के लिए किस समाधान के साथ आते हैं, और आम तौर पर आप विभाजन डेटा का प्रबंधन कैसे करते हैं (कई लिखने वाले स्वामी, कई और पढ़ें डीबी आदि)।
अपने डेटा दृढ़ता परत को स्केल करने के मामले में कई पाठकों/कई लेखकों को आपके डेटा को विभाजित करने के मामले में किस तरह का कॉन्फ़िगरेशन स्केल करता है (आमतौर पर मैं किसी दिए गए उपयोगकर्ता (या जो भी मूल इकाई) के आधार पर अपना डेटा विभाजित करता हूं आमतौर पर आपकी "रूट" ऑब्जेक्ट इकाई होती है) एक मास्टर डीबी के स्वामित्व में)
"काम करने वाली एक जटिल प्रणाली हमेशा काम करने वाली एक साधारण प्रणाली से विकसित होती है। व्यस्त प्रस्ताव भी सत्य प्रतीत होता है: स्क्रैच से डिज़ाइन की गई जटिल प्रणाली कभी काम नहीं करती है और काम नहीं किया जा सकता है। आपको एक कामकाजी सरल प्रणाली के साथ शुरू, शुरू करो। " -John Gall –