网易首页 > 网易号 > 正文 申请入驻

放弃 WebSocket,使用 SSE 仅用几行代码就能搞定这些功能!

0
分享至

Java精选面试题 (微信小程序):5000+道面试题和选择题,真实面经,简历模版,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计、真题等,在线刷题!

一. 简介

在实际项目开发中,实时通讯是常见的需求。我们通常使用 WebSocket 来实现这一功能,但在很多场景下,客户端只是需要从服务器接收消息,而非进行双向通讯。这导致 WebSocket 的全双工特性并没有得到充分的利用。那么,是否有更简单的替代方案呢?

本文将介绍 Server-Sent Events (SSE) ,一种轻量级的方式来实现服务器向客户端推送消息的需求,同时对比 SSE、WebSocket 和传统轮询技术的优劣,帮助开发者选择适合的实时通讯方案。

SSE、轮询、WebSocket 详细对比表:

unsetunset特性 SSE (Server-Sent Events) 轮询 (Polling) WebSocket通讯方向单向:服务器向客户端推送数据 单向:客户端定时请求服务器获取数据 双向:客户端与服务器双向通讯连接类型长连接:使用 HTTP/1.1 或 HTTP/2 长连接 短连接:每次请求都是独立的 HTTP 请求 长连接:通过 TCP 建立的持久连接传输协议HTTP/1.1 或 HTTP/2 HTTP TCP(通过 WebSocket 协议升级)浏览器支持广泛支持(HTML5 原生支持) 全面支持,所有浏览器均支持 广泛支持(需通过 WebSocket API 实现)消息发送频率服务器可随时推送数据 客户端主动定时请求,频率取决于客户端设置 实时、即时双向发送服务器开销较低:只需保持一个长连接 高:每次请求都需要重新建立 HTTP 连接 较高:需保持 TCP 连接,管理心跳包客户端开销低:只需处理服务器推送的数据 高:每次请求都会产生额外的资源消耗 中等:需保持与服务器的连接传输数据格式纯文本、JSON 等 纯文本、JSON 等 任意格式(二进制、文本等)连接恢复机制自动恢复:连接中断时,客户端会自动重新连接 无自动恢复,需客户端重新发起请求 需开发者自行实现重连机制适用场景适合实时数据推送、通知、监控等单向通讯场景 适用于低频率、对实时性要求不高的场景 适合即时通讯、协作应用等双向通讯场景复杂度简单:实现轻量且代码量少 简单:代码量少,但性能较差 复杂:需处理更多逻辑,如握手、心跳等实时性高:服务器可立即推送消息 低:依赖客户端的请求频率 高:双向即时通讯防火墙/代理兼容性高:使用标准 HTTP 协议,通常无额外配置需求 高:使用标准 HTTP 协议 可能较低:需配置防火墙或代理来允许 TCP 连接带宽消耗较低:保持长连接,但只在有数据时传输 较高:每次轮询都会消耗资源和带宽 较低:保持长连接,数据按需传输

二、聊聊为什么放弃了Websocket,我只需要写一两行代码

当我们考虑 WebSocket 时,虽然它是双向通信的强大工具,但在某些场景下确实显得过于“重型”,尤其是你只需要服务器单向推送数据,而不是用户发送信息回来。

推荐划水摸鱼神器: https://www.yoodb.com/slack-off/home.html

以下是 WebSocket 在你的身份证识别场景中不太实用的几点原因,顺便还顺带了SSE的优势:

  • 权限验证不便 :WebSocket通常需要手动处理,通过在WebSocket握手时传递token等

  • 日志记录复杂

  • SSE 集成简单 :SSE不需要额外引入依赖

  • 连接管理复杂 :Websocket需要额外编写断线重连等代码

  • 定时任务执行不方便 :Websocket需要额外编写定时发送消息代码

unsetunset

三、编写一个统计在线用户的SSE接口 ,看看前端给我的效果

1. 配置自己的 AsyncTaskExecutor

如果不配置AsyncTaskExecutor,不建议在生产环境下使用,SpringBoot会给出您警告的

@Configuration
@Slf4j
public class WebMvcConfig implements WebMvcConfigurer {

