实时技术对比:SSE vs WebSocket vs Long Polling

早期网站仅展示静态内容,而如今我们更期望:实时更新即时聊天通知推送动态仪表盘

那么要如何实现实时的用户体验呢?三大经典技术各显神通:

  • SSE(Server-Sent Events):轻量级单向数据流
  • WebSocket:双向全双工通信
  • Long Polling(长轮询):传统过渡方案

假设目前有三个业务场景,需要实现数据实时更新:

  • 股票交易仪表盘
  • 即时聊天平台
  • 实时新闻推送

面对这些需求,我们应该如何决策选择合适的方案呢?

下面让我们从架构、性能和扩展性角度一起探讨一下。

什么是长轮询?

原理解析

客户端持续询问服务器:

  • • "有更新吗?"
  • • "没有"
  • • "现在呢?"
  • • "还是没有"
  • • "现在呢?"
  • • "有了!"

就像在吃饭排队叫号的时候,站在店门口每隔5分钟询问是否到你一样,效率低下。

Spring Boot实现(长轮询式REST端点):

@GetMapping("/updates")
public ResponseEntity<String> getUpdate() {// 模拟延迟或等待事件return ResponseEntity.ok("最新更新!");
}

优点:

  • • 实现简单(标准REST)
  • • 兼容性最佳

缺点:

  • • 高延迟
  • • 资源浪费(大量空请求)
  • • 扩展性差

适用场景

无法使用WebSocket或SSE且需要支持老旧浏览器或代理时使用,一般常见于大型企业的遗留系统中使用。

什么是SSE?

原理解析

客户端建立连接后:

  • • "持续监听中..."
  • • 服务器随时推送:
  • • "新事件1"
  • • "新事件2"
  • • "连接保持"

仅支持服务器到客户端的单向通信,适合实时数据流。

Spring Boot实现(SSE端点):

@GetMapping("/stream")
public SseEmitter stream() {SseEmitter emitter = new SseEmitter();// 异步推送更新emitter.send("实时更新!");return emitter;
}

优点:

  • • 轻量(基于HTTP/1.1)
  • • 兼容多数代理
  • • 自动重连机制

缺点:

  • • 单向通信
  • • 部分环境支持有限
  • • 控制粒度较粗

适用场景

需要简单高效的服务器到客户端更新(如:股票行情、实时比分、状态仪表盘、监控系统等)。

什么是WebSocket?

原理解析

建立双向通道实现实时对话:

  • • 服务器:"Bob有新消息"
  • • 客户端:"收到!...."

类似对讲机的全双工通信模式。

Spring Boot配置与实现

@Configuration
@EnableWebSocket
publicclassWebSocketConfigimplementsWebSocketConfigurer {publicvoidregisterWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(newMyHandler(), "/ws").setAllowedOrigins("*");}
}// 处理器
publicclassMyHandlerextendsTextWebSocketHandler {@OverrideprotectedvoidhandleTextMessage(WebSocketSession session, TextMessage message) {session.sendMessage(newTextMessage("回显:" + message.getPayload()));}
}

优点:

  • • 双向通信
  • • 低延迟
  • • 可通过消息中间件扩展

缺点:

  • • 代理兼容性问题
  • • 扩展复杂度高
  • • 需维持长连接

适用场景

适用于聊天室、游戏、协作应用等需要双向交互的场景。

对比小结

最后,结合上面的分析,对于文章开头的业务场景,最终选型方案可以是:

  • 股票交易仪表盘:SSE
  • 即时聊天平台:WebSocket
  • 实时新闻推送(遗留系统):Long Polling

当然,技术选型需因地制宜,具体还是要根据实际场景来选择最优方案!

SSE适用场景总结:

Server-Sent Events(SSE)是一种允许服务端主动向客户端推送实时数据的技术,基于 HTTP 长连接实现,适用于需要单向实时通信的场景。以下是 SSE 服务端的典型应用场景及优势分析:

一、实时数据推送

