2010-06-20 17 views
6

मेरे पास जावा वेब ऐप है जो किसी तृतीय-पक्ष वेब सेवा का बैक-एंड उपयोग करता है। वेब सेवा को कॉल करना विलंबता बनाता है, जो भी संभव हो से बचने के लिए महत्वपूर्ण है। साथ ही, मेरे ऐप को केवल प्रति दिन एक निश्चित संख्या में वेब सेवा कॉल करने की अनुमति है, इसलिए जब तक पूरी तरह से आवश्यकता न हो तो वेब सेवा कॉल न करना सबसे अच्छा है।memcached-like key/value cache जो RAM और disk दोनों का उपयोग करता है

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

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

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

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

तो मैं देख रहा हूँ या तो: 1) एक डिस्क-आधारित मुख्य मान भंडारण प्रणाली है कि "विफलता" जब Memcached एक कैश याद आती है या 2) एक एकल प्रणाली है कि Memcached और जगह लेंगे है के रूप में कार्य कर सकते हैं रैम कैश और डिस्क कैश दोनों प्रदान करें।

अन्य महत्वपूर्ण गुण जो मैं चाहता हूं: 1) मेमकैच की तरह, मुझे एक कैशिंग सिस्टम चाहिए जिसके लिए कोई बच्चों की देखभाल की आवश्यकता नहीं है। 2) Memcached की तरह, मैं चाहता हूं कि कैश कई सर्वरों पर शेड करे, प्रत्येक ऑब्जेक्ट बिल्कुल एक सर्वर पर रह रहा है। 3) Memcached की तरह, मुझे कुछ ऐसा करना चाहिए जो प्लग इन करने और उपयोग करने में काफी आसान हो। मैं यह काम करने के लिए कोड का एक टन लिखना नहीं चाहता।

अन्य सिस्टम जिन्हें मैंने पहले ही देखा है: 1) मेरा मानना ​​है कि रेडिस बिल को फिट नहीं करता है, क्योंकि इसकी डिस्क कैश रैम में क्या है इसका एक दर्पण है। मैं चाहता हूं कि रैम कैश डिस्क कैश का एक छोटा सबसेट हो। 2) EhCache में "लगातार डिस्क स्टोर है जो वीएम पुनरारंभ के बीच डेटा संग्रहीत करता है", लेकिन यह ऊपर वर्णित जैसा ही नहीं है।

अपाचे जेसीएस (जावा कैशिंग सिस्टम) ऐसा लगता है कि यह एक अच्छा फिट हो सकता है, इसलिए मुझे इसका इस्तेमाल करने वाले लोगों के बारे में राय सुनना अच्छा लगेगा।

उत्तर

5

मैंने रैम/डिस्क आधारित कैशिंग के लिए ehcache का उपयोग किया और यह ठीक काम किया। सटीक कॉन्फ़िगरेशन यह निर्धारित करने के लिए कि स्मृति में कितनी ऑब्जेक्ट रखना है और डिस्क पर कितने रखने के लिए कोड के बाहर कोड कोड के बिना किया जा सकता है। कहने के लिए बहुत कुछ नहीं है, यह एक कैश है और यह ठीक काम करता है।

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

+1

धन्यवाद। यह वह समाधान हो सकता है जिसे मैं ढूंढ रहा हूं। अब मैं देखता हूं कि आप डिस्कस्टोर को कॉन्फ़िगर कर सकते हैं और maxElementsOnDisk पैरामीटर निर्दिष्ट कर सकते हैं। –

0

MemcacheDB वह उत्तर हो सकता है जिसे आप ढूंढ रहे हैं। Reddit इसे अपने "permacache" के लिए उपयोग करता है।

+0

रेडडिट वास्तव में कैसंड्रा के लिए memcachedb गिरा दिया: http://blog.reddit.com/2010/03/she-who-entangles-men.html –

0

Cassandra की जरूरत है। वहाँ दर्जन से अधिक NoSQL समाधान हैं जो स्मृति और डिस्क दोनों को स्टोर करते हैं। कुछ अगर उनमें से कोई भी कैसंद्रा के रूप में युद्ध-परीक्षण के रूप में हैं। कुछ नामों के लिए, उत्पादन में फेसबुक, रेडडिट, और digg द्वारा प्रयुक्त।

0

रेडिस का उपयोग करें, यह सभी memcache संचालन का समर्थन करता है और डेटा को डिस्क में सहेज लेगा और बहुत तेज है। कैसंद्रा में पढ़ना धीमा है इसलिए मैं इसके लिए नहीं जाऊंगा।

-1

व्यंग्य एक विकल्प हो सकता है? यह रैम और डिस्क में वेब परिणाम cahces