4

我正在开发一款游戏的锦标赛版本,我希望同时有 1000 多名玩家参与其中。比赛开始时,玩家会很快被淘汰(可能每秒超过 5 个),但随着比赛的进行,这个过程会减慢。根据玩家在比赛中被淘汰的时间,会获得一定数量的积分。例如,第一个掉线的玩家一无所获,而第 500 位的玩家获得 1 分,而第一名的玩家获得 200 分。现在我想在玩家被淘汰后立即奖励并显示积分数量。

问题是,当我在玩家被淘汰后将新行推入数据存储时,行实体必须位于单独的实体组中,因此我不会达到 1 个实体每秒 1-5 次写入的 gae 数据存储限制团体。此外,我需要能够一致地读取和写入行数,以便我可以正确确定所有被淘汰的玩家的奖品。

实现数据模型以支持这一点的最佳方法是什么?

4

2 回答 2

2

由于玩家数量有限,几秒钟内的争用问题不太可能持续很长时间,因此您有两种选择:

  1. 简单地忽略这个问题。会出现消除集群,但只要不是持续的情况,事务的重试机制将确保它们都被执行。
  2. 当有人出去时,独立记录这一点,并异步更新锦标赛状态,分配排名。这意味着您不能立即通知他们他们的排名,而是需要进行异步回复或让他们轮询。

坦率地说,我建议前者:即使你的 1000 人锦标赛在前 5 分钟内结束了一半——这是一个非常不可能发生的事件——你仍然看到每秒少于 2 次淘汰。实际上,任何尖峰都会比这更小且寿命更短。

要记住的一件事是,由于事务重试的工作方式,同一实体组上一起发生的事务将以半随机顺序解决 - 也就是说,它不是严格的 FIFO 队列。如果您需要,您必须自己执行它,尽管在任何类型的分布式系统中这都不是一件容易的事。

于 2010-12-19T23:04:25.693 回答
0

现有的评论和答案很好地解决了具体问题。

在更高的层次上,看看这篇文章和来自 google code jam 团队的开源库。他们遇到了类似的问题,最终开发了一个基于数据存储的可扩展记分板,可以有效地处理任意页面的更新和请求。

于 2011-01-27T23:25:47.353 回答