如何在 google 应用引擎中执行大型查询?

How do I perform a large query in google app engine?

我收集的应用程序总用户数接近 100 万。我现在正在添加一个使用 Google 云消息传递来创建警报的推送通知系统。我的数据库包含一个具有 GcmId 和应用程序名称的实体(例如 "myApp1")。

现在,我想向 "myApp1" 的所有用户发送一条 GCM 消息。 objectify 文档没有很好地描述 .limit 函数。例如,来自 GCM 演示应用程序:

        List<RegistrationRecord> records = ofy().load().type(RegistrationRecord.class).limit(10).list();

将发送至前 10 个条目。但我需要所有匹配 appType="myApp1" 的条目。这更难,因为查询可能很大并且可能匹配 50 万用户,我需要将 GCM 推送发送给所有这些用户。

这么大的查询是如何执行的?

编辑:我目前正在使用

        List<RegistrationRecord> records = ofy().load().type(RegistrationRecord.class).filter("app","myApp1").list();

用于测试并且运行良好。但是上线后,数据量很大,不知道会产生什么影响。

我相信你看错了。

objectify 或低级应用引擎可以很好地处理使用游标的分页结果,因此您需要按块处理结果。我不会详细介绍如何执行此操作,因为这最终会导致您为所有这些数据存储区读取花费很多美元,并且您将需要任务队列。

相反,请查看 google 云消息传递中的主题: https://developers.google.com/cloud-messaging/topic-messaging

用户(客户端应用程序)订阅主题(在您的案例中为 appid)。然后您发送一个主题推送,这从应用引擎前端实例中更容易(限制为 30 秒响应等)。

我发现这个博客 post 是完整实施以及如何正确处理可能的错误的一个很好的例子:

https://blog.pushbullet.com/2014/02/12/keeping-google-cloud-messaging-for-android-working-reliably-techincal-post/

我能看到的唯一问题是来自服务器的推送被记录为最多需要 30 秒。 appengine 前端实例也有 30 秒的限制,因此在等待 GCM 推送完成时,servlet 本身可能会超时。解决此问题的一种方法是从任务队列发送推送,这将为您提供 60 秒的 urlfetch 调用(我假设该限制也适用于任何 api 调用):https://cloud.google.com/appengine/docs/java/urlfetch/