2009-07-28 31 views
42

क्लस्टर पर्यावरण में सिंगलटन ऑब्जेक्ट को दोबारा करने की सबसे अच्छी रणनीति क्या है?सिंगलटन

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

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

कैश को सिंक में रखने का सबसे अच्छा तरीका क्या है?

धन्यवाद।

संपादित करें: कैश मुख्य रूप से यूआई के लिए एक स्वत: पूर्ण सूची (प्रदर्शन के कारणों) प्रदान करने के लिए प्रयोग किया जाता है और हम Websphere का उपयोग करें। तो किसी भी वेबस्पेयर संबंधित सुझावों का स्वागत है।

उत्तर

9

सरल तरीके हैं:

  1. अपने सिंगलटन कैश करने के लिए एक समाप्ति टाइमर जोड़ें ताकि हर बार कैश पर्ज और subsquent हो जाता है कॉल स्रोत से अद्यतन डेटा लाने (जैसेएक डेटाबेस)

  2. जेएमएस विषय/टीआईबीआरवी जैसे कुछ का उपयोग करके कैश के लिए एक अधिसूचना तंत्र लागू करें। सब्सक्राइब करने के लिए प्रत्येक कैश उदाहरण प्राप्त करें और इस विषय पर प्रसारित किसी भी परिवर्तन संदेश पर प्रतिक्रिया दें।

+0

क्या आप 2 पर विस्तृत कर सकते हैं? आपका मतलब जेएमएस पब/सबस्क्राइब मॉडल है? – lud0h

+0

हां समाधान 2 अनिवार्य रूप से व्यक्तिगत कैश उदाहरणों में परिवर्तनों को प्रसारित करने के लिए एक पब/उप तंत्र का उपयोग करने का एक तरीका है। आपको प्रत्येक कैश द्वारा सब्सक्राइब किए गए एप्लिकेशन सर्वर पर चलने वाला एक जेएमएस विषय बनाना होगा। जब वह डेटा बदलता है तो संदेश को विषय पर प्रकाशित करने की आवश्यकता होगी। तब प्रत्येक ग्राहक को यह संदेश प्राप्त होगा और तदनुसार स्थानीय कैश अपडेट करेगा। – pjp

+0

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

16

अपने सिंगलटन कैश को एक वितरित कैश के साथ बदलें।

ऐसा एक कैश JBoss Infinispan हो सकता है लेकिन मुझे यकीन है कि अन्य वितरित कैश और ग्रिड प्रौद्योगिकियां मौजूद हैं, जिनमें वाणिज्यिक बिंदु भी शामिल हैं जो शायद इस बिंदु पर अधिक परिपक्व हैं।

सामान्य रूप से सिंगलटन ऑब्जेक्ट्स के लिए, मुझे यकीन नहीं है। मुझे लगता है कि मैं पहली जगह में सिंगलेट नहीं होने का प्रयास करूंगा।

+0

मुझे पता चला है कि कार्यान्वित करने के लिए सबसे सरल (विषयपरक) 'ehcache' लगता है। –

1

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

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

अंतिम उपाय के रूप में, आप क्लस्टर सिंगलेट प्रबंधित करने के लिए डेटाबेस लॉकिंग का उपयोग कर सकते हैं, लेकिन गंभीरता से नाजुक है। सिफारिश नहीं की गई।

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

1

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

ठीक है, rant over, memcache या कुछ समान के बारे में क्या? आपको अपने कैश के लिए किस तरह की एफ़िनिटी की आवश्यकता है? क्या यह खराब है अगर यह कभी भी पुराना है, या क्या डेटा में कितनी तारीख हो सकती है, इसमें कुछ लचीलापन है?

+0

हम इसे स्वत: पूर्ण सूची के लिए उपयोग करते हैं, इसलिए उपयोगकर्ताओं को परिवर्तन दिखाई नहीं देंगे। आपकी प्रतिक्रिया के लिए Thx। – lud0h

4

या की तरह memcached

http://www.danga.com/memcached/

कुछ क्या memcached है? memcached उच्च प्रदर्शन, वितरित स्मृति ऑब्जेक्ट कैशिंग सिस्टम, प्रकृति में जेनेरिक है, लेकिन में उपयोग के लिए लक्षित है, जो डायनामिक वेब अनुप्रयोगों को डेटाबेस लोड को कम करके बढ़ाता है।

