আজকাল আমি আমার সংস্থার জন্য একটি নতুন এমএমওআরপিজি মোবাইল গেমের আর্কিটেকচার ডিজাইনের চেষ্টা করছি। এই গেমটি মাফিয়া ওয়ার্স, আইববস্টার বা ঝুঁকিগুলির মতো। বেসিক ধারণাটি হ'ল আপনার প্রতিপক্ষের সাথে লড়াই করার জন্য একটি সেনা প্রস্তুত করা (অনলাইন ব্যবহারকারী)।
যদিও এর আগে আমি একাধিক মোবাইল অ্যাপে কাজ করেছি তবে এটি আমার কাছে নতুন কিছু। অনেক লড়াইয়ের পরে, আমি একটি স্থাপত্য নিয়ে এসেছি যা উচ্চ স্তরের প্রবাহ চিত্রের সাহায্যে চিত্রিত হয়েছে:
আমরা ক্লায়েন্ট-সার্ভার মডেলের সাথে যাওয়ার সিদ্ধান্ত নিয়েছি। সার্ভারে একটি কেন্দ্রীভূত ডাটাবেস থাকবে। প্রতিটি ক্লায়েন্টের নিজস্ব স্থানীয় ডাটাবেস থাকবে যা সার্ভারের সাথে সিঙ্কে থাকবে। এই ডাটাবেসটি এমন জিনিসগুলি সংরক্ষণের জন্য ক্যাশে হিসাবে কাজ করে যা ঘন ঘন পরিবর্তিত হয় না যেমন যেমন মানচিত্র, পণ্য, জায় ইত্যাদি change
এই মডেলটি স্থানে রেখে, আমি নিম্নলিখিত বিষয়গুলি কীভাবে মোকাবেলা করব তা নিশ্চিত নই:
- সার্ভার এবং ক্লায়েন্ট ডাটাবেস সিঙ্ক্রোনাইজ করার সর্বোত্তম উপায় কী হবে?
- কোনও ইভেন্টটি সার্ভারে আপডেট করার আগে স্থানীয় ডিবিতে সংরক্ষণ করা উচিত? অ্যাপ্লিকেশন কেন্দ্রীভূত ডিবিতে পরিবর্তনগুলি সংরক্ষণের আগে কোনও কারণে বন্ধ হয়ে যায়?
- সাধারণ এইচটিটিপি অনুরোধগুলি কী সিঙ্ক্রোনাইজেশনের উদ্দেশ্যে কাজ করবে?
- কোন ব্যবহারকারী বর্তমানে লগ ইন করেছেন তা কীভাবে জানবেন? (একটি উপায় হ'ল ক্লায়েন্টটি প্রতি x মিনিটের পরে সার্ভারে একটি অনুরোধ প্রেরণ করে এটি সক্রিয় কিনা তা জানাতে পারেন Otherwise অন্যথায় কোনও ক্লায়েন্টকে নিষ্ক্রিয় মনে করুন)।
- ক্লায়েন্ট পক্ষের বৈধতা কি যথেষ্ট? যদি তা না হয় তবে সার্ভার কোনও কিছুকে বৈধতা না দিলে কোনও ক্রিয়াকে কীভাবে রিভার্ট করবেন?
আমি নিশ্চিত নই যে এটি একটি কার্যকর সমাধান এবং এটি কীভাবে মাপবে। আমি ইতিমধ্যে প্রশংসা করব যদি এই জাতীয় অ্যাপগুলিতে ইতিমধ্যে কাজ করা লোকেরা তাদের অভিজ্ঞতাগুলি ভাগ করতে পারে যা আমাকে আরও ভাল কিছু নিয়ে আসতে সহায়তা করতে পারে help আগাম ধন্যবাদ.
অতিরিক্ত তথ্য:
ক্লায়েন্ট-সাইডটি সি ++ গেম ইঞ্জিনে প্রয়োগ করা হয় যা মার্বেল বলে। এটি একটি ক্রস প্ল্যাটফর্ম গেম ইঞ্জিন যার অর্থ আপনি সমস্ত বড় মোবাইল ওএসে আপনার অ্যাপটি চালাতে পারেন। আমরা অবশ্যই থ্রেডিং অর্জন করতে পারি এবং এটি আমার ফ্লো ডায়াগ্রামেও চিত্রিত হয়। আমি সার্ভারের জন্য মাইএসকিউএল এবং ক্লায়েন্টের জন্য এসকিউএলাইট ব্যবহার করার পরিকল্পনা করছি।
এটি কোনও টার্ন ভিত্তিক খেলা নয় তাই অন্যান্য খেলোয়াড়দের সাথে খুব বেশি মিথস্ক্রিয়া হয় না। সার্ভার অনলাইন প্লেয়ারগুলির একটি তালিকা সরবরাহ করবে এবং আপনি যুদ্ধের বোতামে ক্লিক করে তাদের সাথে যুদ্ধ করতে পারেন এবং কিছু অ্যানিমেশন দেওয়ার পরে, ফলাফল ঘোষণা করা হবে।
ডাটাবেস সিঙ্ক্রোনাইজের জন্য আমার মনে দুটি সমাধান রয়েছে:
- প্রতিটি রেকর্ডের জন্য টাইমস্ট্যাম্প সঞ্চয় করুন। স্থানীয় ডিবি কখন শেষ আপডেট হয়েছিল তাও নজর রাখুন। সিঙ্ক্রোনাইজ করার সময়, কেবলমাত্র সেই সারিগুলি নির্বাচন করুন যার একটি বেশি টাইমস্ট্যাম্প রয়েছে এবং স্থানীয় ডিবিতে প্রেরণ করুন। মুছে ফেলা সারিগুলির জন্য একটি মুছে ফেলা পতাকা রাখুন যাতে প্রতিটি মুছে ফেলা কেবল আপডেট হিসাবে আচরণ করে। তবে পারফরম্যান্স সম্পর্কে আমার গুরুতর সন্দেহ রয়েছে কারণ প্রতিটি সিঙ্ক অনুরোধের জন্য আমাদের সম্পূর্ণ ডিবি স্ক্যান করতে হবে এবং আপডেট হওয়া সারিগুলি সন্ধান করতে হবে।
- অন্য কৌশলটি হ'ল প্রতিটি ব্যবহারকারীর বিরুদ্ধে সংযোজন বা আপডেটের লগ রাখা। যখন ক্লায়েন্ট অ্যাপ্লিকেশন সিঙ্কের জন্য জিজ্ঞাসা করবে, তখন এই টেবিলটিতে যান এবং কোন সারণির কোন সারিটি আপডেট করা হয়েছে বা inোকানো হয়েছে তা সন্ধান করুন। একবারে এই সারিগুলি ক্লায়েন্টে সাফল্যের সাথে স্থানান্তরিত হলে এই লগটি সরান। তবে তারপরে আমি ভাবছি যদি কোনও ব্যবহারকারী অন্য ডিভাইস ব্যবহার করে তবে কী হয়। লগ টেবিল অনুসারে সমস্ত আপডেটগুলি সেই ব্যবহারকারীর জন্য স্থানান্তর করা হয়েছে তবে আসলে এটি অন্য ডিভাইসে করা হয়েছিল। সুতরাং আমাদের ডিভাইসটিও রাখতে হবে। এই কৌশলটি প্রয়োগ করা বেশি সময় সাশ্রয়ী তবে নিশ্চিত নয় যে এটি প্রথমটি কার্যকর করে কিনা।