SpringBoot 接入SSE实现消息实时推送的优点,原理以及实现

SpringBoot 接入SSE实现消息实时推送的优点,原理以及实现

前言

上一篇文章 我写的关于SpringBoot整合t-io是websocket实时通信的文章中我们可以了解到 websocket是双向通信的,而且需要TCP连接的支持,今天在这里我要说的SSE(Server-Sent Events) 是一个单项通信的消息实时推送框架,它仅支持由服务器发送消息到客户端,而且是基于HTTP/HTTPS的。对于我们只需要从服务器向客户端推送的数据使用SSE会更加轻便,性能更强。

SSE 单向数据推送的优点

1. 简单易用

  • 基于HTTP:SSE使用标准的HTTP协议,无需额外的协议升级(如WebSocket的握手)。这使得它更容易集成到现有HTTP基础设施中。
  • 客户端API简单:浏览器端使用EventSource对象,API非常简单,只需几行代码即可建立连接并监听事件。
  • 自动重连EventSource内置了自动重连机制,当连接断开时,客户端会自动尝试重新连接。

2. 单向通信(服务器到客户端)

  • 对于只需要服务器向客户端推送数据的场景(如实时通知、股票行情、新闻更新等),SSE是理想的选择。它不需要客户端向服务器发送数据,从而减少了复杂性和开销。

3. 轻量级

  • SSE的数据格式是纯文本,每条消息由eventdataid等字段组成,结构简单,解析高效。
  • 与WebSocket相比,SSE在协议层更轻量,不需要维护双向通信的复杂状态。

4. 支持标准HTTP功能

  • 安全性:SSE可以通过HTTPS运行,确保数据传输的安全性。
  • 认证和授权:由于基于HTTP,可以方便地使用Cookie、HTTP认证或Token进行访问控制。
  • 代理友好:SSE可以通过标准的HTTP代理和防火墙,而WebSocket可能会在某些严格的网络环境中被阻止。

5. 自动处理连接管理

  • 客户端(浏览器)的EventSource会自动处理连接建立、断开和重试逻辑,开发者无需手动实现这些功能。

6. 文本数据友好

  • 对于推送文本数据(如JSON、XML、纯文本),SSE非常高效。如果需要传输二进制数据,则WebSocket更合适。

7. 兼容性

  • 浏览器支持:现代浏览器(包括IE/Edge、Firefox、Chrome、Safari、Opera)都支持SSE。对于不支持的浏览器(如IE11及以下),可以使用polyfill(如eventsource库)。
  • 服务器端:几乎所有后端语言和框架都支持SSE,因为本质上它只是长轮询的标准化和简化。

8. 效率

  • 相比传统的轮询(Polling)或长轮询(Long Polling),SSE使用持久连接,服务器可以在有数据时立即推送,减少了不必要的请求和延迟。

9. 事件驱动

  • 服务器可以发送不同类型的事件(通过event字段),客户端可以为不同的事件注册不同的处理函数,实现更灵活的消息处理。

10. 与现有技术栈集成容易

  • 如果你已经有一个RESTful API,添加SSE端点通常很简单,无需引入额外的库或中间件(如WebSocket服务器)。

对比WebSocket

  • 双向 vs 单向:WebSocket提供全双工通信,适合需要双向交互的场景(如聊天应用)。SSE仅支持服务器到客户端的单向通信。
  • 复杂性:WebSocket需要更复杂的服务器和客户端实现,而SSE更简单。
  • 二进制数据:WebSocket支持二进制数据,SSE仅支持文本(但可以Base64编码二进制数据)。

适用场景

  • 实时通知(如邮件、消息提醒)
  • 实时数据监控(如股票行情、实时日志)
  • 新闻推送、赛事比分更新
  • 任何需要服务器主动向客户端推送数据的场景

SSE 代码实现

1. SSE 工具类,支持消息推送与心跳保持

