如何处理这种典型的WebSocket使用情况?

时间:2014-04-13 16:34:26

标签: javascript html5 architecture websocket socket.io

我写了一个网页,其中有一个区域供用户评论 任何经过身份验证的用户都可以发表评论。

由于许多用户几乎可以同时发布评论,我希望评论列表能够自动刷新。 因此,我考虑使用 WebSockets

我的想法是关于这个用例的好/最佳实践:

  1. 发布评论后,WebSockets流程是否应该读取数据库上的当前评论列表并发送包含所有新评论的Json响应?这将允许客户端直接在DOM(JS)上附加新注释 或者WebSocket应该只检查数据库(或队列,如果使用消息队列(例如Redis,RabbitMQ等))并且行为如下:"嘿,我有新的评论,如果你想看到它们点击这里!&#34 ;.该解决方案仅表示存在新评论,而不会将所有这些评论带给客户。然后,客户端(例如通过点击该句子)涉及检索事件的工作流程,例如使用传统的Ajax方向:client =>服务器

  2. 用户很可能发布评论,然后导航到网站的其他页面。因此,包含全新注释的websocket响应将是无用的。然后可以进行简单的通知,因为大多数已知网站例如使用" + 1"与#34;评论相关或更相关的评论"场景:" 1条新评论"。

  3. 我应该选择哪种方式?

2 个答案:

答案 0 :(得分:2)

我认为决定推送哪些数据主要是UI可用性/用户体验问题,而不是使用哪种技术与服务器进行交互。我们应该避免使用服务器推送数据更改用户界面,以一种让用户以负面方式感到惊讶的方式,例如让评论提要不断增长,而不需要他的任何干预。

但是在实时图表的情况下,最好将数据直接推送到图表中,这可能是用户期望的。

在评论供稿的情况下,大多数网站采用“点击加载”方法的原因是因为用户体验,所以我认为这可能是最好的方法。

答案 1 :(得分:1)

我使用两者的组合......

在某些页面中,websocket通信包含实际数据 - 有点像股票代码更新。

在其他情况下,websocket通信只是说 - 查看xyz数据的所有用户 - 刷新它。然后浏览器执行ajax以获取新数据,并且智能刷新网格,使用innerHTML仅在屏幕上修改更改的单元格,并添加新行并删除删除的行。

在像stackoverflow这样的情况下,显示一条消息是有意义的,"要显示新内容 - 想要看到它?"

当我在浏览器中建立websocket时,我在网址中传递了一个页面ID,并且也传递了cookie。因此,websocket服务器知道 - 用户cookie和正在查看的页面。

然后在数据库(或中间层逻辑)中与websocket服务器通信,例如:此消息供用户查看' xyz'页面:巧妙地刷新网格' abc'。 websocket服务器广播消息。

因为协议允许您传递任何您喜欢的内容,所以无论如何您都可以使用它。

我建议在每种特殊情况下做最好的事情。