Ces jours-ci, j'essaie de concevoir l'architecture d'un nouveau jeu mobile MMORPG pour mon entreprise. Ce jeu est similaire à Mafia Wars, iMobsters ou RISK. L'idée de base est de préparer une armée pour combattre vos adversaires (utilisateurs en ligne).
Bien que j'aie déjà travaillé sur plusieurs applications mobiles, c'est quelque chose de nouveau pour moi. Après beaucoup de lutte, j'ai trouvé une architecture qui est illustrée à l'aide d'un organigramme de haut niveau:
Nous avons décidé d'opter pour le modèle client-serveur. Il y aura une base de données centralisée sur le serveur. Chaque client aura sa propre base de données locale qui restera synchronisée avec le serveur. Cette base de données sert de cache pour stocker des éléments qui ne changent pas fréquemment, par exemple des cartes, des produits, des stocks, etc.
Avec ce modèle en place, je ne sais pas comment résoudre les problèmes suivants:
- Quelle serait la meilleure façon de synchroniser les bases de données serveur et client?
- Un événement doit-il être enregistré dans la base de données locale avant de le mettre à jour sur le serveur? Que se passe-t-il si l'application se termine pour une raison quelconque avant d'enregistrer les modifications dans la base de données centralisée?
- Les requêtes HTTP simples serviront-elles à la synchronisation?
- Comment savoir quels utilisateurs sont actuellement connectés? (Une façon pourrait être de demander au client d'envoyer une demande au serveur toutes les x minutes pour signaler qu'il est actif. Sinon, considérez un client comme inactif).
- Les validations côté client sont-elles suffisantes? Sinon, comment annuler une action si le serveur ne valide pas quelque chose?
Je ne sais pas si c'est une solution efficace et comment elle évoluera. J'apprécierais vraiment que les personnes qui ont déjà travaillé sur de telles applications puissent partager leurs expériences qui pourraient m'aider à trouver quelque chose de mieux. Merci d'avance.
Information additionnelle:
Le côté client est implémenté dans le moteur de jeu C ++ appelé marmalade. Il s'agit d'un moteur de jeu multiplateforme qui signifie que vous pouvez exécuter votre application sur tous les principaux systèmes d'exploitation mobiles. Nous pouvons certainement réaliser le filetage et qui est également illustré dans mon organigramme. Je prévois d'utiliser MySQL pour le serveur et SQLite pour le client.
Ce n'est pas un jeu au tour par tour donc il n'y a pas beaucoup d'interaction avec les autres joueurs. Le serveur fournira une liste de joueurs en ligne et vous pouvez les combattre en cliquant sur le bouton de bataille et après une certaine animation, le résultat sera annoncé.
Pour la synchronisation de la base de données, j'ai deux solutions en tête:
- Stockez l'horodatage de chaque enregistrement. Gardez également une trace de la dernière mise à jour de la base de données locale. Lors de la synchronisation, sélectionnez uniquement les lignes qui ont un horodatage supérieur et envoyez-les à la base de données locale. Conservez un indicateur isDeleted pour les lignes supprimées afin que chaque suppression se comporte simplement comme une mise à jour. Mais j'ai de sérieux doutes sur les performances car pour chaque demande de synchronisation, nous devrons analyser la base de données complète et rechercher des lignes mises à jour.
- Une autre technique peut consister à conserver un journal de chaque insertion ou mise à jour effectuée sur un utilisateur. Lorsque l'application cliente demande une synchronisation, accédez à ce tableau et découvrez quelles lignes de quel tableau ont été mises à jour ou insérées. Une fois ces lignes transférées avec succès au client, supprimez ce journal. Mais je pense à ce qui se passe si un utilisateur utilise un autre appareil. Selon le tableau des journaux, toutes les mises à jour ont été transférées pour cet utilisateur, mais en réalité cela a été fait sur un autre appareil. Il nous faudra donc peut-être aussi garder une trace de l'appareil. La mise en œuvre de cette technique prend plus de temps, mais ne sait pas si elle exécute la première.