Server-sent Events(SSE)和长轮询的比较及其优缺点

什么是Server-sent Events和长轮询

Server-Sent Events (SSE) 是 HTML5 的一部分,旨在允许浏览器通过普通 HTTP 连接从服务器接收自动更新。 SSE 与 WebSocket 不同,WebSocket 属于一个完整的双向通信协议,而 SSE 只允许服务器向客户端发送数据。

长轮询是指客户端向服务器发起一个请求,服务器不会立即返回结果,而是等待结果有所变化时才返回。一旦服务器返回结果,客户端就会立即再次发起请求,周而复始地不停轮询。

Server-sent Events与长轮询的对比

SSE的优点:

  1. 实时性更强。SSE 是基于 HTTP 协议的通信方式,利用消息推送,实现即时更新。
  2. 更流畅地嵌套于已有的 Web 技术,如CSS和JavaScript。
  3. SSE 可以在客户端设置重连和自定义时间间隔,增强了对网络控制的能力。
  4. 不需要像 WebSocket 需要完整的协议交互,扩展更加简单。

SSE的缺点:

  1. SSE 通信协议,需要浏览器端支持 EventSource 类。
  2. SSE 协议要求在服务端保持长时间的连接,增加了服务器端支持的维护成本。

长轮询的优点:

  1. 能够应用于所有的浏览器,因为它是基于 XMLHttpRequest。
  2. 能够向后兼容旧版本的浏览器。
  3. 由于客户端会不断请求,可以避免因负载过大导致服务器崩溃的问题。
  4. 服务器端不需要维持一个长连接,降低了服务器端需要处理连接数的问题。

长轮询的缺点:

  1. 效率偏低。由于需要不停地轮询,相当一部分请求都是没有意义的。
  2. 每次请求都包含 HTTP头文件,太浪费带宽。
  3. 服务端可以“看”到每个请求,从而知道客户端的状态,容易造成安全问题。

Server-sent Events与长轮询的应用

SSE的代码示例:

在 HTML 中引入 EventSource 的 JS 库并建立连接:

--------
--- ------ - --- ------------------------------

---------------------------------- ----------- -
    --------------------
-- -------
---------

服务端的 Node.js 示例:

--- ---- - ----------------

------------------------------- ---- -
    ----------------------------- ---------------------
    ------------------------------ ------------
    --------------------------- --------------

    ---------------------- -
        ---------------- - - ---------- - --------
    -- ------

----------------

------------------- ------- -- -------------------------

长轮询的代码示例:

Javascript 代码:

--------- -------
    -------- ---- --------- -------- ---------------
        -------- 
    -- --------- ------- -------------- -------- ----- ---
-----

服务端的 Node.js 示例:

--- ---- - ----------------

------------------------------- ---- -
    -- -------- --- ----------- -
        --------------------- - -- ------
            ------------------------
                ----- --- ----------------
            ----
        -- ------
    - ---- -
        -------------
    -
----------------

------------------- ------- -- -------------------------

总结

对于需要实时性的应用来说,Server-sent Events 的效率较好,但服务器端需要开启长连接,增加了维护的成本。长轮询虽然效率偏低,但却能适用于所有的浏览器,并且不需要维持长连接。因此,在实际使用过程中,需要根据实际的应用场景进行选择。

学习和指导意义

两种技术各有其适用场景和优缺点,在实际开发中需要根据实际情况进行技术选择。在选择技术时要权衡优缺点,避免将技术的使用推向极端,造成不必要的问题。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/64e80a76f6b2d6eab3373d0b


