वास्तविक समय के खेल के लिए सबसे अच्छा सर्वर आर्किटेक्चर क्या है?


10

मैं एक रियल-टाइम गेम विकसित कर रहा हूं, जिसमें हजारों खिलाड़ियों को रियल-टाइम (जैसे अधिकतम 1s अंतराल) में पकड़ना चाहिए। इसके लिए सबसे अच्छा बुनियादी ढांचा क्या होगा?

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

डेटाबेस क्लस्टर डेटाबेस के बीच संगतता के लिए डेटाबेस प्रतिकृति का उपयोग करेगा।

एक भौगोलिक लोड बैलेंसर भी होना चाहिए - इसलिए यह प्रत्येक उपयोगकर्ता को सर्वश्रेष्ठ प्रतिक्रिया के लिए क्षेत्रीय लोड बैलेंसर प्रदान करेगा।

मैं खेल के लिए .NET + MSSQL का उपयोग कर रहा हूं।

धन्यवाद!


2
जब आप कहते हैं कि "अवसंरचना" का अर्थ है सॉफ्टवेयर, हार्डवेयर, सेवाएं, या क्या आप चाहते हैं कि हम आपकी मौजूदा योजना की आलोचना करें?
तेतराद

1
@ नैट - हम स्केल करने की योजना बना रहे हैं, डुप्लिकेट नहीं - इसलिए यह पूरी तरह से स्केलेबल होना चाहिए।
रोमन

2
-1 क्योंकि teddziuba.com/2008/04/im-going-to-scale-my-foot-up-y.html - आप किसी भी क्षमता की आवश्यकताओं को कवर नहीं करते हैं, आप कहते हैं कि खेल को तेज नहीं किया गया है, लेकिन क्या यह ज़ोन्ड है , आदि प्रदर्शन अनुकूलन की प्रकृति - स्केलेबिलिटी सहित - विशिष्ट जानकारी की आवश्यकता है, और कोई पूर्ण सर्वश्रेष्ठ वास्तुकला नहीं है।

1
मैं आपके सवाल को कुछ और ठोस करने के लिए कहूंगा। तथ्यात्मक, गैर-विषयक तरीके से 'सर्वश्रेष्ठ' क्या है? क्या आपको सबसे आसान मतलब स्केल करना है, मैनेज करना आसान है, सबसे आसान है, सबसे तेज़ चलना है या क्या?
कम्युनिस्ट बतख

1
"सबसे सरल" व्यक्तिपरक भी है। सबसे अधिक किसके लिए, किस समय सीमा पर, क्या संसाधन दिए गए? स्टैक एक्सचेंज विशिष्ट सवालों के साथ सबसे अच्छा काम करते हैं - "मैंने इस सर्वर को LINQ और MSSQL का उपयोग करके बनाया है, लेकिन यह 70 लेनदेन / सेकंड के बाद गिर गया, यहाँ मेरे शीर्ष दो लेन-देन 73% रनटाइम के लिए हैं, मुझे अपने थ्रूपुट को कैसे बढ़ाना चाहिए? "

जवाबों:


6

अपनी आवश्यकताओं के बारे में बहुत अधिक जानने के बिना कोई सबसे अच्छा आर्किटेक्चर नहीं है, जैसे। वर्णों के बीच अंतःक्रियाओं की तरह, कितना डेटा लगातार हो रहा है, और इसी तरह।

यदि आप विलंबता के 1 सेकंड के साथ सामना कर सकते हैं, तो आप संभवतः समस्याओं के बिना एक सर्वर पर 1000 खिलाड़ियों की मेजबानी कर सकते हैं - लेकिन यह वास्तव में एक एफपीएस के विचार के साथ संघर्ष करता है क्योंकि उन्हें आमतौर पर बहुत कम विलंबता की आवश्यकता होती है, जैसे। 100ms से कम है। लेकिन एक प्रणाली जो उच्च विलंबता से निपट सकती है वह संदेश पासिंग के माध्यम से सब कुछ कर सकती है जो स्थिरता को बहुत तुच्छ बनाती है। अपने तर्क प्रदान करना काफी सरल है, अर्थात् - जटिल तर्क तब और भी बदतर हो जाता है जब आप इसे एक लॉक-ऑब्जेक्ट सिस्टम के बजाय एक संदेश-आधारित प्रणाली में बदल देते हैं - लेकिन यह सब आपके आवेदन की आवश्यकताओं पर निर्भर करता है।

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

