我在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);
}
}
您认为这种方法有效吗?我可能碰到的任何障碍? 我会非常感谢任何建议/改进。
谢谢!
圣地亚哥
答案 0 :(得分:0)
了解Silverlight Duplex功能。这将把负载/计算能力分配给silverlight客户端而不是服务器上,而无需管理自己的轮询机制。
然后,您可以以WCF服务的形式托管webrole中的逻辑