वितरित C ​​++ गेम सर्वर जो डेटाबेस का उपयोग करता है


11

मेरा C ++ टर्न-आधारित गेम सर्वर (जो डेटाबेस का उपयोग करता है) ग्राहकों (खिलाड़ियों) की वर्तमान औसत राशि के खिलाफ नहीं खड़ा होता है, इसलिए मैं इसे कई (अधिक तब एक) राशि के कंप्यूटर और डेटाबेस में विस्तारित करना चाहता हूं जहां सभी क्लाइंट अभी भी बने रहेंगे सिंगल गेम वर्ल्ड (सर्वर को एक दूसरे के साथ संवाद करना होगा और कई डेटाबेस का उपयोग करना होगा)।

क्या कुछ ट्यूटोरियल / किताबें / सामान्य मानक हैं जो बताते हैं कि इसे सबसे अच्छे तरीके से कैसे किया जाए?

जवाबों:


8

"एकल गेम की दुनिया में बने रहें" के लिए MMO शब्दावली एकल शार्क हैईवीई ऑनलाइन एक ही शार्क में हर खिलाड़ी को भरमाने का प्रयास करने वाला एकमात्र प्रमुख MMO है।

आपके लिए भाग्यशाली हैं कि उन्होंने एक बहुत ही जानकारीपूर्ण लेख प्रकाशित किया कि वे इसे कैसे करते हैं।


(स्रोत: gamasutra.com )

बुरी ख़बरें। आप आम तौर पर ईवीई ऑनलाइन तकनीकों को लागू नहीं कर सकते। उनके समाधान उनके विशेष शैली और कार्यान्वयन के अनुरूप हैं।
नोट : EVE ऑनलाइन के सभी सुपर फैंसी सिंगल शार्क नेटवर्क के लिए वे एक डेटाबेस का उपयोग करते हैं । वे वितरित डेटाबेस के लिए एक स्केलेबल, सुसंगत, मध्यम वास्तविक समय समाधान डिजाइन करने में असमर्थ थे।

किसी भी तरह से पढ़ना कि उन्होंने यह कैसे किया है कि आपको अपने समाधान का डिजाइन तैयार करने में मदद मिले। हालांकि, आप एक बहुत ही कठिन समस्या को हल करने का प्रयास कर रहे हैं ।

अपने गेम सर्वर को वितरित करने के बजाय, मैं पहले आपके अन्य मार्गों का पता लगाने का सुझाव दूंगा।

  • प्रोफ़ाइल अपने खेल सर्वर।
    • यदि समस्या है तो CPU बोझ को कम रखने के लिए अपना सर्वर कोड ऑप्टिमाइज़ करें।
    • नेटवर्क चैटर पर कटौती करने के लिए क्लाइंट और सर्वर के बीच संचार प्रोटोकॉल का अनुकूलन करें।
  • डेटाबेस संचार के लिए गेमर सर्वर का अनुकूलन करें।
    • फिर एक क्वेरी ऑप्टिमाइज़र चलाएं और उचित रूप से परिवर्तन करें।
    • एक न्यूनतम करने के लिए DB बातचीत में कटौती
  • DB को एक अलग मशीन में ले जाएँ।
    यह अक्सर एक टन में मदद करता है। यदि संभव हो तो DB को उसी स्थानीय नेटवर्क पर रखें, लेकिन जब आपके सर्वर को केवल हार्डवेयर पर चलाने की बात हो, तो आपके गेम सर्वर की मदद करने के लिए इसे और अधिक दुखी होना चाहिए।

आप "प्रमुख" को कैसे परिभाषित कर रहे हैं? लोथिंग का साम्राज्य एक एकल शार्क का उपयोग करता है। हर कोई एक ही Farmville शार्क साझा करता है। स्टार ट्रेक ऑनलाइन और चैंपियंस ऑनलाइन दोनों एक-शार्क मॉडल का उपयोग करते हैं, लेकिन इंस्टेंट जोन।

SQL डेटाबेस का उपयोग करने के बजाय, आप एक noSQL समाधान का भी उपयोग कर सकते हैं जो कि MongoDB की तरह क्लस्टरिंग और शार्डिंग के लिए डिज़ाइन किया गया था।
फिलिप

1
@JoeWreschnig webgames रियल टाइम गेम नहीं हैं, बहुत आसान ... मुझे यकीन नहीं है कि स्टार ट्रेक ऑनलाइन और चैंपियंस ऑनलाइन कितने खिलाड़ी हैं ...
o0 '।

4

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

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


