1

我正在使用 Google App Engine 作为刚刚发布的 iOS 游戏的后端。

通过玩游戏的行为,玩家创建关卡,然后与他们的朋友和整个世界分享这些关卡。GAE 用于存储和检索这些级别。GAE 还管理玩家的高分,因为它们比 Game Center 可以处理的更复杂。

总的来说,GAE 工作得很好。我喜欢 GAE 如何在需要时启动新实例,而无需我不断监控负载。对于这个游戏,GAE 运行大约 10 个实例,每秒处理大约 8 个查询。

但是有一个小问题。

我注意到有时玩家会两次进入高分表。这应该是不可能的,因为我在提交新分数之前删除了任何旧分数(这是在对 GAE 的一次查询中完成的)。

经过一些测试和探索,似乎正在发生的事情是玩家将获得高分,而实例 1 处理旧分数的删除和新分数的添加。然后玩家得到一个新的高分,但这次实例 4 是处理请求的那个,它还不知道另一个分数。

以最快的速度,玩家可能需要 10 秒才能获得新的高分。据我了解,数据复制只需要 2 或 3 秒。

我在测试期间从未见过这个问题,因为负载很少导致 2 个实例启动。

这似乎是对正在发生的事情以及如何为每个实例存储数据的合理解释?

有没有办法保证在一个实例中添加、删除或更改的数据在另一个实例中可用?高分不是“关键任务”,所以我不太担心,但我想将 GAE 用于一些更复杂的情况,其中数据的一致性非常重要。

GAE 可以做到这一点,还是我应该寻找其他解决方案?

4

1 回答 1

2

可以保证数据在所有数据中心之间保持一致(强一致性)。您需要使用祖先查询来实现它。但是,这样做会限制您每秒可以实现多少次写入。目前限制为每秒 1 次写入。

如果写入限制对您来说太慢,另一种选择是添加缓存层。因此,您仍将使用最终一致性模型,但您会将这些结果与 memcache 中的结果混合。

有关详细信息,请参阅文档Structuring for Strong Consistency

于 2012-08-22T18:38:20.630 回答