猜你喜欢

  • CSS Grid 框架教程: 网格,项目和单位

    CSS Grid 是一个新的布局模块,它为我们提供了一种更简单、更灵活的方式来布置网页的元素。CSS Grid 框架允许我们在网格中设置行和列,以及在每个网格中创建多个项目。

    1 年前
  • 使用 Jest 测试 JavaScript 中的类的方法及注意事项

    在前端开发中,JavaScript 类是常见的数据结构,通过类,我们可以给代码组织提供更好的方式。但是编写好的类并不意味着它一定是正确的,在这种情况下,测试非常重要。

    1 年前
  • 如何在 Java 应用中实现高性能 IO 编程

    如何在 Java 应用中实现高性能 IO 编程 在 Java 应用中,IO(输入输出)操作是必不可少的一部分,它通常涉及网络连接、文件读写以及输入输出流处理等等。IO 操作是应用程序中重要的瓶颈之一,...

    1 年前
  • 优雅地处理 JavaScript 循环 ——ECMAScript 2021 (ES12) 中的 for await...of 循环

    引言 JavaScript 是现代 Web 开发的常用语言,处理循环操作是 Web 前端开发不可或缺的一部分。JavaScript 中常用的循环机制有 for 循环、while 循环和 do-whil...

    1 年前
  • 如何在 Express.js 中使用 Sequelize ORM

    前言:在 Web 开发中,ORM 对于数据库操作非常重要,使得开发者可以更加灵活地处理数据。本文将介绍如何在 Express.js 中使用 Sequelize ORM,以及一些常用的操作。

    1 年前
  • 如何在 Mocha 中测试 WebSocket

    WebSocket 是一种在 Web 应用程序中实现双向通信的协议,它允许服务器和客户端之间进行实时交互和通信。使用 WebSocket 可以使 Web 应用程序变得更加动态和即时化。

    1 年前
  • 使用 Babel 编译 ES6 代码时如何支持 Custom Plugin

    前言 在现代前端开发中,一些新的 ECMAScript 语言特性已经成为我们日常开发中使用的标配。而 ES6 是最受欢迎的 JavaScript 版本之一,它引入了许多新的特性和语法,例如箭头函数,解...

    1 年前
  • 利用 Redis+Flask 实现高并发 Web 系统的技术指南

    随着互联网的快速发展,现今的 Web 应用已经不再是以前简单的信息展示网站,而是以社交、游戏、金融等为主的高并发互动性网站。为了应对这种高并发的情况,我们需要使用一些先进的技术来提高 Web 系统的性...

    1 年前
  • MongoDB 性能监控工具介绍

    MongoDB 是当前非常流行的 NoSQL 数据库之一。作为一种高性能、易扩展的数据库,MongoDB 越来越受到前端工程师们的关注,并逐渐成为了前端应用中常用的数据存储方式。

    1 年前
  • Cypress 如何测试 vue-router 中的路由

    前言 在前端开发中,我们经常会用到 vue-router 来进行路由跳转。但是,如何对这些路由进行测试呢?在这里,我们将介绍如何通过使用 Cypress 来测试 vue-router 中的路由。

    1 年前
  • Mongoose 中使用 aggregate 方法进行数据统计

    在 Node.js 中,Mongoose 是一款非常流行的 MongoDB 数据库 ORM 框架。它让我们可以非常方便地操作 MongoDB 数据库,并且提供了丰富的 API。

    1 年前
  • Enzyme 浅渲染组件时如何模拟 context 传递

    Enzyme 浅渲染组件时如何模拟 context 传递 在 React 中,context 是一种通用的数据传递方式,可以把数据从组件树的顶层传递到底层的组件,避免 props 层层传递的繁琐。

    1 年前
  • 使用 Server-sent Events(SSE)实现即时通讯服务

    介绍 Server-sent Events(SSE)是 HTML5 中的一项功能,它允许从服务器的推送事件到客户端,建立一种单向的、持久性的连接。相较于 WebSocket 和 AJAX,SSE 更加...

    1 年前
  • RxJS 中的 flatMap 和 switchMap 操作符使用技巧

    RxJS 是一种用于处理异步数据流的库,它可以帮助我们将异步数据流以响应式编程的思想组织起来。在 RxJS 中,flatMap 和 switchMap 是两个非常有用的操作符,它们可以将一个Obser...

    1 年前
  • 解决 Serverless 框架中访问 S3 权限不足导致函数调用失败的问题

    背景 在开发基于 Serverless 框架的应用时,我们经常需要访问 AWS S3 存储桶的数据。例如,我们可能需要读取、写入或删除在 S3 中存储的文件。然而,由于 S3 的访问控制非常复杂,如果...

    1 年前
  • Hapi.js 和 Express.js 的区别与使用场景

    前言 在 Web 开发领域,Node.js 看似统领一切,因为其异步 I/O、事件驱动等特性使得它解决了并发性的问题。然而,如果你想开发完整的 Web 应用程序,那么你需要一些额外的框架和工具来完成任...

    1 年前
  • 如何使用 Deno 实现可插拔的架构

    前言 可插拔的架构是面向接口编程思想的一种体现,可以使系统更灵活、更可扩展、更易于维护。传统的服务端语言如Java、Python等都有支持可插拔的实现,如Java的SPI、Python的setupto...

    1 年前
  • React Hooks 详解 —— useReducer

    React Hooks 是 React 16.8 中引入的新特性,它可以使函数组件中实现类似于 class 组件中的状态管理和生命周期函数,以及其他一些特性。其中,useReducer 是 React...

    1 年前
  • RESTful API 接口文档生成工具与实践推荐

    什么是 RESTful API? RESTful API(Representational State Transfer Application Programming Interface)是一种基于...

    1 年前
  • 使用 Babel 编译 ES6 代码时如何支持按需加载 CSS

    随着前端开发技术的不断发展,越来越多的开发人员开始关注如何更加高效的编写代码。其中,ES6 和 CSS 按需加载无疑是其中最为关键和受瞩目的技术之一。 在使用 Babel 编译 ES6 代码时,一般需...

    1 年前

相关推荐

    暂无文章