我的应用程序集合总共有近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();
进行测试,它运行正常。然而,当推送时,数据集很大,我不知道会产生什么后果。
答案 0 :(得分:3)
我相信你是从错误的角度看待它。
客观化或低级别的appengine很好地处理使用游标的分页结果,因此您需要按块处理结果。我不会详细说明如何做到这一点,因为这最终会花费你很多$来进行所有数据存储读取,你需要任务队列。相反,请查看Google云消息传递中的主题: https://developers.google.com/cloud-messaging/topic-messaging
用户(客户端应用)订阅该主题(在您的情况下为appid)。然后你发送一个单一的主题推送,这更容易从一个appengine前端实例(限制为30秒响应等)。
我发现这篇博文是完整实现的一个很好的例子,以及如何正确处理可能的错误:
我能看到的唯一问题是从服务器推送记录最多需要30秒。 appengine前端实例也有30秒的限制,所以当它等待GCM推送完成时,servlet本身可以超时。解决这个问题的一种方法是从taskqueue发送推送,这将给你60秒的urlfetch调用(我认为该限制也适用于任何api调用):https://cloud.google.com/appengine/docs/java/urlfetch/