वहाँ एक गतिशील दुनिया बनाने के लिए एक रास्ता है जैसे कि एक क्षैतिज क्षैतिज रूप से स्केलेबल?


11

20 अपडेट / प्लेयर / सेकंड जितनी तेजी से डेटा बदलने के साथ 500+ खिलाड़ियों की खुली दुनिया की कल्पना करें। पिछली बार मैंने इसी तरह के एक MMORPG में काम किया था, इसमें एसक्यूएल का उपयोग किया गया था, इसलिए हर समय यह डीबी को क्वेरी नहीं कर सकता था। इसके बजाय, इसने DB से सभी खिलाड़ियों को C ++ ऑब्जेक्ट के रूप में मेमोरी में लोड किया और उनका उपयोग किया। अर्थात्, यह लंबवत रूप से बढ़ा हुआ है। क्या इसके बजाय उस सर्वर को क्षैतिज रूप से मापनीय बनाना संभव होगा? क्या कोई डेटाबेस समवर्ती अद्यतन की मात्रा का समर्थन करने के लिए डिज़ाइन किया गया है?


आप डेटाबेस में खिलाड़ी को 20 बार / सेकंड में अपडेट क्यों करना चाहते हैं?
बालोन

@Balon है कि मैं कहाँ उलझन में हूँ। अगर मैं इसे डेटाबेस में, केवल मेमोरी में अपडेट नहीं करता, तो मेरे पास अलग-अलग मशीनों के बीच अलग-अलग राज्य होंगे। लेकिन मुझे लगता है कि DB अपडेट्स में कुछ भारी-भरकम ओवरहेड हैं इसलिए यह वास्तव में अपडेट की गई राशि के लिए काम करने वाला नहीं है?
माईविक्टर

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

@PatrickHughes मुझे नहीं पता कि मुझे क्या चाहिए, मैं समझा रहा हूं कि खेल कैसे काम करता है। वर्ण 2 ~ 3 टाइलें / दूसरी चाल। शिकार करने वाला खिलाड़ी कुछ राक्षसों से घिरा हो सकता है, इसलिए कम से कम 10 टाइलें / खिलाड़ी / सेकंड। फिर खिलाड़ी के बैकपैक पर फर्श पर सड़ने वाले आइटम हैं। खिलाड़ी की दिशा में चलते हुए हमले होते हैं, राक्षस की दिशा में चलते हुए हमले होते हैं। स्वास्थ्य क्षय है, मैना का उपयोग किया जा रहा है, खिलाड़ी को जहर की क्षति को लागू करने वाले टाइमर। इसलिए, चीजें वास्तव में तेजी से बदलती हैं। यह गेम डिजाइन है। इस तरह के डिजाइन को लंबवत रूप से कैसे बढ़ाया जा सकता है?
MaiaVictor

1
मैंने इसे कुछ समय पहले HackerNews पर देखा था: paralleluniverse.co वे एक डेटाबेस पर काम कर रहे हैं जो आपके लिए सभी स्थानिक विभाजन / वितरण सामान करता है। मुझे लगता है कि हुड के तहत, वे नीचे के जवाब में सभी चीजें कर रहे हैं।
tugs

जवाबों:


17

500 खिलाडिय़ों के टेस्ट केस, जो कि 20Hz पर उड़ान भरने वाली सूचना की 250K धारा है। इसके लिए आंतरिक बैंडविड्थ, प्रत्येक संदेश को 100 बाइट्स मानकर, 500MB / सेकंड के लिए होगा। महत्वाकांक्षी लगता है। विशेष रूप से प्रक्रियाओं के बीच।

यदि आप खिलाड़ियों को 100 के समूहों में अलग करते हैं, तो यह 20MB / सेकंड तक कम होता है, और इसी तरह। यही कारण है कि MMOs में ज़ोन होते हैं, और उन ज़ोन में प्रभाव के छोटे बुलबुले होते हैं, और इसलिए नीचे की ओर जब तक बैंडविड्थ उचित नहीं हो जाता।

मूल समस्या यह बताई जा सकती है कि यदि आपके पास 10 लोग हैं, जो सभी रीयलटाइम जानकारी साझा कर रहे हैं, लेकिन आप 500 सभी साझा करना चाहते हैं , तो यह संचार लिंक की एक घातीय वृद्धि है और हम इसे कैसे प्राप्त कर सकते हैं । मुझे डर है कि कोई जादू की गोली नहीं है जो मैंने कभी सुना है कि जादुई रूप से ज्यामितीय प्रगति को दूर कर सकता है।

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

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