场景特点:需要服务端主动向客户端发送更新数据,客户端被动接收(单向通信)。
典型场景
 

  1. 股票行情 / 金融数据
    • 服务端实时获取股票价格、交易数据等,主动推送给前端展示,避免客户端频繁轮询消耗资源。
    • 优势:低延迟、轻量级(相比 WebSocket 更简单,适合单向数据)。
  1. 新闻 / 动态更新
    • 社交媒体、资讯平台实时推送新消息、公告或用户动态,如微博热搜更新、头条新闻推送。
  1. 监控与仪表盘
    • 服务器状态监控、工业设备传感器数据(如温度、压力)实时展示,运维人员通过仪表盘实时查看异常告警。

二、通知与消息系统

场景特点:需要即时通知用户,无需用户主动请求。
典型场景


 

  1. 即时通信(IM)通知
    • 邮件、短信、站内信的新消息提醒(如微信新消息通知),服务端主动推送通知内容至客户端。
  1. 订单状态更新
    • 电商平台中,订单支付成功、发货、物流状态变更时,服务端实时通知用户客户端或商家后台。
  1. 系统告警
    • 服务器故障、网络异常、安全事件等告警信息,第一时间推送给运维人员的监控终端。

三、实时协作与多人互动

场景特点:多人协同操作时,需要实时同步状态。
典型场景


 

  1. 在线文档协作
    • 类似 Google Docs、飞书文档的多人编辑场景,用户 A 修改内容后,服务端主动将变更推送给其他协作用户 B、C,实现实时同步。
  1. 实时投票 / 问答互动
    • 在线会议、直播中的投票结果实时展示,或答题系统中实时更新用户排名和答案统计。
  1. 游戏实时状态
    • 轻量级多人游戏(如网页端卡牌游戏、实时对战游戏)中,服务端推送玩家动作、游戏状态变更等数据。

四、日志与审计追踪

场景特点:需要实时记录和展示操作日志,供审计或监控使用。
典型场景


 

  1. 后台管理系统日志监控
    • 管理员在后台查看实时操作日志(如用户登录记录、数据修改记录),服务端主动推送新日志条目。
  1. 金融交易审计
    • 银行、证券等系统中,实时记录并推送交易日志,供合规部门审计或风控系统分析。

五、事件驱动的异步处理反馈

场景特点:客户端发起异步请求后,服务端处理完成后主动返回结果。
典型场景


 

  1. 文件上传 / 处理结果通知
    • 用户上传大文件后,服务端在文件处理完成(如转码、压缩)后,通过 SSE 推送处理结果(成功 / 失败)及文件访问地址。
  1. 长任务状态查询
    • 批量数据导入、复杂计算任务(如报表生成)的进度更新,服务端主动推送任务完成百分比或状态信息。

六、与 WebSocket 的对比及适用选择

维度

SSE

WebSocket

协议

基于 HTTP,单向通信(服务端→客户端)

独立协议,双向通信(全双工)

复杂度

实现简单,服务端无需处理客户端请求

需要处理双向消息,复杂度较高

兼容性

主流浏览器原生支持(无需额外库)

需要 JavaScript 库或框架支持

流量消耗

轻量级,数据格式简单(文本流)

可传输二进制数据,适合高频通信

典型场景

单向实时推送(如新闻、通知)

双向互动(如聊天、游戏、实时协作)


 

选择建议


 

  • 若只需单向推送,优先选 SSE(开发成本低、兼容性好)。
  • 若需要双向通信(如聊天、控制指令),选 WebSocket。

七、SSE 的优势与局限

优势

  • 简单易用:基于 HTTP,服务端实现难度低,客户端通过原生EventSource API 即可接入。
  • 低延迟:长连接保持,避免轮询的 “请求 - 响应” 延迟。
  • 节省资源:相比轮询减少 HTTP 请求次数,降低服务端压力。
     

局限

  • 单向通信:无法支持客户端主动向服务端发送消息(需配合其他机制,如独立 HTTP 接口)。
  • 浏览器限制:不支持跨域(需服务端配置Access-Control-Allow-Origin),且无法在 Node.js 等非浏览器环境中使用。

总结

SSE 服务端适用于单向实时数据推送场景,如实时通知、状态更新、日志监控等。其轻量级、低复杂度的特性使其成为替代轮询的高效方案,尤其适合不需要双向通信的业务场景。在实际开发中,可结合 Spring Boot、Node.js 等框架快速实现,配合客户端EventSource完成实时通信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/85021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【前端】es6新特性全解

