2011-02-11 11 views
10

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

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

इसके बजाय हम इसका क्या उपयोग कर सकते हैं?

उत्तर

2

[पांच महीने बाद]

हमारा गेम ढांचा पूरा हो गया है।

अंत में, हम प्रत्येक वेब सर्वर में पूरी तरह से आरंभ SQLAlchemy मॉडल मामलों में स्थिर डाटा स्टोर करने का निर्णय लिया। जब एक नया बूट किया गया गेम सर्वर गर्म हो रहा है, तो इन उदाहरणों को पहले साझा किया गया MySQL डीबी मारकर बनाया गया है।

चूंकि हमारे मॉडल कारखानों को एक इंस्टेंस पूल में स्थगित कर दिया जाता है, इसलिए मॉडल उदाहरणों को प्रति सर्वर प्रति तैनाती के बाद ही बनाया जाना चाहिए - यह महत्वपूर्ण है, क्योंकि हमारे पैमाने पर, MySQL किसी भी प्रकार के चल रहे लोड के तहत रोएगा। हमने के हमारे लक्ष्य को पूरा किया, आइटम परिभाषाओं को हमारे ऐप कोड के करीब जितना संभव हो सके तार पर इस डेटा को स्ट्रीम करना: ऐप कोड में ही।

अब मुझे एहसास हुआ कि मेरा मूल प्रश्न बेवकूफ़ था, क्योंकि लैंप स्टैक के विपरीत, फ्लास्क सर्वर अनुरोधों के बीच चल रहा रहता है, सर्वर की स्मृति स्वयं "साझा स्मृति" है - एपीसी को ऐसा करने की आवश्यकता नहीं है । वास्तव में, अनुरोध प्रसंस्करण के बाहर कुछ भी इसे स्कॉप करता है और Flask's threadsafe local store, "साझा स्मृति" माना जा सकता है।

5

मुझे लगता है कि होता है कि यहां तक ​​कि इस मामले में आप प्रत्येक सर्वर पर स्वतंत्र लोगों की एक श्रृंखला के बजाय एक केंद्रीकृत कुंजी/मान दुकान प्रणाली होने पर विचार करना चाहते हो सकता है। जब तक आपका लोड बैलेंसर हमेशा एक ही सर्वर पर उसी सर्वर पर रीडायरेक्ट नहीं करता है, तो आप उस मामले में चला सकते हैं जहां उपयोगकर्ता के अनुरोध हर बार अलग-अलग सर्वर पर जाते हैं ताकि प्रत्येक नोड को साझा कैश से एक्सेस करने के बजाय गेम स्थिति पुनर्प्राप्त करनी पड़े।

इसके अलावा स्मृति तनाव है कि प्रत्येक प्रणाली पर एक स्थानीय कुंजी/मान दुकान लग सकते हैं अपने खेल सर्वर के अन्य कार्यों को धीमा कर सकता है। हालांकि यह काफी हद तक कैश किए जा रहे डेटा की मात्रा पर निर्भर करता है।

सामान्य में सबसे अच्छा तरीका कुछ मानक चलाने के लिए देखने के लिए प्रदर्शन की किस तरह आप एक memcached क्लस्टर और वस्तुओं आप स्थानीय भंडारण बनाम भंडारण कर रहे हैं के प्रकार के साथ मिल चाहते हैं होगा।

क्या अन्य सुविधाओं आप आप कुंजी/मान दुकान आप भी MongoDB (http://www.mongodb.org /) की तरह कुछ विकल्प में देखना चाहते हो सकता है से चाहते हैं पर निर्भर करता है।

+0

मैं अल्पकालिक कुंजी/मान के लिए मेरा सच्चा डेटा संग्रह के लिए केंद्रीकृत Membase, और केंद्रीकृत Memcache का उपयोग करें। जैसा कि मैंने अपनी पोस्ट में उल्लेख किया है, बिंदु "हमारे मुख्य मेमकैड क्लस्टर से तारों के काफी बड़े मॉडल ऑब्जेक्ट्स स्ट्रीमिंग से बचने के लिए है"। पिछले गेम में स्थानीय बदलाव में इस बदलाव को मुझे एक बड़ा प्रदर्शन बढ़ावा दिया। इस तरह के गेम के लिए संपूर्ण स्थिर डेटा सेट 50 एमबी से कम है, इसलिए स्टोरेज/लोड कोई मुद्दा नहीं है।आखिरकार, आपको इसे फिर भी स्थानीय स्मृति में खींचना होगा; सभी बेहतर अगर इसे वहां से संग्रहीत करने के लिए संग्रहीत किया जाता है :) –

+0

मूल आधार यह है कि केंद्रीकृत होना चाहिए डेटा को केंद्रीकृत किया जाना चाहिए, और डेटा को ऐप सर्वर पर धक्का दिया जा सकता है (यानी स्टेटिक/गेम वर्ल्ड डेटा जो स्टेटलेस और नोड्स में समान है) ऐप सर्वर पर धक्का दिया जाना चाहिए। –

+0

क्षमा करें, मैं इस जवाब को स्वीकार नहीं कर सकता क्योंकि यह मेरी खोज से दो महत्वपूर्ण बिंदुओं को अनदेखा करता है: [1] मैं केवल स्थिर डेटा के बारे में बात कर रहा हूं, और [2] मैं पहले से ही केंद्रीकृत मेमकैड का उपयोग करता हूं। –