1

我已经将客户端登录到我的基于 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,您有什么更好的想法吗?

4

1 回答 1

1

这是一个老问题:您可以进行轮询或推送:

  1. 轮询:这就是您在上面的 1 和 2 中所做的。我建议您将两者合并:使用 memcache 并将适当的对象放入 memcache 即使用户没有新数据,在这种情况下您可以涵盖所有三种情况(1.没有数据,2.没有新数据,3.新数据),同时仍然使用内存缓存来最小化成本。

  2. 推送数据 - 这是一种首选方式,因为它可以最大限度地降低成本并立即通知用户新数据。使用 Channel API - 这是一个 GWT 包装器:gwt-gae-channel.

于 2012-11-26T11:41:26.227 回答