第一章 简介 1.1 ES6概述 1.1.1 ES6定义与发展历程 1. ES6 定义 ES6 全称 ECMAScript 6.0&#xff0c;它是 JavaScript 语言的下一代标准&#xff0c;对 JavaScript 语言进行了许多增强和扩展&#xff0c;带来了更简洁、更强大的语法特性。可以把 ES6 想象成是 JavaScript …

nlp中的频率就是权重吗

&#x1f522; 一、“频率”是什么&#xff1f; 在 NLP 中&#xff0c;**词频&#xff08;frequency&#xff09;**通常指的是&#xff1a; 某个单词或 token 在语料库中出现的次数&#xff08;或比例&#xff09; 举例&#xff1a; "The cat sat on the mat. The cat i…

多模态大语言模型arxiv论文略读(九十八)

Accelerating Pre-training of Multimodal LLMs via Chain-of-Sight ➡️ 论文标题&#xff1a;Accelerating Pre-training of Multimodal LLMs via Chain-of-Sight ➡️ 论文作者&#xff1a;Ziyuan Huang, Kaixiang Ji, Biao Gong, Zhiwu Qing, Qinglong Zhang, Kecheng Zhe…

WEB安全--RCE--webshell HIDS bypass4

继WEB安全--RCE--webshell HIDS bypass3的补充&#xff1a; 十三、时间开关 webshell&#xff1a; <?php ini_set("display_errors",1); function foo($test, $bar FSYSTEM) {echo $test . $bar; } $function new ReflectionFunction(foo); $q new ParseEr…

.NET 7 AOT 使用及 .NET 与 Go 语言互操作详解

.NET 7 AOT 使用及 .NET 与 Go 语言互操作详解 目录 .NET 7 AOT 使用及 .NET 与 Go 语言互操作详解 一、背景与技术概述 1.1 AOT 编译技术简介 1.2 Go 语言与 .NET 的互补性 二、.NET 7 AOT 编译实践 2.1 环境准备 2.2 创建 AOT 项目 2.3 AOT 编译流程 2.4 调试信息处…

机器人--里程计

教程 轮式里程计视频讲解 里程计分类 ros--odometry 什么是里程计 里程计是一种利用从移动传感器获得的数据来估计物体位置随时间的变化而改变的方法。该方法被用在许多机器人系统来估计机器人相对于初始位置移动的距离。 注意&#xff1a;里程计是一套算法&#xff0c;不…

云原生时代 Kafka 深度实践:02快速上手与环境搭建

2.1 本地开发环境搭建 单机模式安装 下载与解压&#xff1a;前往Apache Kafka 官网&#xff0c;下载最新稳定版本的 Kafka 二进制包&#xff08;如kafka_2.13-3.6.0.tgz&#xff0c;其中2.13为 Scala 版本&#xff09;。解压到本地目录&#xff0c;例如/opt/kafka&#xff1a…

Vue Hook Store 设计模式最佳实践指南

Vue Hook Store 设计模式最佳实践指南 一、引言 在 Vue 3 组合式 API 与 TypeScript 普及的背景下&#xff0c;Hook Store 设计模式应运而生&#xff0c;它结合了 Vue 组合式 API 的灵活性与状态管理的最佳实践&#xff0c;为开发者提供了一种轻量级、可测试且易于维护的状态…

无人机多人协同控制技术解析

一、运行方式 无人机多人点对点控制通常采用以下两种模式&#xff1a; 1. 主从控制模式 指定一个主控用户拥有最高优先级&#xff0c;负责飞行路径规划、紧急操作等关键指令&#xff1b;其他用户作为观察者&#xff0c;仅能查看实时画面或提交辅助指令&#xff0c;需经主…

树型表查询方法 —— SQL递归

目录 引言&#xff1a; 自链接查询&#xff1a; 递归查询&#xff1a; 编写service接口实现&#xff1a; 引言&#xff1a; 看下图&#xff0c;这是 course_category 课程分类表的结构&#xff1a; 这张表是一个树型结构&#xff0c;通过父结点id将各元素组成一个树。 我…