Danga इंटरएक्टिव memcached विकसित की गति LiveJournal.com, एक साइट है जो था पहले से ही 20 मिलियन + गतिशील पेज वेबसर्वर का एक समूह और डेटाबेस का एक समूह साथ 1 लाख उपयोगकर्ताओं के लिए प्रति दिन विचारों को बढ़ाने के लिए कर रही है सर्वर। memcached को लगभग कुछ भी नहीं, उपयोगकर्ताओं, बेहतर संसाधन उपयोग, और पर एक यादगार मिस पर डेटाबेस तक तेजी से पहुंच के लिए तेजी से पृष्ठ लोड समय प्रदान करते हैं।

1

1) डेटा के डेटा के बाहर, और 2) के आधार पर इसे संभालने के कई तरीके हैं, हर उदाहरण के लिए हर समय समान मूल्यों की आवश्यकता होती है।

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

ताज़ा के बारे में एक ही समय में होने की जरूरत है, तो आप एक JVM "अपने समय अब ​​ताज़ा करने के लिए"

है उनमें से बाकी कह के लिए एक संदेश बाहर भेज सकते हैं हर JVM हमेशा एक ही जानकारी की जरूरत है , आपको एक सिंक करने की ज़रूरत है, जहां मास्टर कहता है "अब रीफ्रेश करें", सभी कैश किसी भी नए प्रश्न को अवरुद्ध करते हैं, ताज़ा करते हैं, और मास्टर को बताते हैं कि वे किए गए हैं। जब मास्टर को क्लस्टर के प्रत्येक सदस्य से जवाब मिल जाता है, तो यह आगे बढ़ने के लिए एक और संदेश भेजता है।

+0

प्रत्येक इंस्टेंस को कुछ डेटा चाहिए, अन्यथा उपयोगकर्ताओं को नए बदलाव नहीं दिखाई देंगे। क्या आप जेवीएम को सिंक में रखने पर थोड़ा और विस्तार कर सकते हैं। किस तरह का उप/अधिसूचना उपलब्ध है? धन्यवाद। – lud0h

+1

^प्रत्येक इंस्टेंस को कुछ डेटा चाहिए^-> प्रत्येक इंस्टेंस की आवश्यकता * एक ही * डेटा – lud0h

+0

1, क्या आप कृपया बता सकते हैं कि आप रीफ्रेश करने के लिए अन्य JVM को कैसे बता रहे हैं। क्या आप पब/उप दृष्टिकोण का उपयोग कर रहे हैं? 2, यदि किसी भी देरी के बिना अद्यतन डेटा की आवश्यकता है तो क्या होगा। यानी यदि JVM1 में एक थ्रेड डेटा अपडेट कर रहा है और अगले मिनट JVM2 को उस डेटा की आवश्यकता है। इस स्थिति को कैसे संभालें। –

0

मेमोरी कैश (जैसे memcache) में वितरित करने के लिए उत्पाद हैं जो इस स्थिति में मदद कर सकते हैं।

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

+0

हाँ चाल का हिस्सा "यह सब पहचानता है कि उन्हें रीफ्रेश होने की आवश्यकता है" ... जेएमएस को एक संदेश प्रदाता की आवश्यकता है, ऐसा लगता है कि आरएमआई एकमात्र विकल्प हो सकता है। कोई अन्य विचार? (जेग्रुप/टेराकोटा के अलावा) और इसी तरह ... यानी। बाहरी निर्भरताओं के बिना? – lud0h

8

आप DistributedMap का उपयोग कर सकते हैं जो WAS में बनाया गया है।

-रिक

+0

लिंक के लिए धन्यवाद। ऐसा लगता है कि यह जेएमएस से सेटअप और उपयोग करने के लिए बहुत आसान हो सकता है। – lud0h

+0

लिंक आजकल मृत लगता है ... –

1

मैं एक ऐसी ही स्थिति का सामना करना पड़ रहा हूँ, लेकिन मैं Oracle की वेबलॉजिक और जुटना उपयोग कर रहा हूँ।

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

जो मैंने अब तक पढ़ा है, this is the best solution to accomplish what I want। मुझे उम्मीद है कि यह आपकी समस्या के साथ भी आपकी मदद करेगा।

+0

ऊपर लिंक काम नहीं कर रहा है। क्या आप इस अवधारणा को साझा कर सकते हैं। –

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