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

放弃 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.

相关推荐
热点推荐
雅万高铁通车两年,印尼没钱运营了,问中国:那45亿贷款能否缓缓

雅万高铁通车两年,印尼没钱运营了,问中国:那45亿贷款能否缓缓

芳芳历史烩
2026-01-08 15:40:33
卢克曼3场造4球,国米今夏3800万双引援

卢克曼3场造4球,国米今夏3800万双引援

赫岝乡村摄影
2026-02-13 13:27:47
青海一家35口人开旅游大巴赴云南自驾游,采购100斤米面等物资沿途自己做饭,当事人:往返14天,弥补缺失的陪伴

青海一家35口人开旅游大巴赴云南自驾游,采购100斤米面等物资沿途自己做饭,当事人:往返14天,弥补缺失的陪伴

极目新闻
2026-02-11 16:46:33
美国精英想不通:为什么每次要打压中国时,总有意外发生?

美国精英想不通:为什么每次要打压中国时,总有意外发生?

聚焦真实瞬间
2026-01-26 10:19:09
一个逻辑闭环:阿富汗女性只能上到小学,但女患者又必须看女医生

一个逻辑闭环:阿富汗女性只能上到小学,但女患者又必须看女医生

黄娜老师
2026-02-01 13:45:43
本赛季最大赢家!场均19+6入选全明星,还签2.2亿顶薪,马刺赚了

本赛季最大赢家!场均19+6入选全明星,还签2.2亿顶薪,马刺赚了

你的篮球频道
2026-02-13 08:07:06
黄金和白银突遭抛售 股市大跌引发了算法卖盘

黄金和白银突遭抛售 股市大跌引发了算法卖盘

财联社
2026-02-13 05:54:30
日本妹子赤裸上身做引体向上引热议!背影比男人还壮?

日本妹子赤裸上身做引体向上引热议!背影比男人还壮?

姿势跑法
2026-02-09 11:46:08
董璇一家在三亚度假!素颜生图皮肉松垮显老,张维伊大肚腩抢镜了

董璇一家在三亚度假!素颜生图皮肉松垮显老,张维伊大肚腩抢镜了

小徐讲八卦
2026-02-13 05:32:02
具俊晔要把小S两女儿带回韩国出道?台湾博主爆料S家在下一盘大棋

具俊晔要把小S两女儿带回韩国出道?台湾博主爆料S家在下一盘大棋

安宁007
2026-02-12 22:33:31
爱泼斯坦的年轻女友卡琳娜发文缅怀他:他不是恶魔,他是我的贵人

爱泼斯坦的年轻女友卡琳娜发文缅怀他:他不是恶魔,他是我的贵人

小寒嫣语
2026-02-13 01:39:25
美国到底为何放钱学森回国?中国给出的交换条件,让美国无从拒绝

美国到底为何放钱学森回国?中国给出的交换条件,让美国无从拒绝

文史明鉴
2026-02-05 17:03:11
中戏系主任投案引发震动!闫学晶儿子意外卷入,当年入学真相曝光

中戏系主任投案引发震动!闫学晶儿子意外卷入,当年入学真相曝光

乐悠悠娱乐
2026-02-13 10:32:16
一百年前,日本预言家王仁三郎预言:2030年内日本将会彻底毁灭!

一百年前,日本预言家王仁三郎预言:2030年内日本将会彻底毁灭!

今日搞笑分享
2026-02-11 13:04:16
北京春节假期期间预计有三次冷空气活动

北京春节假期期间预计有三次冷空气活动

中国网
2026-02-13 07:10:12
摊牌!永辉CEO致歉全员工:学胖东来亏21亿,欲望终究撑不起野心

摊牌!永辉CEO致歉全员工:学胖东来亏21亿,欲望终究撑不起野心

生活新鲜市
2026-02-12 20:59:38
挑衅过中国,高市对俄开刀!索要北方四岛还不够,还敢军援乌克兰

挑衅过中国,高市对俄开刀!索要北方四岛还不够,还敢军援乌克兰

话史官1
2026-02-13 12:18:49
越来越不像话!为了应对中国,日本免费向菲律宾提供5台雷达!

越来越不像话!为了应对中国,日本免费向菲律宾提供5台雷达!

我心纵横天地间
2026-02-13 12:50:25
略显尴尬,杨瀚森禁区内近距离勾手结果三不沾

略显尴尬,杨瀚森禁区内近距离勾手结果三不沾

懂球帝
2026-02-13 10:48:05
1976年,主席临终前决意将兵权托付给陈锡联,多年后才懂得伟人的深谋远虑

1976年,主席临终前决意将兵权托付给陈锡联,多年后才懂得伟人的深谋远虑

史海孤雁
2026-02-12 14:55:09
2026-02-13 14:11:01
Java精选
Java精选
一场永远也演不完的戏
1772文章数 3859关注度
往期回顾 全部

科技要闻

DeepSeek更新后被吐槽变冷变傻?

头条要闻

男子和女子相亲第五天在泳池亲密 事后让他大跌眼镜

头条要闻

男子和女子相亲第五天在泳池亲密 事后让他大跌眼镜

体育要闻

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

娱乐要闻

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

财经要闻

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

汽车要闻

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

态度原创

艺术
健康
教育
时尚
游戏

艺术要闻

书法大师的神作现身,引发网友热议!

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

教育要闻

两个阴影三角形的面积分别是3和9,求长方形面积

50+女人怎么穿更好看?过来人告诉你答案,越老越美赢麻了

战神2D新作评价超高!97%玩家打出5星满分好评

无障碍浏览 进入关怀版