Web提醒服务的四种实现方式比较

来源:互联网 发布:mysql可视化面板 编辑:程序博客网 时间:2024/05/10 23:07

很多的大型Web系统中都有一个可以提醒用户的功能。

提醒的消息自然是越新鲜越实时越好。

对此,不同的系统采用不同的策略。

  • 刷新。当刷新页面的时候查询新的消息。
    当用户长期停留在一个页面的情况(以SPA为极端情况)下,这种刷新的操作就会使得消息的新鲜度受损。但总体来说,方便实现,且开销不大。用户在一个页面上停留的时间越短,这种策略就越好。

  • 短轮询。定期发送一个Ajax请求到服务器检查新的消息。
    设置一个周期(如1秒)向服务器发送一个异步请求检查是否存在新的消息。周期越短,开销越大;周期越长,新鲜度越低。要视具体情况权衡周期,通常周期的设置可以有 1秒、10秒、1分钟等,周期不会过长。

  • 长轮询。与服务器建立长连接,用chunk流不断发送信息。
    在一开始传数据(通常是指HTML)的时候,服务器设置类型为chunk,不告诉客户端这个数据具体有多少,因此客户端与服务器会保持持久的连接,会接受服务器持续发送的数据。这种情况可以想象看网络视频的时候,一个缓冲流的状态。优点是没有多余浪费的网络I/O资源(相比于短轮询),拥有真正的实时性。缺点是这个流不容易操控,操作起来不自然;客户端只能被动接受服务器的数据,如果要与服务器对话又要借助Ajax。

  • 套接字。与服务器建立套接字,实时全双工的TCP协议的应用。
    自H5技术中WebSocket的出现,彻底取代轮询的方案就已经出现。首先套接字也是建立一个长连接,但它的通讯协议就是ws,与http不是同一个协议,但它们都基于TCP。WebSocket可以用JavaScript直接操作,实时可读可写,相当于与服务器建立了一个新的实时对话通道。节约了短轮询的I/O浪费,又使得长轮询的编程复杂度下降。总体完爆轮询,是现代提醒服务,以及其他实时应用的不二之选。

说起来长轮询本质上是用HTTP模拟套接字,但用HTTP会有若干别扭之处。这些都在WebSocket出现之后迎刃而解。

0 0