2009-03-09 21 views
10

मैं एक मल्टीप्लेयर गेम पर काम कर रहा हूं और इसे एक संदेश कतार की आवश्यकता है (यानी, संदेश, संदेश, कोई डुप्लीकेट या हटाए गए संदेशों को मानते हुए कि कोई अप्रत्याशित कैश बेदखल नहीं है)।Memcache- आधारित संदेश कतार?

मैं अवधारणा सीखा this blog post से मेमकेचे कतार का:

सभी संदेश एक पूर्णांक के साथ कुंजी के रूप में सहेजे गए हैं। एक कुंजी है जिसमें अगली कुंजी है और जिसकी कतार में सबसे पुराना संदेश है। इन तक पहुंचने के लिए वृद्धि/कमी विधि का उपयोग इसके परमाणु के रूप में किया जाता है, इसलिए दो कुंजी हैं जो ताले के रूप में कार्य करती हैं। वे बढ़ते हैं, और यदि वापसी मूल्य 1 है तो प्रक्रिया में ताला है, अन्यथा यह बढ़ती रहती है। एक बार प्रक्रिया समाप्त होने के बाद यह मान वापस 0 पर सेट करता है। सरल लेकिन प्रभावी। एक चेतावनी यह है कि पूर्णांक अतिप्रवाह होगा, इसलिए वहां कुछ तर्क है जो उस सीमा के करीब होने के बाद प्रयुक्त कुंजी को 1 पर सेट करता है। चूंकि वृद्धि कार्य परमाणु है, लॉक केवल तभी जरूरी है जब दो या दो से अधिक memcaches का उपयोग किया जाता है (अनावश्यकता के लिए), उन्हें सिंक में रखने के लिए।

मेरा प्रश्न है, क्या एक memcache- आधारित संदेश कतार सेवा है जो ऐप इंजन पर चल सकती है?

उत्तर

9

मैं इस तरह से Google App Engine Memcache का उपयोग करके बहुत सावधान रहूंगा। आप "अप्रत्याशित कैश evictions" के बारे में चिंता करने का अधिकार हैं।

गूगल आपको डेटा और यह नहीं भंडारणकैशिंग के लिए मेम्कैश उपयोग करने के लिए उम्मीद है। वे कैश में डेटा रखने की गारंटी नहीं देते हैं। GAE Documentation से:

डिफ़ॉल्ट रूप से, आइटम समय सीमा समाप्त नहीं है, हालांकि आइटम स्मृति दबाव की वजह से बेदखल किया जा सकता है।

संपादित करें: वहाँ हमेशा Amazon's Simple Queueing Service है। हालांकि, यह मूल्य/प्रदर्शन स्तर को पूरा नहीं कर सकता है:

  1. Google से अमेज़ॅन सर्वर पर कॉल करने की विलम्ब होगी।
  2. आप सभी डेटा यातायात के लिए दो बार भुगतान करना समाप्त कर देंगे - इसके लिए Google को छोड़ने के लिए भुगतान करना और फिर अमेज़ॅन में जाने के लिए इसके लिए भुगतान करना।
+0

मुझे उम्मीद है कि कैश में वस्तुओं की समाप्ति निष्क्रियता पर आधारित होगी, इसलिए यदि कतार जीवनकाल आप कहते हैं तो आप शायद ठीक होंगे। यद्यपि उस कथन में बहुत सारे क्वालीफायर हैं, इसलिए आपको निश्चित रूप से कतार में खोए गए सामानों को संभालने की आवश्यकता होगी। –

+0

मुझे GAE के साथ एक संदेश कतार का उपयोग करने की भी आवश्यकता है, लेकिन मुझे GAE के साथ उपर्युक्त memcache आधारित कतार सेवाओं (MemcacheQ, स्पैरो इत्यादि) को कनेक्ट करने के बारे में कोई जानकारी नहीं है, क्योंकि GAE केवल जावा और पायथन का समर्थन करता है, इसलिए मैं चाहता हूं इस पर किसी भी विचार को जानना पसंद है। अमेज़ॅन एसक्यूएस के अलावा अन्य संदेश कतार सेवाओं का उपयोग हम GAE के साथ कर सकते हैं? –

0

जब तक Google उचित नौकरी-कतार लागू नहीं करता है, तो डेटा स्टोर का उपयोग क्यों न करें? जैसा कि अन्य ने कहा है, memcache सिर्फ एक कैश है और कतार आइटम खो सकता है (जो .. बुरा होगा)

डेटा स्टोर आपको जो चाहिए उसे तेज़ से अधिक होना चाहिए - आपके पास बस एक साधारण नौकरी मॉडल होगा , जो कि memcache से अधिक लचीला होगा क्योंकि आप कुंजी/मूल्य जोड़े तक सीमित नहीं हैं

+0

खासकर हाल की प्रदर्शन समस्याओं के साथ, यह लागत प्रभावी नहीं होने वाला है। भारी उपयोग के तहत मैं इस कतार के माध्यम से प्रति दिन 1 मिलियन संदेश डालने की उम्मीद कर रहा हूं। डाटास्टोर की तुलना में अमेज़ॅन कतार सेवा का उपयोग करना सस्ता होगा। – gravitation

+0

आह, काफी मेला! – dbr

1

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

विफल होने के कारण, अमेज़ॅन का एसक्यूएस व्यवहार्य विकल्प की तरह लगता है।

4

मैं एक साधारण अजगर Memcached कतार शुरू कर दिया है, यह उपयोगी हो सकता है: http://bitbucket.org/epoz/python-memcache-queue/

+0

मुझे लगता है कि इस तकनीक को पहले देखना याद है, लेकिन इस तरह पैकेजिंग के लिए +1। – Joel

+0

मैं यहां कुछ ऐसा करने की कोशिश कर रहा हूं: https://github.com/nmmmnu/SimpleMessageQueue हालांकि, लॉक किए बिना, संदेश खोने के लिए थोड़ा संभव है। दूसरी ओर से , यदि लॉक कभी समाप्त नहीं होता है, तो पूरा ऑपरेशन फंस सकता है। यदि आप लॉक समाप्ति करते हैं, तो यदि आप लॉक जारी कर रहे हैं तो एक गड़बड़ हो सकती है। – Nick

1

क्यों नहीं टास्क पंक्ति का उपयोग करें:
https://developers.google.com/appengine/docs/python/taskqueue/
https://developers.google.com/appengine/docs/java/taskqueue/

यह संभावना हानि के बिना इस मुद्दे को हल करने के लिए लगता है Memcached- आधारित कतार में संदेशों का।

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