Azure:关于制作简单的多人纸牌游戏的建议

时间:2010-02-09 19:45:16

标签: azure

我在Facebook上有一个多人纸牌游戏(最多4个玩家可以玩相同的游戏实例)。 游戏很小,托管在一台服务器上。 我现在正在考虑可扩展性,因为我希望很快就会有一台服务器不够用。

服务器在内存中存储正在进行的所有游戏的列表:List<Game>

当客户端发出请求(例如抛出一张卡片)时,它会向服务器发送一条消息。 现在这里是棘手的部分。 服务器不会立即发送响应,而是继续检查是否有其他玩家在回复之前修改了游戏状态。 这种方法非常有效,因为客户端(silverlight)不会不断地轮询服务器。

您建议我采用Azure的方法?我的主要优先事项是快速响应客户端并避免客户端不断轮询。

凭借我有限的Azure知识,我正在考虑走这条路:

将游戏存储在azure表存储中,而不是存储在内存中。

这将在webrole中完成: 的伪代码:

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);
 } 
}

您认为这种方法有效吗?我可能碰到的任何障碍? 我会非常感谢任何建议/改进。

谢谢!

圣地亚哥

1 个答案:

答案 0 :(得分:0)

了解Silverlight Duplex功能。这将把负载/计算能力分配给silverlight客户端而不是服务器上,而无需管理自己的轮询机制。

然后,您可以以WCF服务的形式托管webrole中的逻辑

http://silverlightforbusiness.net/2009/06/23/pushing-data-from-the-server-to-silverlight-3-using-a-duplex-wcf-service/