दूरी के आधार पर 20Hz से अपडेट पैटर्न को भी बदलें, 1 मील दूर किसी को यह जानने की जरूरत नहीं है कि आप 1 फीट बिल्कुल 230.6 सेकंड पर चले गए, फिर दूसरा पैर 231.4 सेकंड में, वे आपके साथ हर 10 फीट 15 फीट आगे बढ़ने से निपट सकते हैं सेकंड।


बहुत बढ़िया और जानकारीपूर्ण उत्तर, धन्यवाद। लेकिन मैं यह जोड़ सकता हूं कि जब दुनिया बहुत तेज गति से बदलती है, तो एक खिलाड़ी दूसरे खिलाड़ियों को उसके बगल में तुरंत देख सकता है। मैं इसे जियोमेट्रिक के रूप में नहीं देखता - 500 खिलाड़ी सर्वर को जानकारी भेजते हैं; सर्वर समय-समय पर उन 500 खिलाड़ियों को जानकारी भेजता है। यह रैखिक है, जैसा कि मैं देख रहा हूं। लेकिन मुख्य बिंदु 4 वें पैराग्राफ पर है: यदि मैं केवल भंडारण के लिए डेटाबेस का उपयोग करता हूं, तो मैं मेमोरी में डेटा लोड कर रहा हूं। यदि मैं किसी मशीन में मेमोरी के लिए डेटा लोड कर रहा हूं, तो मैं दुनिया का एक डीसिन्क्रोनाइज्ड संस्करण बना रहा हूं। यही मुझे नहीं मिलता।
MaiaVictor

1 ग्राहक के लिए: 1 संदेश आउट + 1 संदेश = 2 के लिए। 2 ग्राहकों के लिए: 2 संदेश बाहर, 2 संदेश = 4. में 3 ग्राहकों के लिए: 3 संदेश बाहर, 3 संदेश = 9. में और इसलिए यह जाता है। यह इस तरह है: एक स्थिति संदेश भेजें, सर्वर मुझे और अन्य 2 क्लाइंट (1 इन, 3 आउट) और 3 क्लाइंट सभी ऐसा कर रहा है (1 में 9 आउट)। जबकि यह 3 के सिर्फ एक ग्राहक के लिए रैखिक दिखता है, आपको सिस्टम के कुल थ्रूपुट के लिए सभी ग्राहकों द्वारा गुणा करना होगा। Desync के लिए, समान भौतिक बॉक्स पर भी प्रक्रियाएँ सिंक से बाहर हैं जब तक कि स्थिति संदेश नहीं बनाया और भेजा जाता है, यह सिर्फ एक मामला है जहां पाइप खाली हो जाता है, स्थानीय रैम या नेट।
पैट्रिक ह्यूजेस

5

ब्याज फ़िल्टरिंग के क्षेत्र का उपयोग करें। यदि एक दुनिया 3 सर्वरों में टूट गई है, और सर्वर 1 पर क्षेत्र सर्वर 3 के क्षेत्र के पास नहीं है, तो उनके लिए संस्थाओं के बारे में जानकारी साझा करने का कोई कारण नहीं है।

इसी तरह, एकल सर्वर पर, केवल ग्राहकों को प्रासंगिक जानकारी भेजें। यदि खिलाड़ी A, B से मैप के बिलकुल विपरीत छोर पर है, तो B से A के बारे में अपडेट भेजने का शून्य कारण है, या इसके विपरीत।

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

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

यह डिज़ाइन किसी एकल सर्वर को थ्रेड करना भी आसान बनाता है। किसी भी इकाई को सीधे दूसरे को संशोधित नहीं करना चाहिए, केवल संदेश भेजना चाहिए, और स्थानीय प्रति-सर्वर / प्रति-थ्रेड प्रॉक्सी कैश को थोड़ा पुराना होना चाहिए।

उदाहरण के लिए, यदि इकाई A अटैक करने वाली इकाई B है, तो B के जीवन की जांच न करें और यदि वह हिट करता है तो एक मृत्यु संदेश भेजें। 0. बस "क्षतिग्रस्त" संदेश भेजें, B के लिए आधिकारिक सर्वर को हैंडल करें, और फिर किसी को भी हैंडल करें "इकाई-मर गया" संदेश सर्वर बी द्वारा बाद में भेजा गया था यदि इकाई ए उस बारे में परवाह करती है।

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