वास्तव में, RDBMS को अपनाने से सावधान रहें क्योंकि यह बड़े सिस्टम में किया गया कार्य है। हालाँकि मैं व्यक्तिगत रूप से उन्हें ऑनलाइन गेम में उपयोग करने की स्वीकृति देता हूं, लेकिन अपनी आवश्यकताओं को देखने और अपनी पसंदीदा रणनीति का पता लगाने के बजाय, अपने पसंदीदा डेटाबेस को लेने और फिर इसे अपने दिमाग में फिट करने के लिए इसे कैश और प्रतिकृति के साथ ट्विक करने की कोशिश करना सबसे अच्छा है। एप्लिकेशन। आप पा सकते हैं कि आपके लिए सभी आवश्यक ऑफ़लाइन रिपोर्टिंग क्षमता है, इस मामले में यह संभव है कि एक पृष्ठभूमि प्रक्रिया आपके खेल दृढ़ता तंत्र से लॉगिंग एक दूरस्थ RDBMS में कहीं और हो।


4

डिस्क्लेमर: मेरा गेम प्रोग्रामिंग अनुभव क्लाइंट-साइड सिंगल प्लेयर गेम्स के आसपास है, लेकिन मेरे पास वेब एप्लिकेशन (विशेष रूप से Microsoft स्टैक) पर एक पृष्ठभूमि है, इसलिए मैं इस उत्तर के साथ आ रहा हूं, मुझे लगता है कि मैं बहुत कुछ कर सकता हूं लागू करें, लेकिन वास्तविक परीक्षण के बिना एक वास्तविक गेम सर्वर को यह कहना मुश्किल है कि यह कैसे लागू होगा, लेकिन यहां जाता है। यह जानिए: मैंने एक गेम सर्वर की तैनाती नहीं की है, केवल वेबएप्स।

मैं एक दो (सर्वर) स्तरीय दृष्टिकोण का सुझाव दूंगा। एक डेटाबेस टियर और एक "एप्लिकेशन" टियर; तीसरे (प्रस्तुति) के साथ टियर आपका गेम क्लाइंट है।

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

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

आप अनुप्रयोग टियर -> डेटाबेस टियर से डेटा भेजने के लिए एक क्रमांकन प्रक्रिया का निर्माण करना चाहेंगे। कुंजी के लिए कई स्तर के क्रमांकन चल रहे हैं। कुछ इस तरह :

  • स्तर 1: DB के लिए हर एक्स सेकंड में सहेजें, महत्वपूर्ण डेटा शामिल हैं:
    • खिलाड़ी स्वास्थ्य
    • प्लेयर आइटम / पिकअप
  • स्तर 2: DB को हर 2X सेकंड में सहेजें, मध्यम डेटा शामिल हैं:
    • खिलाड़ी स्थानों
    • एनपीसी स्थान
  • स्तर 3: बाकी सब कुछ, जितना संभव हो उतना बार

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

डेटा पढ़ने के लिए, आप एप्लिकेशन टियर में जितना संभव हो उतना मेमोरी में लोड करना चाहेंगे, फिर यह सुनिश्चित करें कि आपका सभी कोड इस मेमोरी पूल का उपयोग करता है, पृष्ठभूमि में आप डेटाबेस के साथ मेमोरी पूल को सिंक्रनाइज़ कर सकते हैं। जैसा कि जो बताते हैं, ऐसे समय होंगे जब आपको "वास्तविक समय" लेनदेन की आवश्यकता होगी। अपने अधिकांश लेखन को क्रमबद्ध करके, आपके पास डेटाबेस सर्वर / क्लस्टर पर पर्याप्त हार्डवेयर की आवश्यकता होने पर, वास्तविक समय में लेनदेन करने के लिए आपके डेटाबेस पर पर्याप्त IO होना चाहिए।


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

जबकि विरल, वही है जो मैं पिछले पैराग्राफ की ओर जा रहा था। मैं हाइब्रिड के एक बिट की सिफारिश कर रहा हूं, जहां आप जहां संभव हो वहां आईएन-मेमोरी का उपयोग करते हैं, और आवश्यक होने पर डेटाबेस।
नट

समस्या यह है कि आपने स्मृति में क्या है, जो कि एक अन्य डेटाबेस है, और आपने इसे लागू करने के बारे में कोई निर्देश नहीं दिया है, जो कि वास्तविक मुश्किल बिट है।

यह सच है, हालांकि सवाल बड़ी तस्वीर वास्तुकला के बारे में था, कार्यान्वयन विवरण नहीं।
नैट

सच है, लेकिन आपने पूरे मध्य स्तर को छोड़ दिया है। यह एक कम विलंबता RDB है? एक ODB? कुंजी / मूल्य की दुकान? नहीं DB और ACID पर छोड़ देना? एसटीएम या ताला? निष्पक्ष होने के लिए, इसका उत्तर देना बहुत कठिन है क्योंकि प्रश्न में बहुत अधिक जानकारी नहीं है, लेकिन आर्किटेक्चर आरेख के लिए यह सब उत्तर बीच में बड़े बुलबुले को ""? इसमें और दो और सेवाओं को जोड़ने के लिए, वास्तव में क्या नहीं भरें "?" है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.