使用App Engine更新移动设备上的数据(最好避免使用“热门平板电脑”)

时间:2011-12-03 12:03:28

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

上下文的一些背景信息:我正在使用大约六种核心对象(用户,种类,事件,标签,图像和信任)构建一个应用程序(iOS + android)。用户可以创建新用户,然后与其他用户共享此新用户(例如,父级可以创建子级,并邀请其他用户对此子级进行操作)。

对于每个用户,可以(给定足够的权限,由Trust对象表示)添加包含零个或多个标记以及零个或多个图像的新事件。每个事件也是“类”的一部分(它具有某种“种类”,由Kind对象表示)。

事件有一个时间戳(java.util.Date),因此它们可以按时间顺序显示给用户,并且所有对象都包含“已修改”的时间戳。

我在app引擎上使用Java,但我相信这个问题具有普遍性。此外,没有对象嵌入到其他对象中,只有键(即Event对象具有Image键列表,而不是Image对象)。

现在,挑战在于:我如何以有效的方式检查数据存储区以获取所有这些类型的更新?我的天真原型实现了这一点:在移动设备上,我目前经常轮询服务器(目前每五分钟或每当用户向服务器发送更新时),检查信任列表以找到轮询者可以看到的用户,对于每种类型(用户,种类,事件,标记,图像,信任),请向数据存储区询问与此用户相关的对象,其修改日期比上次轮询时更新。这显然是对数据存储区的过多调用。

如果应用引擎数据存储区存在“热线问题”问题(参见http://ikaisays.com/2011/01/25/app-engine-datastore-tip-monotonically-increasing-values-are-bad/),那么自上次检查以来,如何有效地向服务器请求更新?显然,添加时间戳会导致瓶颈。但我想更新移动客户端,因为它上次提出的更改已完成。 (我知道这个瓶颈不太可能影响我这个项目,但我在3月份有另一个项目,这可能会成为一个真正的问题。)

总而言之,问题是:使用应用引擎使用新/修改数据更新移动客户端的最佳做法是什么?

感谢您阅读我的文字墙,我希望我能够以一种易于理解的方式传达问题及其背景。

Ex animo,
  - 亚历山大。

1 个答案:

答案 0 :(得分:0)

(这原本是问题的一部分,但我把它编辑出来,因为它真的是试图回答其中的一部分。)

我相信我可以使用Query Cursors(参见http://code.google.com/appengine/docs/java/datastore/queries.html)来提高效率。它应该保留对已经到达的索引中的位置的引用(索引在修改的时间戳上排序),因此它可以在该点开始搜索。成本是按设备存储和传输此游标。对此的评论也是受欢迎的(它与如何有效更新客户的主要问题有关)。