微服务难题?Nacos服务发现来救场

文章目录 前言1.什么是服务发现2.Nacos 闪亮登场2.1 服务注册2.2 服务发现 3.Nacos 的优势3.1 简单易用3.2 高可用3.3 动态配置 4.实战演练4.1安装 Nacos4.2 服务注册与发现示例代码&#xff08;以 Spring Boot 为例&#xff09; 总结 前言 大家好&#xff0c;我是沛哥儿。今天…

AStar低代码平台-脚本调用C#方法

修改报工表表单&#xff0c;右键定义弹出菜单&#xff0c;新增一个菜单项&#xff0c;并在点击事件脚本中编写调用脚本。 编译脚本&#xff0c;然后在模块代码里面定义这个方法&#xff1a; public async Task<int> on_call_import(DataRow curRow) {PrintDataRow(cur…

python调用langchain实现RAG

一、安装langchain 安装依赖 python -m venv env.\env\Scripts\activatepip3 install langchainpip3 install langchain-corepip3 install langchain-openaipip3 install langchain-communitypip3 install dashscopepip3 install langchain_postgrespip3 install "psyc…

大学大模型教学:基于NC数据的全球气象可视化解决方案

引言 气象数据通常以NetCDF(Network Common Data Form)格式存储,这是一种广泛应用于科学数据存储的二进制文件格式。在大学气象学及相关专业的教学中,掌握如何读取、处理和可视化NC数据是一项重要技能。本文将详细介绍基于Python的NC数据处理与可视化解决方案,包含完整的代…

ORB-SLAM2学习笔记:ComputeKeyPointsOctTree分析过程记录

ComputeKeyPointsOctTree是ORB特征提取器中计算关键点的部分&#xff0c;特别是使用八叉树&#xff08;OctTree&#xff09;方法进行关键点分布。 首先&#xff0c;函数参数是vector<vector的引用allKeypoints&#xff0c;用来存储各层的关键点。代码开头调整了allKeypoint…

LeetCode Hot100(多维动态规划)

62. 不同路径 比较板子的dp&#xff0c;实际上就是到达一个点有两种方式&#xff0c;从上面来或者是左边&#xff0c;加起来就可以了 class Solution {public int uniquePaths(int m, int n) {int [][]arr new int[m2][n2];arr[1][1]1;for(int i1;i<m;i){for(int j1;j<…

Oracle MOVE ONLINE 实现原理

Oracle MOVE ONLINE 实现原理 Oracle 的 MOVE ONLINE 操作是一种在线重组表的技术&#xff0c;允许在不中断业务的情况下重新组织表数据。以下是其实现原理的详细分析&#xff1a; 基本概念 MOVE ONLINE 是 Oracle 12c 引入的特性&#xff0c;用于替代传统的 ALTER TABLE ..…

工作流长任务处置方案

以下是前后端协作处理长任务工作流的完整实现方案&#xff0c;结合技术选型与设计要点&#xff0c;以清晰结构呈现&#xff1a; 一、后端实现方案 异步任务队列架构 • 技术选型&#xff1a; ◦ 消息队列&#xff1a;NATS&#xff08;轻量级&#xff09;或 RabbitMQ&#xf…

RabbitMQ仲裁队列高可用架构解析

#作者&#xff1a;闫乾苓 文章目录 概述工作原理1.节点之间的交互2.消息复制3.共识机制4.选举领导者5.消息持久化6.自动故障转移 集群环境节点管理仲裁队列增加集群节点重新平衡仲裁队列leader所在节点仲裁队列减少集群节点 副本管理add_member 在给定节点上添加仲裁队列成员&…

fingerprint2浏览器指纹使用记录

我在uniapp-vue3-H5端使用的&#xff0c;记录一下 抄的这里前端使用fingerprintjs2获取浏览器指纹fingerprintjs2是通过设备浏览器信息获取浏览器指纹的插件&#xff08; - 掘金 1、安装依赖 npm i fingerprintjs2 -S2、抽成模块文件&#xff0c;/utils/Fingerprint2.js 生成指…