我正在使用Google App Engine作为刚刚发布的iOS游戏的后端。
通过玩游戏的行为,玩家可以创建关卡,然后与朋友和整个世界共享。 GAE用于存储和检索这些级别。 GAE还管理玩家的高分,因为它们比Game Center可以处理的更复杂。
总体而言,GAE运作良好。我喜欢GAE如何在需要时旋转新实例而不必不断地监控负载。对于这个游戏,GAE运行大约10个实例,每秒服务大约8个查询。
但是有一个小问题。
我注意到有时玩家会两次进入高分榜。这是不可能的,因为我在提出新分数之前删除了任何旧分数(这是在GAE的一个查询中完成的)。
经过一些测试和探索之后,似乎正在发生的事情是,玩家将获得高分,而实例1处理删除旧分数和添加新分数。然后玩家获得一个新的高分,但是这个时间实例4是处理请求的那个,它还不知道另一个分数。以最快的速度,玩家需要10秒才能获得新的高分。据我所知,数据复制只花了2到3秒钟。
我在测试期间从未见过这个问题,因为加载很少导致启动2个实例。
这对于发生的事情以及如何为每个实例存储数据看起来似乎是合理的解释吗?
有没有办法保证在一个实例中添加,删除或更改的数据在另一个实例中可用?高分并不是“关键任务”,所以我不太担心它,但我想在更复杂的情况下使用GAE来保证数据的一致性。
这可能与GAE有关,还是我应该考虑其他解决方案?
答案 0 :(得分:2)
可以保证所有数据中心的数据一致(强一致性)。您需要使用祖先查询来实现它。但是,这样做会限制您可以实现的每秒写入次数。目前限制为每秒1次写入。
如果写入限制对您来说太慢,则可以选择添加缓存层。所以你仍然会使用最终的一致性模型,但是你会将这些结果与memcache中的结果混合在一起。
有关详细信息,请参阅文档Structuring for Strong Consistency。