如何通知会话有关数据更改。异步通信

时间:2012-11-26 10:27:58

标签: google-app-engine

我已登录客户端登录到基于GAE的应用程序,等待一些信息(GWT应用程序,如果它有任何区别)。 我还有servlet接收REST数据,将其保存到数据存储区。信息发送给特定客户。 我的目标是将接收servlet的通知传递给用户会话的servlet。 我的数据传递时间限制为60秒,1k用户/天,单个浏览器会话1小时,每个会话5个通知。

我考虑过以下几种情况:

用户客户端请求数据每60秒,然后查询数据存储区以获取新数据。

这种方法简直糟糕 - 数据存储能力的巨大浪费(每天数据存储读取操作1000 * 60 * n),处理器时间消耗大,内存占用大。

使用memcache传递通知

Receiver将通知发送到memcache,客户端检查它,以便成功读取数据存储区。 一切都没问题,只有一个例外 - 文档说“你不能信任memcache”,所以如果memcache中没有任何内容我也必须检查数据存储区。在这种效果中,我有一个更复杂的解决方案,具有更高的内存/处理器占用空间。

队列

几乎很好的解决方案 - 我只需要将消息放入管道,在另一侧读取它。在这种特殊情况下,我必须每天创建1k队列,远远超出配额,或者在队列中使用标签,当文档说“实验,将来可以改变等”时使用“实验”服务作为我的应用程序的重要部分并不会让我感到高兴。

渠道

有点棘手的解决方案。浏览器在连接时打开通道,对于传入数据,接收器servlet只是将通知放入通道,通知的Web客户端调用它自己的servlet来从数据存储区刷新数据。 我不喜欢这种方法是通信线 - 通过Web客户端的servlet-servlet通知可能不是最好的。

对于GAE云中从一个servlet到另一个servlet的传递通知,您有什么更好的想法吗?

1 个答案:

答案 0 :(得分:1)

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

  1. 轮询:这是您在上面的1& 2中​​所做的事情。我建议你合并两个:使用memcache并在memcache中放入适当的对象,即使用户没有新数据,在这种情况下你可以涵盖所有三种情况(1.没有数据全部,2。没有新数据,3。新数据),同时仍然使用memcache来降低成本。

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

相关问题