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