    // 定义自定义的 AsyncTaskExecutor Bean
    @Bean(name = "customAsyncTaskExecutor")
    public AsyncTaskExecutor customAsyncTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        int corePoolSize = Runtime.getRuntime().availableProcessors(); // 核心线程数设置为 CPU 核心数
        int maxPoolSize = corePoolSize * 2; // 最大线程数设置为核心数的两倍
        int queueCapacity = 500; // 队列容量

        executor.setCorePoolSize(corePoolSize);
        executor.setMaxPoolSize(maxPoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.setThreadNamePrefix("AsyncExecutor-");
        executor.setWaitForTasksToCompleteOnShutdown(true); // 关闭时等待任务完成
        executor.setAwaitTerminationSeconds(60); // 关闭时最多等待 60 秒

        executor.initialize(); // 初始化线程池

        return executor;
    }

    @Override
    public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
        configurer.setTaskExecutor(customAsyncTaskExecutor()); // 使用自定义的 AsyncTaskExecutor
        configurer.setDefaultTimeout(5000); // 设置异步请求的默认超时时间(毫秒)
    }
}
unsetunset2. 编写具体代码unset

@PreventDuplicateSubmit
@PreAuthorize("@permission.checker('monitor:online-user:list')")
@GetMapping(value = "/user-activity-sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux   streamUserActivitySSE ()  {
    // 创建一个持续时间为指定秒数的 Flux 流
    return Flux.interval(Duration.ofSeconds(5))
            .flatMap(sequence -> Mono
                    .fromCallable(onlineUserService::getUserActivityNum) // 返回在线用户人数
                    .onErrorReturn(0)
            );
}
unsetunset3. 看看前端效果unset

四、聊聊之前开发中应该使用SSE却使用了轮询的事

在两年前,我XX叫我对接一下身份证识别仪器,如图(类似这样,实际不是这样) :

因为这个机器是 C++ 编写的,我们后端是Java所以需要集成一下,但是这个机器是需要你一直调用接口去扫描的,他不会主动告诉你身份证识别了没有。

当时我们是当用户进入对应需要身份证认证的页面的时候,开始进行身份证检测,但是不知道用户多久会把身份证放到机器上,领导这个功能又催的很急。然后在我对接了这个机器之后,我偷偷和前端说,我们摸摸鱼轮询解决就行,前端也是直接开写,最后我们10分钟就搞定了。

在这里 sorry 领导,如果你那时候不催我的话,我可以告诉你使用SSE解决。

五、源码 & 结束语

Websocket 和 SSE 有各自的应用场景,不存在谁好谁坏,有些问题用轮询也能解决,其他有很多地方都可以使用SSE编写的地方,比如消息通知等

前端文章地址:

https://juejin.cn/post/7410965438044012582

后端源码地址:

https://gitee.com/fateyifei/yf/blob/master/yf-boot-admin/yf-admin/src/main/java/com/yf/controller/monitor/OnlineUserController.java

作者:翼飞 来源:https://juejin.cn/post/7410798727622311946

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

最近有很多人问,有没有读者交流群!加入方式很简单,公众号Java精选,回复“加群”,即可入群!

Java精选面试题(微信小程序):3000+道面试题,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计等,在线随时刷题!

特别推荐:专注分享最前沿的技术与资讯,为弯道超车做好准备及各种开源项目与高效率软件的公众号,「大咖笔记」,专注挖掘好东西,非常值得大家关注。点击下方公众号卡片关注

文章有帮助的话,点在看,转发吧!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
日经225指数跌破57000点,日内跌1.12%

日经225指数跌破57000点,日内跌1.12%

每日经济新闻
2026-02-13 08:33:03
2艘055入列,东海舰队独当一面,第七舰队加日韩,都不是对手?

2艘055入列,东海舰队独当一面,第七舰队加日韩,都不是对手?

东方点兵
2026-02-10 17:14:28
人民币在朝鲜的购买力,到底有多强?一位中国游客的震撼之旅

人民币在朝鲜的购买力,到底有多强?一位中国游客的震撼之旅

番外行
2026-02-11 14:19:41
等来最对的人!肯纳德正用最冷的方式,证明他不止是射手!

等来最对的人!肯纳德正用最冷的方式,证明他不止是射手!

体育闲话说
2026-02-13 13:54:23
曼城危机来了!两大中场巨星夏窗或同时离队,蓝月军团面临重建

曼城危机来了!两大中场巨星夏窗或同时离队,蓝月军团面临重建

零度眼看球
2026-02-13 18:56:55
费南多主动示好,薪水降到只要25万,渴望与好友第三次合作