धन्यवाद, इससे मेरी शेष शंकाएँ समाप्त हो गईं। इसके अलावा, आपने मुझे खिलाड़ियों द्वारा सर्वर को अलग करने का विचार दिया, न कि क्षेत्रों को - यह चिकना लगेगा। प्रत्येक सर्वर x खिलाड़ियों का ध्यान रखता है। मुझे वास्तव में पसंद है! क्या यह प्रयोग किया जाता है? और यह भी, बस एक और बात है। जैसा कि मैंने ऊपर पूछा है, मैंने अभी एक नए NoSQL डेटाबेस, काउचबेस के बारे में सीखा है। यह बहुत तेजी से लिखने / पढ़ने की गति को छोड़कर: CouchDB की तरह होना चाहिए, प्रति सेकंड 200k अपडेट! शायद यह वास्तव में इस तरह के "वास्तविक समय साझा विश्व मॉडल" के रूप में काम कर सकता है, या अभी तक नहीं?
MaiaVictor

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

@ डॉककट: यह संभव हो सकता है कि कुछ प्रकार के "सॉफ्ट एरिया" हों, जहां आपके पास प्रत्येक सर्वर मुख्य रूप से खेल की दुनिया के किसी खास हिस्से में खिलाड़ियों को संभाल रहा हो, लेकिन क्या वे खिलाड़ी को किसी अन्य सर्वर पर पारदर्शी रूप से सौंपेंगे, यदि वे बहुत दूर से भटकते हैं उनके मूल सर्वर का क्षेत्र। आपको बस यह सुनिश्चित करने की आवश्यकता होगी कि हैंडओवर पर्याप्त चिकना है कि खिलाड़ी वास्तव में इसे नोटिस नहीं करते हैं। तुम भी कुछ फैंसी अनुकूली तकनीकों का उपयोग करने के लिए एक ही सर्वर पर बातचीत करने वाले खिलाड़ियों के समूहों को रखने की कोशिश कर सकते हैं, भले ही वे केवल एक क्षेत्र सीमा पर हों।
इल्मरी करोनें


2

डेटाबेस के बारे में मत सोचो कि हर समय हर चीज के बारे में सब कुछ संग्रहीत करने वाला वास्तविक समय साझा विश्व मॉडल - जैसा कि आपने देखा है, कि संभवतः काम नहीं कर सकता है।

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

वास्तविक वास्तविक समय की विश्व स्थिति खेल सर्वरों द्वारा, स्मृति में, आपके मूल उदाहरण की तरह ही होनी चाहिए। अब, क्षैतिज स्केलिंग के लिए चाल यह है कि हर सर्वर को हर पल हर चीज को जानने की जरूरत नहीं है । उदाहरण के लिए, खिलाड़ी एक सर्वर एक पर क्षेत्र एक में खेल रहा है, क्षेत्र बी चल सर्वर बी आमतौर पर पता करने की जरूरत नहीं पड़ता कि खिलाड़ी एक है उनके बैग में - और, अगर यह होता है किसी कारण के लिए है कि पता करने के लिए की जरूरत है (जैसे कि, क्योंकि जोन B में खिलाड़ी B, A पर किसी प्रकार की दूरस्थ जासूसी वर्तनी लिखता है) यह उस जानकारी के लिए दूसरे सर्वर से पूछ सकता है ।

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


बहुत बढ़िया जवाब! यह वही था जो मैं पूछ रहा था, धन्यवाद। तो शायद कुंजी को स्मृति में तर्क रखते हुए, सर्वर को क्षेत्रों में विभाजित करना है। हालांकि मैं जोड़ सकता हूं: मैंने अभी एक नए NoSQL डेटाबेस, काउचबेस के बारे में सीखा है। यह बहुत तेजी से लिखने / पढ़ने की गति को छोड़कर: CouchDB की तरह ही होना चाहिए, प्रति सेकंड 200k अपडेट! शायद यह वास्तव में इस तरह के "वास्तविक समय साझा विश्व मॉडल" के रूप में काम कर सकता है, या अभी तक नहीं?
MaiaVictor

@Dokkat नहीं, यह नहीं होगा। Couchbase जादू नहीं है।
फिलिप

2

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

  • सटीक, वास्तविक समय स्थान त्रिज्या आर के भीतर उपयोगी हो सकता है
  • कम-सटीक, कम लगातार स्थान अपडेट त्रिज्या 2 * आर के भीतर उपयोगी हो सकते हैं
  • त्रिज्या 2 * आर से परे किसी भी स्थान की जानकारी की आवश्यकता नहीं हो सकती है

आप किसी इकाई के लिए समय-समय पर त्रिज्या 2 * R (या अपडेट दर और किसी इकाई के अधिकतम वेग के आधार पर) के भीतर संस्थाओं के लिए स्थान की जानकारी को संप्रेषित कर सकते हैं और अन्य इकाई के सटीक या अभेद्य स्थान फ़ीड के लिए इकाई की सदस्यता ले सकते हैं।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.