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