在Google App Engine数据存储区中每秒写入次数超过5次的交易计数器

时间:2010-12-19 16:55:41

标签: google-app-engine google-cloud-datastore bigtable

我正在开发一款游戏的锦标赛版本,我期待1000多名同时玩家。比赛开始时,玩家将被快速淘汰(可能超过每秒5次),但随着锦标赛的进行,这个过程会变慢。取决于玩家从锦标赛中被淘汰的情况,奖励一定数量的积分。例如,先下降的玩家,什么都不得,而第500名玩家获得1分,第一名获胜者获得200分。现在我想在玩家被淘汰后立即奖励和显示积分数。

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

实现数据模型以支持此功能的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

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

  1. 完全忽略这个问题。消除集群将会发生,但只要不是持续的情况,交易的重试机制将确保它们全部被执行。
  2. 当有人外出时,独立录制,并更新锦标赛状态,异步分配排名。这意味着您无法立即通知他们的排名,而是需要进行异步回复或让他们对其进行轮询。
  3. 坦率地说,我会建议前者:即使你的1000人锦标赛中有一半在前5分钟内熄火 - 这是一个不太可能发生的事件 - 你仍然只能看到每秒不到2次的淘汰赛。实际上,任何尖峰都会比这更短,更短。

    要记住的一件事是,由于事务重试的工作原理,同一实体组上一起出现的事务将以半随机顺序解析 - 也就是说,它不是严格的FIFO队列。如果你需要,你必须自己强制执行,尽管在任何类型的分布式系统中这都是微不足道的事情。

答案 1 :(得分:0)

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

在更高级别,请查看来自Google代码堵塞小组的post and open source library。他们遇到了类似的问题,最终开发了一个基于数据存储区的可扩展记分板,可以有效地处理任意页面的更新和请求。