应用引擎游戏得分/排行榜设计 - 如何做得更好?

时间:2011-11-21 20:45:22

标签: google-app-engine

我有一个现有的Android游戏,它使用GAE来获得总得分并生成排行榜。然而,即使有10个同时用户,我也会看到各种可怕的怪异。

每场比赛持续3分钟。该计时由运行任务的同步CRON条目强制执行。

第0步

  • 客户提交分数
  • GAE检查用户是否存在,并创建包含用户名+分数/等的临时模型对象
  • GAE产生更新用户统计数据(玩了多少游戏,总得分等)的任务

第1步(提交+5秒)...由CRON发起:

  • 收集所有临时用户分数
  • 对它们进行排名并将它们放入该游戏的烫发存储空间
  • 更新"之前的游戏"键控模型指针指向最新的"之前的游戏"
  • 更新"当前游戏"指向下一个可用的游戏板

第2步 :(提交+ 10秒):

  • 为客户提供分数。
  • 客户开始拉分数(获取"上一场比赛"'指针'键,deref和发球结果)

第3步 :(提交+20秒):

  • 客户开始拉下一场比赛

第4步 :(提交+ 25秒):

  • 新游戏开始下一个2m30secs

我看到的问题:

GAE随机存储部分/全部提交的分数,或者无法检索部分/全部分数来计算游戏的所有结果。

GAE有时会为同一个板提供两次(即:同步CRON没有运行)。

GAE没有记录任何错误(wtf?)。这就像操作从未发生过,而不是一些随机错误。误差率约为2-5%,但每天480次游戏,这是很多错误......我的用户会注意到这些错误!

如果有人对更好的建筑方法或评论有任何建议,我们将不胜感激!我知道我可以通过使用memcache获得结果并将结果预转换为流(因为memcache使用pickle)来提高性能,但我更有兴趣修复错误/等。

1 个答案:

答案 0 :(得分:1)

这方面的诀窍是:

  1. 在本地ram和pre-json中缓存查询(例如:用于游戏板/结果)
  2. 使用后端,异步拉动到node.js缓存框,该缓存框接收分数以获取排行榜数据
  3. 后端创建排行榜,然后将它们推送到数据存储区和内存缓存
  4. Backend依赖于经过NTP校正的衍生线程,并使用sleep()
  5. 与时间保持同步运行
  6. 一个cron作业监视后端,如果它崩溃将重启(因为GAE因基础设施错误而不会重启)
  7. 试过这不起作用:

    1. Cron工作以保持时间(不会一直运行,也不会按时运行)
    2. 多个后端接受结果而不是node.js boxen
    3. CloudSQL(吞吐量问题)