2

我有一个用例,我想知道 HTML5 的 Server-sent-Events 是否适合。

多个客户端(Javascript+HTML5 浏览器)连接到 Web 服务器(带有 Java EE 后端)。每个客户都可以随时查看不同的视图,具体取决于他们感兴趣的对象。

我的问题是:如何使多个客户端(在不同的视图上)在服务器端发生的更新上保持最新,而不用所有视图上的所有更新来淹没所有客户端?

我需要考虑的要点是:

  1. 许多客户可能对相同的事件感兴趣。如果两个客户端正在查看相同的视图,它们必须获得相同的事件。
  2. 要发送到客户端的事件取决于客户端当前所在的视图。
  3. 一些客户可能对任何事件都不感兴趣(即他们可能正在查看静态数据)
  4. 给定的客户可能会动态地改变他们的兴趣。例如:关闭 View1 并打开 View2。
  5. 客户可能对多个事件通道感兴趣(例如:两个动态变化的视图可能是单个页面的一部分)。
  6. 我只能针对完全支持 SSE 的浏览器。
  7. 任何时候最多只有 100 个客户端(浏览器)连接到服务器。因此,我可以奢侈地为每个客户端打开多个连接(对于 SSE)。

我已经在 SO/Google 上搜索了 SSE,但(还)无法获得生产质量软件的可靠解决方案。在充分探索 SSE 之前,我不想回到旧的 Comet 技术。

SSE(本身)是否能够满足这些要求?我现在正在研究 Atmosphere,但在决定 SSE 本身不够用之前,我不想求助于一些模仿 SSE 的 polyfill。

如果这是不可能的,我打算做什么:
服务器可以向所有客户端广播所有事件并让客户端弄清楚。这意味着从服务器到客户端的大量不必要的流量和复杂的客户端代码。

4

2 回答 2

2

除非您可以针对一组特定的最新浏览器,否则您将始终必须支持某种回退。Atmosphere看起来是一个很好的解决方案。

至于向正确的客户发送正确的事件:在 Session 对象(检查 Atmosphere 是否配置为支持会话)或您自己的 Map 中跟踪客户及其偏好。看起来您可以在 Atmosphere 中创建多个会话广播器,如下所述:http: //blog.javaforge.net/post/32659151672/atmosphere-per-session-broadcaster

免责声明:我自己从未使用过这个。

于 2013-03-30T07:33:11.260 回答
0

您可以做的是在注册事件时通过 GET 发送参数EventSource。唯一的问题在于第 4 点,您应该为此关闭连接并重新注册事件。

我自己试过了,效果很好。

于 2013-06-18T10:01:25.377 回答