Сьогодні я намагаюся створити архітектуру нової мобільної гри MMORPG для моєї компанії. Ця гра схожа на війни Mafia, iMobsters або RISK. Основна ідея - підготувати армію для боротьби зі своїми противниками (онлайн-користувачами).
Хоча я раніше працював над кількома мобільними додатками, але це для мене щось нове. Після великої боротьби я придумав архітектуру, яка проілюстрована за допомогою діаграми потоків високого рівня:
Ми вирішили перейти з моделлю клієнт-сервер. На сервері буде централізована база даних. У кожного клієнта буде своя локальна база даних, яка залишатиметься синхронізованою із сервером. Ця база даних виконує функції кешу для зберігання речей, які часто не змінюються, наприклад, карти, продукти, інвентар тощо.
Коли ця модель створена, я не впевнений, як вирішити такі проблеми:
- Який був би найкращий спосіб синхронізації баз даних сервера та клієнта?
- Чи повинна подія зберегтись у локальній БД, перш ніж оновити її на сервер? Що робити, якщо програма чомусь припиняється перед збереженням змін у централізованому БД?
- Чи слугуватимуть прості HTTP-запити для синхронізації?
- Як дізнатися, які користувачі зараз увійшли? (Один із способів може полягати в тому, щоб клієнт продовжував надсилати запит на сервер через кожні х хвилин, щоб повідомити, що він активний. В іншому випадку вважайте клієнта неактивним).
- Чи достатньо перевірок на стороні клієнта? Якщо ні, то як відновити дію, якщо сервер щось не перевірив?
Я не впевнений, чи це ефективне рішення, і як воно буде масштабуватися. Я дуже вдячний, якщо люди, які вже працювали над такими додатками, можуть поділитися своїм досвідом, який може допомогти мені придумати щось краще. Заздалегідь спасибі.
Додаткова інформація:
Сторона клієнта реалізована в ігровому двигуні C ++ під назвою мармелад. Це кросова платформа, яка означає, що ви можете запускати додаток на всіх основних мобільних ОС. Ми, звичайно, можемо досягти різьблення, що також проілюстровано на моїй схемі потоку Я планую використовувати MySQL для сервера та SQLite для клієнта.
Це не покрокова гра, тому немає великої взаємодії з іншими гравцями. Сервер надасть список онлайн-гравців, і ви можете боротися з ними, натиснувши кнопку бою, і після деякої анімації результат буде оголошено.
Для синхронізації бази даних я маю на увазі два рішення:
- Зберігати часові позначки для кожного запису. Також слідкуйте за тим, коли місцевий БД востаннє оновлювався. Під час синхронізації вибирайте лише ті рядки, які мають більшу позначку часу, та надсилайте до локальної БД. Зберігайте прапор isDeleted для видалених рядків, щоб кожне видалення просто поводилось як оновлення. Але у мене є серйозні сумніви щодо продуктивності, оскільки для кожного запиту на синхронізацію нам доведеться сканувати повний БД і шукати оновлені рядки.
- Іншою технікою може бути ведення журналу кожної вставки або оновлення, яке відбувається проти користувача. Коли клієнтська програма запитує синхронізацію, перейдіть до цієї таблиці та дізнайтеся, які рядки таблиці було оновлено чи вставлено. Після успішного перенесення цих рядків до клієнта видаліть цей журнал. Але тоді я думаю про те, що станеться, якщо користувач використовує інший пристрій. Відповідно до таблиці журналів усі оновлення передані для цього користувача, але насправді це було зроблено на іншому пристрої. Тож нам, можливо, доведеться також слідкувати за пристроєм. Впровадження цієї методики забирає більше часу, але не впевнений, чи виконує її перший.