当前位置: 首页 > article >正文

实时技术对比: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完成实时通信。

相关文章:

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

早期网站仅展示静态内容&#xff0c;而如今我们更期望&#xff1a;实时更新、即时聊天、通知推送和动态仪表盘。 那么要如何实现实时的用户体验呢&#xff1f;三大经典技术各显神通&#xff1a; • SSE&#xff08;Server-Sent Events&#xff09;&#xff1a;轻量级单向数据…...

js 手写promise

const PENDING pending; const FULFILLED fulfilled; const REJECTED rejected;class MyPromise {#status PENDING;#result undefined;#handler undefined;constructor(executor) {// 不能写在外面&#xff0c;因为this指向会出问题const resolve (data) > {this.#ch…...

HTTP 与 HTTPS 深度解析:原理、实践与大型项目应用

1. HTTP 与 HTTPS 基础概念 1.1 HTTP&#xff08;超文本传输协议&#xff09; 定义&#xff1a;应用层协议&#xff0c;基于 TCP/IP 通信&#xff0c;默认端口 80 特点&#xff1a; 无状态协议&#xff08;需 Cookie/Session 维护状态&#xff09; 明文传输&#xff08;易被…...

QT6.9中opencv引用路径的其中一种设置

RC_ICONSappimage.ico unix|win32: LIBS -L$$PWD/opencv455/vc15/lib/ -lopencv_world455 INCLUDEPATH $$PWD/opencv455/include DEPENDPATH $$PWD/opencv455/include RC_ICONS为指定图标文件&#xff0c;只写图标名appimage.ico&#xff0c;那么一般和pro文件在同一目录…...

k8s pod启动失败问题排查

1. 查看日志 kubectl describe pod xxx -n xxx kubectl logs podname -n xxx --tail200 2. 镜像 到pod所在主机检查pod所需的镜像是否能成功拉取&#xff08;docker images&#xff09; 3.硬件资源 检查pod所在服务器的磁盘空间是否被占满&#xff08;df -h 和 du -sh /&a…...

Java类中各部分内容的加载执行顺序

目录 1. 静态初始化&#xff08;类加载阶段&#xff09; 示例代码 输出 2. 实例初始化&#xff08;对象创建阶段&#xff09; 详细顺序 示例代码 输出 3. 关键规则总结 4. 注意事项 5. 完整流程图 在Java中&#xff0c;类的实例化过程&#xff08;对象创建&#xff0…...

git提交信息错误,如何修改远程git提交的备注信息

有时候我们在git提交时没有按照规范提交。此时就需要修改远程git提交的备注信息。 一、修改最近几次提交 首先确保当前分支没有未提交的更改 git status使用交互式rebase修改历史记录&#xff08;假设要修改最近3次提交&#xff09; git rebase -i HEAD~3在打开的编辑器中&…...

API Gateway CLI 实操入门笔记(基于 LocalStack)

API Gateway CLI 实操入门笔记&#xff08;基于 LocalStack&#xff09; Categories: Cloud Google Rank Proof: No Last edited time: May 26, 2025 4:18 AM Status: Early draft Tags: aws 主要先简单的走一下流程&#xff0c;熟悉一下在 terminal 操作 API Gateway local…...

基于MATLAB实现SFA(Slow Feature Analysis,慢特征分析)算法

基于MATLAB实现SFA&#xff08;Slow Feature Analysis&#xff0c;慢特征分析&#xff09;算法的代码示例&#xff1a; % SFA慢特征分析 % 需要signal处理工具箱% 生成示例信号 t linspace(0,1,1000); x sin(2*pi*10*t) sin(2*pi*20*t) randn(size(t));% 定义滤波器 b fi…...

数据分析案例-基于红米和华为手机的用户评论分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…...

leetcode617.合并二叉树:递归思想下的树结构融合艺术

一、题目深度解析与核心规则 题目描述 合并两棵二叉树是一个经典的树结构操作问题&#xff0c;题目要求我们将两棵二叉树合并成一棵新二叉树。合并规则如下&#xff1a; 若两棵树的对应节点都存在&#xff0c;则将两个节点的值相加作为新节点的值若其中一棵树的节点存在&…...

深度学习入门:从零搭建你的第一个神经网络

深度学习入门&#xff1a;从零搭建你的第一个神经网络 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 深度学习入门&#xff1a;从零搭建你的第一个神经网络摘要引言第一章&#xff1a;神经网络基础原理1.1 神经元…...

【HTML-13】HTML表格合并技术详解:打造专业数据展示

表格是HTML中展示结构化数据的重要元素&#xff0c;而表格合并则是提升表格表现力的关键技术。本文将全面介绍HTML中的表格合并方法&#xff0c;帮助您创建更专业、更灵活的数据展示界面。 1. 表格合并基础概念 在HTML中&#xff0c;表格合并主要通过两个属性实现&#xff1a…...

鸿蒙OSUniApp 制作自定义的进度条组件#三方框架 #Uniapp

使用 UniApp 制作自定义的进度条组件 在移动应用开发中&#xff0c;进度条是非常常见的 UI 组件&#xff0c;无论是文件上传、下载、任务进度还是表单填写反馈&#xff0c;进度条都能为用户提供直观的进度提示。虽然 UniApp 提供了一些基础的进度条能力&#xff0c;但在实际项…...

【Python办公】Excel简易透视办公小工具

目录 专栏导读1. 背景介绍2. 功能介绍3. 库的安装4. 界面展示5. 使用方法6. 实际应用场景7. 优化方向完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系…...

m1 运行renrenfastvue出现的问题和解决方案

1. chromedriver 报错解决&#xff1a;执行 npm install --ignore-scripts。 2. node-sass 报错 "Node Sass does not yet support your current environment: OS X Unsupported ...": - 降低 Node 版本至 14。 - 安装版本控制工具&#xff1a;sudo npm insta…...

开源模型应用落地-qwen模型小试-Qwen3-8B-推理加速-vLLM-Docker(二)

一、前言 在AI模型部署效率竞争日益激烈的当下,如何将前沿大模型与高效推理框架结合,成为开发者关注的焦点。Qwen3-8B作为阿里云推出的混合推理模型,凭借80亿参数规模与128K超长上下文支持,展现了“快思考”与“慢思考”的协同能力,而vLLM框架则通过优化内存管理与并行计算…...

【C/C++】记录一次麻烦的Kafka+Json体验

文章目录 麻烦的KafkaJson体验1 目标2 工程搭建2.1 docker配置2.2 代码2.3 工程压缩包 3 执行结果 麻烦的KafkaJson体验 1 目标 初心&#xff1a;结合kafka json docker&#xff0c;验证基本的数据生产/消费。 Kafka 配合 JSON 工具&#xff0c;主要是为了数据的序列化和反…...

Linux系列-2 Shell常用命令收集

背景 本文用于收集Linux常用命令(基于Centos7)&#xff0c;是一个持续更新的博客&#xff0c;建议收藏&#xff0c;编写shell时遇到问题可以随时查阅。 1.Shell类型 shell是用C语言编写的程序&#xff0c;作为命令解释器连接着用户和操作系统内核。常见的shell有sh(Bourne She…...

MATLAB使用多个扇形颜色变化表示空间一个点的多种数值

MATLAB使用多个扇形颜色变化表示空间一个点的多种数值 excel中表格中数据格式&#xff0c;多行 lonlatdata1data2data3117380.11100 clear;close all; figure(Position,[100 100 800 800]);num_points 14; [num,txt,raw] xlsread(test.xlsx); x num(:,1); y num(:,2);d…...

mysql:MVCC机制

MVCC机制 MVCC机制主要是mysql的多版本并发控制的一个机制&#xff0c;它主要是允许mysql去保存同一时间对同一份数据的不同历史版本的&#xff0c;从而避免读写之间的锁竞争&#xff0c;从而去提高并发的性能。 像传统的锁机制&#xff08;读写互斥锁&#xff08;Read-Write …...

Vue3 + Element Plus 实现树形结构的“单选 + 只选叶子节点 + 默认选中第一个子节点”

在 Vue 项目中&#xff0c;我们常使用树形结构组件来展示层级数据。本文将介绍如何使用 Element Plus 的 <el-tree> 组件&#xff0c;在 Vue3 中实现以下需求&#xff1a; ✅ 只能勾选叶子节点 ✅ 每次只能选中一个节点&#xff08;单选&#xff09; ✅ 页面加载时默认…...

CAD精简多段线顶点、优化、删除多余、重复顶点——CAD c#二次开发

附部分代码如下: public static void Pl精简(){Document doc Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;Database db doc.Database;Editor ed doc.Editor;var plOrigon db.SelectCurve("\n选择多段线&#xff1a;");…...

输电线路的“智慧之眼”:全天候可视化监测如何赋能电网安全运维

在电力需求持续攀升、电网规模日益庞大的今天&#xff0c;输电线路的安全稳定运行面临着前所未有的挑战。线路跨越地形复杂多变&#xff0c;尤其是在偏远山区、铁路沿线及恶劣天气条件下&#xff0c;传统的人工巡检方式显得力不从心——效率低、风险高、覆盖有限。如何实现更智…...

Spring 核心知识点补充

Spring 核心知识点补充 1. IoC&#xff08;控制反转&#xff09; 核心思想&#xff1a;将对象的创建和依赖管理交给容器&#xff0c;而非在代码中直接控制实现方式&#xff1a; XML 配置&#xff1a;<bean> 标签定义对象注解&#xff1a;Component, Service, Repositor…...

两阶段法目标检测发展脉络

模式识别期末展示大作业&#xff0c;做个记录&#xff0c;希望大家喜欢。 R-CNN Fast R-CNN R-FCN 整个过程可以分解为以下几个步骤&#xff1a; 输入图像 (image) 和初步特征提取 (conv, feature maps)&#xff1a; 首先&#xff0c;输入一张原始图像&#xff0c;经过一系列…...

Flannel 支持的后端

Flannel 是一个为 Kubernetes 设计的容器网络解决方案&#xff0c;支持多种后端&#xff08;backend&#xff09;来处理节点间的数据包转发。根据官方文档和其他可靠来源&#xff0c;以下是 Flannel 支持的后端类型及其说明&#xff1a; VXLAN&#xff08;推荐&#xff09; 描述…...

小白的进阶之路系列之六----人工智能从初步到精通pytorch数据集与数据加载器

本文将介绍以下内容: 数据集与数据加载器 数据迁移 如何建立神经网络 数据集与数据加载器 处理数据样本的代码可能会变得混乱且难以维护;理想情况下,我们希望我们的数据集代码与模型训练代码解耦,以获得更好的可读性和模块化。PyTorch提供了两个数据原语:torch.utils…...

SQL进阶之旅 Day 5: 常用函数与表达式

【SQL进阶之旅 Day 5】常用函数与表达式 在SQL的进阶学习中&#xff0c;掌握常用函数和表达式是提升查询效率、解决复杂业务问题的关键。本篇文章将深入探讨聚合函数、日期函数、条件表达式等核心内容&#xff0c;并结合实际案例分析其应用价值。通过理论讲解、代码示例和性能…...

NestJS——重构日志、数据库、配置

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…...