1
यह सब तब तक ठीक लगता है जब तक आप विचार करते हैं कि वह कई सर्वरों को एक डेटा सेट तक पहुंचने की उम्मीद कर रहा है - इसका मतलब है कि आगे के समन्वय के बिना, एप्लिकेशन-साइड कैश सिंक से बाहर निकल जाएगा, जो गेम की त्रुटियों के लिए सबसे अच्छा है और सबसे खराब डेटा हानि। मैंने आपके द्वारा कही गई किसी भी बात से असहमत नहीं है, लेकिन मूल पोस्टर को आगे बढ़ने से पहले क्रॉस-सर्वर संगतता मुद्दे पर भी विचार करने की आवश्यकता होगी।
काइलोटन

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

यह स्पष्ट नहीं करता है कि आपने क्रॉस-सर्वर संगतता समस्याओं को कैसे हल किया है। कुछ बिंदु पर सर्वरों को एक दूसरे के बीच डेटा को सिंक्रनाइज़ करने की आवश्यकता होती है, या आपके पास दौड़ की स्थिति होती है, जो यादृच्छिक डिस्कनेक्ट, डुप्लिकेट प्लेयर,

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

3

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

डेटाबेस के बारे में: SQL डेटाबेस आमतौर पर बुरी तरह से पैमाने पर होता है। वे वितरित किए जाने के लिए डिज़ाइन नहीं किए गए हैं। लेकिन वर्तमान में NoSQL डेटाबेस जैसे MongoDB या Cassandra का एक नया चलन है जिसे कई सर्वरों पर वितरित करने के लिए डिज़ाइन किया गया था। वे केवल अधिक सर्वर जोड़कर क्षमता को जोड़ना अधिक आसान बनाते हैं। तो सभी बड़े खेल उनके पास क्यों नहीं जाते? चूंकि:

  1. SQL डेटाबेस में 40 से अधिक वर्षों के लिए मौजूद हैं, उन NoSQL डेटाबेस केवल कुछ वर्षों के लिए। अभी तक पता नहीं है कि उन्हें सबसे अधिक कुशलता से कैसे उपयोग किया जाए और उनका विकास तेजी से आगे बढ़ रहा है। बाजार पर बहुत सारे प्रतिस्पर्धी और पूरी तरह से असंगत उत्पाद हैं, और इसमें कोई संकेत नहीं है कि उनमें से कौन जीवित रहेगा और जो कुछ वर्षों में अप्रचलित और बंद हो जाएगा। अधिकांश बड़े खिलाड़ी NoSQL डेटाबेस के अज्ञात जोखिमों पर SQL की ज्ञात कमियों को पसंद करते हैं।
  2. वे SQL डेटाबेस से बहुत अलग तरीके से काम करते हैं और आपकी पूरी दृढ़ता की रणनीति पर पुनर्विचार करने की आवश्यकता होती है। यह आपके पूरे सॉफ्टवेयर आर्किटेक्चर में भारी बदलाव ला सकता है।

इसलिए जब आपकी परियोजना पहले से ही बहुत आगे बढ़ रही है, तो दूसरे डेटाबेस समाधान पर स्विच करना एक बड़ा जोखिम और समय और ऊर्जा का एक बहुत बड़ा निवेश हो सकता है।


0

यह एक अविश्वसनीय रूप से कठिन क्षेत्र है जो अभी तक हल नहीं हुआ है।


वहाँ कुछ "टेम्पलेट" हो सकता है ("सी ++ डिजाइन पैटर्न के रूप में) इसका समाधान नहीं है? बहुत सारे MMORPG हैं।
स्लैव

2
अधिकांश MMO डेटाबेस के लिए पूर्ण आपदाओं द्वारा समर्थित हैं।

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

0

मुझे पता है कि यह पुराना है लेकिन ...।

इस पर ध्यान केंद्रित करने के लिए वास्तव में दो क्षेत्र हैं।

आपको कई सर्वरों पर अपना एप्लिकेशन वितरित करना होगा। आपको अपने डेटाबेस को कई सर्वरों में वितरित करना होगा।

और आपको दोनों के लिए अतिरेक होना चाहिए।

इसके लिए कुछ ओपन सोर्स सॉल्यूशंस हैं। Farmville एक अच्छा उदाहरण है MemSQL / Couchbase का उपयोग करना।


1
कई सर्वरों पर डेटाबेस वितरित करना निश्चित रूप से एक हल की गई समस्या है। दुर्भाग्य से, यह आम तौर पर ऑनलाइन गेम के लिए एक महत्वपूर्ण आवश्यकता नहीं है जो उनके डीबी एक्सेस को न्यूनतम रखता है। इसके विपरीत, वास्तविक गेमप्ले को कई सर्वरों पर वितरित करना अभी भी एक हल की हुई समस्या नहीं है।
काइलोटन ३०'१३
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.