如何在多个谷歌appengine实例上保持全局变量的持久性?

时间:2011-12-23 13:10:02

标签: python google-app-engine variables global

我们的情况如下: 我们正在研究一个学校项目,其目的是让多个团队在智能手机的城市中四处走动,并在步行时玩城市游戏。 因此,我们可以有10个活跃的智能手机在城市中走来走去,所有人都发布了他们的位置,并从google appengine请求数据。

有人在网络浏览器后面,看着所有这些团队四处走动,并向他们发送消息等。

我们正在使用google appengine提供的数据存储来存储这些团队发送和请求的所有数据,以存储消息并检索它们等。 然而,我们很快发现我们处于读取和写入的最大限制,因此我们搜索了一个解决方案,以便能够检索定期更新(这需要花费最多的读取和写入),而无需使用谷歌提供的任何有限资源。显然,因为它是一个学校项目,我们不想支付更多的读写费用。

将这些信息存储在全局变量中似乎是一个简单而快速的解决方案,它就是......但是当我们开始真正测试时,我们注意到我们的一些数据丢失了然后重新出现。结果是因为在云中发出了如此多的请求以致新实例被创建,并且实例不会保持这些全局变量的持久性。

所以我们的问题是: 我们能否以某种方式确保这些全局变量在每个运行的google appengine实例上始终相同。 要么 我们可以限制运行的实例数量,无论对“1”执行了多少请求。 要么 是否有另一种方法可以更好地存储这些数据,而无需使用数据存储区而不使用全局变量。

4 个答案:

答案 0 :(得分:3)

你应该使用memcache。如果使用ndb(新数据库)库,则可以自动缓存查询结果。显然,这不会大大改善你的写作,但它应该会显着改善你可以做的读取次数。

您需要使用数据存储区备份它,因为数据可以随时从memcache中弹出。如果你愿意(小)失去更新的机会,你可以使用memcache。您可以执行类似于在数据存储区中存储消息ID并让控制器定期验证每个消息ID在memcache中具有相应条目的操作。如果缺少一个,控制器将需要重新输入。

答案 1 :(得分:0)

有趣的问题。首先是一些坏消息,我认为没有更好的存储数据的方法;不,你将无法从产生中停止新实例,不能,你不能让单独的实例总是拥有相同的数据。

您可以做的是让实例与数据存储区中的主记录进行perioidically同步,通过智能地选择频率并一次性下载/上传信息,可以将读取/写入次数限制为一个级别这对你有用。尽管如此,这仍然是在kludge领域。

尽管找到了其他所有内容的配额,我找不到免费读/写的限制,所以它们可能很小,但是只用10个智能手机就可以点击它们给我一个红旗。您确定智能手机正以合理的频率进行轮询(或呼入)吗?听起来你可能会不必要地锤击它们。

答案 2 :(得分:0)

考虑用于对等体之间通信的jabber协议。它的自由限制水平相当高。

答案 3 :(得分:0)

首先,正如Tim Delaney所说,肯定会使用memcache。仅这一点可能会解决您的问题。

如果没有,你应该考虑推模型。优点是,只有在实际发生了某些变化时,您的客户才不会一直要求您提供新数据。如果更新足够小以至于您可以在推送消息中提供它,则无需担心所有这些客户端上的数据存储读取内存错误或任何其他重复工作:您在更改时读取数据一次把它推给大家。

推送的第一个选项是C2DM(Android)或APN(iOS)。这些限制因素包括发送的数据量和更新频率。

如果你想获得更好的体验,你可以使用XMPP。这可以让你更频繁地更新(我相信)更大的有效载荷,但可能需要更多的工程。有关起点,请参阅有关AndroidiOS的Stack Overflow问题。

玩得开心!