@Slf4j
public class SseUtils {// 存储用户ID与SseEmitter的映射private static final Map<Long, SseEmitter> emitterMap = Maps.newConcurrentMap();// 心跳任务映射:用户ID -> 心跳任务pri

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

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

相关文章

创建型设计模式:对象诞生的艺术与智慧

&#x1f3ad; 创建型设计模式&#xff1a;对象诞生的艺术与智慧 &#x1f4a1; 温馨提示&#xff1a;本文将以轻松有趣的方式带你探索设计模式的世界&#xff0c;就像在听一个关于"如何优雅地生孩子"的故事一样&#xff01; &#x1f6aa; 传送门&#xff1a;在开始…

如何解决pip安装报错ModuleNotFoundError: No module named ‘gensim’问题

【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘gensim’问题 摘要 在使用 PyCharm 2025 进行 Python 开发时&#xff0c;常常需要通过 pip install 安装第三方包以丰富项目功能。但在安装 gensim 等包时&…

【嵌入式电机控制#26】BLDC:三相模拟采集

之前有些网友试着用有刷的平均电流法采集三相&#xff0c;还搞了个闭环控制。求&#xff01;结果直接把驱动板给干没了......做过仿真的朋友们都知道&#xff0c;无刷电机的相电流波形是介于方波和正弦波的。如果拿平均电流去测量&#xff0c;很不靠谱。这节内容为大家分享采集…

ref存储对象和reactive深度响应式递归地对对象的嵌套属性进行响应式处理

ref 不会递归地对 对象 或 数组 中的每个属性或元素进行深度响应式处理。如果你需要递归处理嵌套属性&#xff0c;reactive 是更适合的选择。让我通过具体的例子来展示这一点。 例子&#xff1a;ref 存储对象和嵌套对象 1. 使用 ref 存储嵌套对象&#xff1a; import { createA…

小鹏汽车前端面经

前端基础与浏览器机制 (Front-End Fundamentals & Browser Mechanics) 这些问题涵盖了Web工作的基本原理&#xff0c;包括网络、渲染和浏览器特性。 1. 浏览器渲染与性能 (Browser Rendering & Performance) URL输入发生什么&#xff1f;(What happens when you type a…

利用DeepSeek编写go语言按行排序程序

听说google出品的go语言也是系统开发中常用的&#xff0c;性能到底怎么样&#xff0c;还是老办法&#xff0c;让DeepSeek写个程序跑一下&#xff0c;基于以往的经验&#xff0c;直接让它同时编写有缓冲和无缓冲版本。 package mainimport ("bufio""fmt"&qu…

《解构Angular组件变化检测:从自动到手 动的效能突破》

为何有时数据更新后视图却无动于衷?为何看似简单的操作会引发连锁式的性能损耗?要解开这些疑问,需要穿透表层的API调用,深入到框架设计的底层逻辑中去。变化检测的核心使命,是确保视图层能够准确反映数据层的当前状态。这种"数据-视图"的同步关系,是所有前端框…

书单 | AI编程+Python+Go三大核心领域书单

这份书单聚焦AI编程、Python开发、Go语言三大核心领域&#xff0c;精选6本本月 最具前瞻性的技术图书&#xff0c;为你构建"工具链业务层系统层"的全栈能力。 1、人人皆可Vibe编程&#xff1a;玩转氛围编程 作者&#xff1a;池志炜,薛志荣 本书围绕Vibe编程这一AI驱…

Kali Linux 2025.2基于MITRE ATTCK框架

从彻底革新的菜单结构到新增的13款尖端工具&#xff0c;再到首次支持智能手表Wi-Fi注入&#xff0c;Kali Linux 2025.2为红队、蓝队以及安全研究人员提供了更高效、更直观的工具生态。菜单结构大变革&#xff1a;基于MITRE ATT&CK框架Kali Linux 2025.2最引人注目的变化之一…

javacc实现简单SQL解析器

文章目录前言本章节源码需求1&#xff1a;实现一个最简单的select sql要求实现jj文件编译测试需求2&#xff1a;理解Token及其他属性说明javajj文件需求3&#xff1a;实现解析得到SQL语法树 & 精确点位资料获取前言 博主介绍&#xff1a;✌目前全网粉丝4W&#xff0c;csdn…

Odoo OWL前端框架全面学习指南 (后端开发者视角)

核心理念&#xff1a; 将您熟悉的Odoo后端MVCORM架构思想&#xff0c;完整映射到前端OWL组件化开发中&#xff0c;让您在熟悉的概念体系下&#xff0c;快速掌握新的技术栈。第一部分&#xff1a;核心概念映射与环境搭建内容摘要&#xff1a; 本部分旨在建立后端与前端最核心的概…

Java开发工具包,jdk,idea,VMware,rocketmq,redis,CentOS7

Java开发工具包&#xff0c;jdk&#xff0c;idea&#xff0c;VMware&#xff0c;rocketmq&#xff0c;redis&#xff0c;CentOS7 下载地址 通过网盘分享的文件&#xff1a;Java开发环境工具包 链接: https://pan.baidu.com/s/1eJqvPx5DYqtmXgmEtOl8-A?pwdcj1f 提取码: cj1f –…

macOS Python 安装

目录 一、确认系统环境 二、安装 &#xff08;一&#xff09;下载安装包 &#xff08;二&#xff09;安装过程 三、配置环境变量 四、验证安装 一、确认系统环境 在安装 Python 之前&#xff0c;我们先简单了解一下自己的 MACOS 系统。可以点击屏幕左上角的苹果菜单&…

MySQL 全方位解析:从基础到高可用架构

1. 介绍 (Introduction) 1.1. 什么是 MySQL&#xff1f; MySQL 是全球最受欢迎的开源关系型数据库管理系统 (Relational Database Management System, RDBMS)。它由瑞典的 MySQL AB 公司开发&#xff0c;现隶属于 Oracle 公司。MySQL 将数据存储在不同的、预先定义好结构的表中…

力扣热题100——滑动窗口

无重复字符的最长子串步骤 1&#xff1a;初始状态 字符串 s “abcabcbb”&#xff0c;哈希表 charSet 初始为空&#xff0c;双指针 left 0&#xff0c;right 0。 哈希表&#xff08;charSet&#xff09;&#xff1a; {} 字符串&#xff1a; a b c a b c b b 指…

SOD-YOLO:增强基于YOLO的无人机影像小目标检测

摘要 https://www.arxiv.org/pdf/2507.12727 小目标检测仍是目标检测领域中的一个挑战性问题。为应对这一挑战&#xff0c;我们提出了一种基于YOLOv8的增强模型SOD-YOLO。该模型在颈部&#xff08;neck&#xff09;中集成了ASF&#xff08;注意力尺度序列融合&#xff09;机制以…

监督微调-指令微调-偏好微调

有监督微调 有监督微调是使用输入及其标签对的典型情况。例如&#xff0c;判断邮件是垃圾邮件还是非垃圾邮件&#xff0c;判断情感是积极还是消极。根据文档的主要主题对其进行分类也是一种常见应用。模型会将输入文本的相应表示&#xff08;隐藏状态或嵌入向量&#xff09;作为…

楼宇自控系统对建筑碳中和目标的实现具重要价值

随着全球气候变化问题日益严峻&#xff0c;建筑行业作为碳排放的重要来源之一&#xff0c;其节能减排工作备受关注。楼宇自控系统&#xff08;Building Automation System&#xff0c;BAS&#xff09;作为智能建筑的核心组成部分&#xff0c;通过集成控制、监测和管理建筑内的各…

【YOLO学习笔记】YOLOv5详解

一、数据增强 mosaic仿射变换与透视变换Mixup mosaic代码位置仿射变换 与 透视变换​代码片段位置 二、网络结构 1. 网络不同尺寸 nsmlx与网络深宽度 yolov5 官方提供了5个目标检测的网络版本&#xff1a;yolov5n、yolov5s、yolov5m、yolov5l、yolov5x &#xff0c;早年是…

WebRTC前处理模块技术详解:音频3A处理与视频优化实践

一、WebRTC前处理模块概述 WebRTC&#xff08;Web Real-Time Communication&#xff09;作为实时音视频通信的核心技术&#xff0c;其前处理模块是提升媒体质量的关键环节。该模块位于媒体采集与编码之间&#xff0c;通过对原始音频/视频数据进行优化处理&#xff0c;解决实时…