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

时间:2015-08-06 05:06:32

标签: java google-app-engine google-cloud-messaging google-cloud-datastore

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

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

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

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

如何执行如此大的查询?

编辑:我目前正在使用

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

进行测试,它运行正常。然而,当推送时,数据集很大,我不知道会产生什么后果。

1 个答案:

答案 0 :(得分:3)

我相信你是从错误的角度看待它。

客观化或低级别的appengine很好地处理使用游标的分页结果,因此您需要按块处理结果。我不会详细说明如何做到这一点,因为这最终会花费你很多$来进行所有数据存储读取,你需要任务队列。

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

用户(客户端应用)订阅该主题(在您的情况下为appid)。然后你发送一个单一的主题推送,这更容易从一个appengine前端实例(限制为30秒响应等)。

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

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

我能看到的唯一问题是从服务器推送记录最多需要30秒。 appengine前端实例也有30秒的限制,所以当它等待GCM推送完成时,servlet本身可以超时。解决这个问题的一种方法是从taskqueue发送推送,这将给你60秒的urlfetch调用(我认为该限制也适用于任何api调用):https://cloud.google.com/appengine/docs/java/urlfetch/