费南多主动示好,薪水降到只要25万,渴望与好友第三次合作

体坛风之子
2026-02-13 07:00:08
醒醒吧,伊朗从来不是我们的“好朋友”

醒醒吧,伊朗从来不是我们的“好朋友”

苏格拉高
2026-01-11 07:42:04
美国连出两记重拳,目标直指钱凯港,要拔掉中方最后的“立足点”

美国连出两记重拳,目标直指钱凯港,要拔掉中方最后的“立足点”

小影的娱乐
2026-02-13 18:44:22
大妈家门口丢失30克金手镯,监控显示邻居捡走,对方:捡的是棍子

大妈家门口丢失30克金手镯,监控显示邻居捡走,对方:捡的是棍子

大鱼简科
2026-02-13 16:30:54
又一TVB新剧将播!三个TVB女星组卧底女团,誓要捣破庞大贩毒集团!

又一TVB新剧将播!三个TVB女星组卧底女团,誓要捣破庞大贩毒集团!

我爱追港剧
2026-02-11 23:13:53
又一中国制造老外抢疯了?海外订单涨10倍,美企慌了:我们的卖谁

又一中国制造老外抢疯了?海外订单涨10倍,美企慌了:我们的卖谁

万物知识圈
2026-02-13 11:30:48
平台喊冤:10%抽成恐难覆盖成本!代表回怼:不能总让司机买单!

平台喊冤:10%抽成恐难覆盖成本!代表回怼:不能总让司机买单!

夕阳渡史人
2026-02-11 09:55:09
浙江省税务局党委书记、局长孟军:坚定扛起经济大省挑大梁的税务担当

浙江省税务局党委书记、局长孟军:坚定扛起经济大省挑大梁的税务担当

新浪财经
2026-02-13 11:11:38
四川女子不慎摔碎马茅,丈夫淡定处理“没事”,女子:“价值两千多,太心疼了“

四川女子不慎摔碎马茅,丈夫淡定处理“没事”,女子:“价值两千多,太心疼了“

大象新闻
2026-02-13 13:44:03
你见过最土的土豪有多土?网友:你这明显是短剧看多了

你见过最土的土豪有多土?网友:你这明显是短剧看多了

带你感受人间冷暖
2026-02-11 11:21:06
五角场商圈一家烤鱼店排队6000桌?看“排队经济”玩出新高度

五角场商圈一家烤鱼店排队6000桌?看“排队经济”玩出新高度

上观新闻
2026-02-12 20:29:07
为什么我的眼里只有你

为什么我的眼里只有你

疾跑的小蜗牛
2026-02-13 17:33:00
巴总统强硬表态,李嘉诚服软,长和发声:步步进迫,已完全失控

巴总统强硬表态,李嘉诚服软,长和发声:步步进迫,已完全失控

娱乐督察中
2026-02-13 18:48:44
拒挂国旗、订单全给日韩,被停止合作封锁航线的长荣,今咎由自取

拒挂国旗、订单全给日韩,被停止合作封锁航线的长荣,今咎由自取

近史谈
2026-01-21 20:33:15
春节消费记得领!杭州发放新一轮补贴、消费券!

春节消费记得领!杭州发放新一轮补贴、消费券!

杭州之声
2026-02-13 19:00:18
2026-02-13 20:00:49
Java精选
Java精选
一场永远也演不完的戏
1772文章数 3859关注度
往期回顾 全部

科技要闻

独家探访蔡磊:答不完的卷子 死磕最后一程

头条要闻

首次访华前 德国总理默茨在发言中将中欧对比引发关注

头条要闻

首次访华前 德国总理默茨在发言中将中欧对比引发关注

体育要闻

这张照片背后,是米兰冬奥最催泪的故事

娱乐要闻

米兰冬奥摘银 谷爱凌再遭美国网友网暴

财经要闻

华莱士母公司退市 疯狂扩张下的食安隐忧

汽车要闻

探秘比亚迪巴西工厂 居然是这个画风!

态度原创

亲子
本地
健康
数码
公开课

亲子要闻

抽宝为什么长得慢

本地新闻

下一站是嘉禾望岗,请各位乘客做好哭泣准备

转头就晕的耳石症,能开车上班吗?

数码要闻

不用多花钱!锐龙7 9800X3D简单设置:性能直逼9850X3D

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版