इन दिनों मैं अपनी कंपनी के लिए एक नए MMORPG मोबाइल गेम की वास्तुकला डिजाइन करने की कोशिश कर रहा हूं। यह खेल माफिया युद्धों, iMobsters, या जोखिम के समान है। मूल विचार अपने विरोधियों (ऑनलाइन उपयोगकर्ताओं) से लड़ने के लिए एक सेना तैयार करना है।
हालाँकि मैंने पहले कई मोबाइल ऐप पर काम किया है लेकिन यह मेरे लिए कुछ नया है। बहुत संघर्ष के बाद, मैं एक वास्तुकला के साथ आया हूं, जिसे उच्च-स्तरीय प्रवाह आरेख की मदद से चित्रित किया गया है:
हमने क्लाइंट-सर्वर मॉडल के साथ जाने का फैसला किया है। सर्वर पर एक केंद्रीकृत डेटाबेस होगा। प्रत्येक क्लाइंट का अपना स्थानीय डेटाबेस होगा जो सर्वर के साथ सिंक में रहेगा। यह डेटाबेस उन चीजों को संग्रहीत करने के लिए एक कैश के रूप में कार्य करता है जो अक्सर बदलते नहीं हैं जैसे कि नक्शे, उत्पाद, इन्वेंट्री आदि।
इस मॉडल के साथ, मुझे यकीन नहीं है कि निम्नलिखित मुद्दों से कैसे निपटा जाए:
- सर्वर और क्लाइंट डेटाबेस को सिंक्रनाइज़ करने का सबसे अच्छा तरीका क्या होगा?
- क्या सर्वर को अपडेट करने से पहले किसी घटना को स्थानीय DB में सहेजा जाना चाहिए? क्या होगा यदि ऐप केंद्रीकृत DB में परिवर्तन सहेजने से पहले किसी कारण से समाप्त हो जाए?
- क्या सरल HTTP अनुरोध सिंक्रनाइज़ेशन के उद्देश्य को पूरा करेंगे?
- कैसे पता करें कि वर्तमान में कौन से उपयोगकर्ता लॉग इन हैं? (एक तरीका यह हो सकता है कि ग्राहक सक्रिय रहने के लिए हर एक एक्स-मिनट के बाद सर्वर को एक अनुरोध भेजते रहें। अन्यथा ग्राहक को निष्क्रिय मानें)।
- क्या क्लाइंट साइड सत्यापन पर्याप्त हैं? यदि नहीं, तो सर्वर को कुछ मान्य नहीं करने पर किसी कार्रवाई को कैसे वापस करना है?
मुझे यकीन नहीं है कि यह एक कुशल समाधान है और यह कैसे पैमाना होगा। मैं वास्तव में सराहना करूंगा यदि ऐसे लोग जो पहले से ही ऐसे ऐप्स पर काम कर चुके हैं, अपने अनुभव साझा कर सकते हैं जो मुझे कुछ बेहतर करने में मदद कर सकते हैं। अग्रिम में धन्यवाद।
अतिरिक्त जानकारी:
क्लाइंट-साइड को C ++ गेम इंजन में लागू किया जाता है जिसे मुरब्बा कहा जाता है। यह एक क्रॉस प्लेटफॉर्म गेम इंजन है जिसका मतलब है कि आप अपने ऐप को सभी प्रमुख मोबाइल ओएस पर चला सकते हैं। हम निश्चित रूप से थ्रेडिंग को प्राप्त कर सकते हैं और जिसे मेरे प्रवाह आरेख में भी चित्रित किया गया है। मैं क्लाइंट के लिए सर्वर और SQLite के लिए MySQL का उपयोग करने की योजना बना रहा हूं।
यह एक बारी आधारित खेल नहीं है, इसलिए अन्य खिलाड़ियों के साथ ज्यादा बातचीत नहीं है। सर्वर ऑनलाइन खिलाड़ियों की एक सूची प्रदान करेगा और आप उन्हें लड़ाई बटन पर क्लिक करके लड़ाई कर सकते हैं और कुछ एनीमेशन के बाद परिणाम की घोषणा की जाएगी।
डेटाबेस सिंक्रनाइज़ेशन के लिए मेरे पास दो समाधान हैं:
- प्रत्येक रिकॉर्ड के लिए टाइमस्टैम्प स्टोर करें। यह भी ध्यान रखें कि स्थानीय डीबी को अंतिम बार अपडेट कब किया गया था। सिंक्रनाइज़ करते समय, केवल उन पंक्तियों का चयन करें जिनके पास अधिक टाइमस्टैम्प है और स्थानीय डीबी को भेजें। हटाए गए पंक्तियों के लिए एक हटाए गए ध्वज को रखें ताकि प्रत्येक विलोपन केवल एक अद्यतन के रूप में व्यवहार करे। लेकिन मुझे प्रदर्शन के बारे में गंभीर संदेह है क्योंकि हर सिंक अनुरोध के लिए हमें संपूर्ण डीबी को स्कैन करना होगा और अद्यतन पंक्तियों की तलाश करनी होगी।
- एक अन्य तकनीक प्रत्येक प्रविष्टि या अद्यतन का एक लॉग रखने के लिए हो सकती है जो उपयोगकर्ता के खिलाफ होती है। जब क्लाइंट ऐप सिंक के लिए कहता है, तो इस तालिका पर जाएं और पता करें कि किस तालिका की कौन सी पंक्तियों को अपडेट या डाला गया है। एक बार इन पंक्तियों को सफलतापूर्वक इस लॉग को निकालने के लिए क्लाइंट को स्थानांतरित कर दिया जाता है। लेकिन फिर मुझे लगता है कि अगर कोई उपयोगकर्ता किसी अन्य डिवाइस का उपयोग करता है तो क्या होता है। लॉग्स टेबल के अनुसार सभी अपडेट उस उपयोगकर्ता के लिए स्थानांतरित कर दिए गए हैं, लेकिन वास्तव में यह किसी अन्य डिवाइस पर किया गया था। इसलिए हमें डिवाइस पर भी नज़र रखनी पड़ सकती है। इस तकनीक को लागू करने में अधिक समय लगता है, लेकिन यह सुनिश्चित नहीं होता है कि यह पहला प्रदर्शन करता है या नहीं।