我写了一个网页,里面有一个用户评论区
任何经过身份验证的用户都可以发表评论。
由于许多用户几乎可以同时发布评论,我希望评论列表能够自动刷新。因此,我考虑使用WebSockets。
我的想法是关于这个用例的一个好/最佳实践:
-
一旦发布了评论,WebSockets进程是否应该读取数据库上的当前评论列表,并发送包含所有新评论的Json响应?这将允许客户端直接在DOM(JS)上附加新的注释
或者WebSocket应该只检查数据库(例如,如果使用消息队列(Redis、RabbitMQ等),则进行队列检查),并像这样操作:"嘿,我有新的评论,如果你想查看,请单击此处!"。这个解决方案只会发出新评论的信号,而不会将所有这些评论带到客户端。然后,客户端将涉及检索事件的工作流(例如,通过单击这句话),例如使用传统的Ajax方向:client=>server。 -
用户很有可能发布评论,然后导航到网站的另一个页面。因此,一个包含全新注释的websocket响应将是无用的。然后,一个简单的通知就可以了,就像大多数已知网站所做的那样,例如使用"+1"计数器或与"评论"场景更相关的计数器:"1条新评论可用"。
我应该选择哪条路?
我认为决定推送哪些数据主要是UI可用性/用户体验的问题,而不是使用哪些技术与服务器交互。我们应该避免用服务器推送的数据更改UI,这会给用户带来负面的惊喜,例如,在没有任何干预的情况下,评论源不断增长。
但在实时图表的情况下,最好将数据直接推送到图表中,这将是用户的期望。
在评论提要的情况下,大多数网站采用"点击加载"方法的原因是因为用户体验,所以我认为这可能是最好的方法。
我使用两者的组合。。。。
在某些页面中,websocket通信包含实际数据——有点像股票行情更新。
在其他情况下,websocket通信只是说——所有查看xyz数据的用户——刷新它。然后浏览器执行ajax来获得新数据,网格被智能地刷新,这样屏幕上只有更改的单元格才能使用innerHTML修改,新行被添加,删除的行被删除。
在像stackoverflow这样的情况下,显示一条消息是有意义的,"有新东西要显示——想看吗?"
当我在浏览器中建立websocket时,我会在url中传递页面Id,cookie也会被传递。所以websocket服务器知道——用户cookie和正在查看的页面。
然后,在数据库(或中间层逻辑)中,通过以下消息与websocket服务器通信:此消息适用于查看"xyz"页面的用户:智能刷新网格"abc"。并且websocket服务器广播消息。
因为协议允许你传递任何你喜欢的东西,所以你有能力随心所欲地传递。
我建议它在每种特定情况下都要做最好的事情。