我已经将客户端登录到我的基于 GAE 的应用程序中,等待一些信息(GWT 应用程序,如果它有任何不同的话)。我还有 servlet 接收 REST 数据,将其保存到数据存储区。信息是针对特定客户的。我的目标是将接收 servlet 的通知传递给用户会话的 servlet。我的数据传递时间限制是 60 秒,1k 用户/天,单个浏览器会话 1 小时,每个会话 5 个通知。
我考虑过以下场景:
用户客户端每 60 秒请求一次数据,然后查询数据存储以获取新数据。
这种方法很糟糕 - 数据存储能力的巨大浪费(每天 1000*60*n 的数据存储读取操作)、大量处理器时间消耗和大量内存占用。
使用 memcache 传递通知
Receiver 将通知放入 memcache,客户端对其进行检查,如果成功则读取数据存储。一切都会好的,除了一个例外 - 文档说“你不能信任内存缓存”,所以如果内存缓存中没有任何内容,我还必须检查数据存储。实际上,我有一个更复杂的解决方案,具有更高的内存/处理器占用空间。
队列
几乎很好的解决方案 - 我只需要将消息放入管道,然后在另一边阅读。在这种特殊情况下,我必须每天创建 1k 个队列,远远超出配额,或者在队列中使用标签,当文档说“实验性,将来可以改变等”时。使用“实验性”服务作为我的应用程序的重要部分并不能让我开心。
频道
有点棘手的解决方案。浏览器在连接时打开通道,接收器 servlet 在传入数据时只是将通知放入通道中,被通知的 Web 客户端调用它自己的 servlet 以从数据存储中刷新数据。我不喜欢这种方法的是通信线路——通过 Web 客户端的 servlet-servlet 通知可能不是最好的方法。
对于在 GAE 云中将通知从一个 servlet 传递到另一个 servlet,您有什么更好的想法吗?