2010-02-09 7 views
0

J'ai un jeu de cartes multijoueur (jusqu'à 4 joueurs peuvent jouer la même instance du jeu) sur facebook. Le jeu est petit et est hébergé sur un seul serveur. Je m'intéresse maintenant à l'évolutivité, car j'espère que bientôt un serveur ne suffira pas.Azure: conseils pour rendre un jeu de cartes multijoueur simple et évolutif

Le serveur stocke en mémoire une liste de tous les jeux qui sont en cours: List<Game>

Lorsqu'un client fait une demande (par exemple lance une carte), il affiche un message au serveur. Maintenant, voici la partie délicate. Le serveur n'envoie pas la réponse immédiatement mais vérifie plutôt si un autre joueur a modifié l'état du jeu avant de répondre. Cette approche fonctionne très bien car le client (silverlight) n'interroge pas constamment le serveur.

Quelle approche recommanderiez-vous de prendre dans Azure? Ma principale priorité est d'obtenir une réponse rapide aux clients et d'éviter les interrogations constantes du client.

Avec ma connaissance Azure limitée Je pense à prendre cette route:

Conserver les jeux dans le stockage de table d'azur au lieu de la mémoire.

Cela se fera dans le WebRole: pseudocode:

void Page_LoadOfAnAspxPage 
{ 
// deserialze the message from the posted information 
Message msgClient = ...; 

// retrieve game from table storage 
Game g = RetrieveFromTableStorage(gameGuid); 

// post message to game 
g.ProcessClientMessage(msgClient); 

// save back to table storage so other game clients can be aware of new state 
SaveToTableStorage(gameGuid, g); 

// now wait until another client modifies the game 
while(true) // will I be incurring hosting charges (transactions for what is going on in this while loop)??? 
{ 
    // grab game from table storage 
    g = RetrieveFromTableStorage(gameGuid); 

    // has something changed? 
    MsgResponse response = g.ProcessClientMessage(msgClient); 
    if (response.ActionName != ActionName.GameHasNotChanged) 
    { 
    // some other client changed the game. 
    // give this response back to our client 
    break; 
    } 
    // sleep a little and check again... 
    Sleep(xx); 
} 
} 

Ne croyez-vous cette approche fonctionnera? Est-ce que je pourrais rencontrer des obstacles? Je serais vraiment reconnaissant pour toutes suggestions/améliorations.

Merci!

santiago

Répondre

Questions connexes