MMO सर्वर के लिए गेम लॉग प्रारूप


12

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

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

मुझे यकीन नहीं है कि कस्टम बाइनरी लॉग फॉर्मेट्स के निर्माण के बारे में सीखना शुरू करना कहाँ है। कस्टम लॉग फॉर्मेट, या विषय पर किसी भी अनुशंसित कागजात / लेख बनाने के साथ आपके अनुभव क्या हैं?

जवाबों:


7

में Stendhal हम एक कतार में खेल की घटनाओं को जोड़ने और फिर उन्हें प्रसंस्करण द्वारा प्रदर्शन समस्या हल हो जाती पृष्ठभूमि में अतुल्यकालिक रूप से

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

लेकिन लॉग लिखना समस्या का केवल एक पक्ष है:

लॉग के साथ आप किन सवालों का जवाब देना चाहते हैं?

कालानुक्रमिक रूप से पूर्ण लॉग को पढ़ना आसान है; या इसे एक खिलाड़ी के लिए फ़िल्टर करने के लिए।

लेकिन इस तरह के प्रश्न हो सकते हैं:

  • बीथ द्वारा कल उठाए गए मैदान पर एंटोन ने किन वस्तुओं को रखा है? कौन सा खिलाड़ी अब उनका मालिक है? (एंटन ने उनके आइटम चोरी होने की शिकायत की)
  • एक औसत खिलाड़ी को 100 के स्तर तक पहुंचने के लिए कितना समय चाहिए? कौन से खिलाड़ी काफी तेज रहे हैं? केवल पहले पात्रों के लिए?
  • क्या ऐसे खिलाड़ी हैं जो बड़ी मात्रा में गेम-मनी संभालते हैं? यह किन खिलाड़ियों को दिया जाता है? बदले में मूल्यवान कुछ भी नहीं?
  • क्या कमजोर खिलाड़ी मजबूत प्राणियों को मारने में सक्षम हैं कि उन्हें कानूनी रूप से मारने में सक्षम नहीं होना चाहिए?
  • ...

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

हमारी गेमएवेंट्स टेबल में 51,429,139 पंक्तियाँ (पिछले साल) हैं और हमारे पास एक समर्पित आइटमलॉग टेबल है जिसमें 60,60,657 पंक्तियाँ (सभी समय) 15,893,831 आइटम हैं।


कितनी तेजी से अपने डेटाबेस के माध्यम से खोज कर रहा है? मुझे लॉग के साथ डैमेज हो गया है और हमें तीन महीने में लगभग 100,000,000 पंक्तियाँ मिल गई हैं। हम MySQL को स्टोरेज के रूप में उपयोग करते हैं और इसका प्रदर्शन खराब है। एक खिलाड़ी (केवल 20,000) पंक्तियों की सभी क्रियाओं को सूचीबद्ध करने वाली सरल क्वेरी अक्सर 60 सेकंड से अधिक होती है।
बालोन

1
सूचकांक कॉलम पर सरल प्रश्न तुरंत हैं। जटिल प्रश्न थोड़े समय के लिए हो सकते हैं, 60 सेकंड के प्रश्न होते हैं, लेकिन वे बहुत दुर्लभ हैं। हमने तालिका को बहुत अधिक अनुक्रमित किया और सम्मिलित रूप से उन्हें एसिंक्रोनस रूप से करने पर जुर्माना की भरपाई की।
हेंड्रिक ब्रम्मनमैन

हम्म मुझे लगता है कि मेरी समस्या यह है कि परिणाम सेट काफी बड़ा है, अक्सर एक खिलाड़ी के लिए 3000 और 150000 रिकॉर्ड के बीच। तो यह कारण हो सकता है कि इसमें इतना समय क्यों लगता है, क्योंकि यह छोटे परिणाम सेट के लिए बहुत तेजी से काम करता है।
बालोन

4

दक्षता से आपका क्या मतलब है? चाहे वह डिस्क या क्वेरी गति पर आकार हो, एक संबंधपरक डेटाबेस लगभग निश्चित रूप से आपके मालिकाना द्विआधारी प्रारूप को हरा या बराबर करने वाला है, और उपयोग करने के लिए बहुत आसान और अधिक लचीला है।

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

तो मैं आपको जो मिला है उससे चिपके रहने की सलाह दूंगा।


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

कस्टम इवेंट लॉग सेटअप सख्ती से कालानुक्रमिक प्लेबैक अला एफपीएस डेमो रिकॉर्डिंग के लिए आसान होगा, लेकिन यह हल करने के लिए एक बहुत ही अलग समस्या है। क्या किसी को व्यापक रूप से मल्टीप्लेयर क्लाइंट-सर्वर गेम के लिए डेमो रिकॉर्डिंग के समान कुछ विकसित करने का अनुभव है?
चार्ल्स एलिस

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

3

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


0

इन दिनों रिलेशनल डेटाबेस को अक्षम होने के लिए खटखटाया जाता है, लेकिन जब आप जिस प्रकार के लॉग के बारे में बात कर रहे हैं, उसे स्टोर करने के लिए, आपको वास्तव में दक्षता की आवश्यकता नहीं है क्योंकि वे गेम या इसके उपयोगकर्ताओं द्वारा लगातार एक्सेस नहीं किए जाएंगे - केवल आपकी टीम की आवश्यकता होगी डेटा पढ़ने के लिए।

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

आम तौर पर गेम ईवेंट कुछ इस तरह दिखते हैं (यह विशेष रूप से डेल्टाडीएनए का प्रारूप है)

{
 "eventName":"specific event code – eg. gameStarted",
 "userID":"ABCD1-4321a879b185fcb9c6ca27abc5387e914",
 "sessionID":"4879bf37-8566-46ce-9f3b-bd18d6ac614e",
 "eventTimestamp":"yyyy-mm-dd hh:mm:ss.SSS",
 "eventParams":
  {
   "platform":"WEB",
   "param1":"stringParam",
   "param2":true,
   "param3":1234,
   "param4":["a","b","c"]
  },
}

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

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