Spring Boot 实时数据推送怎么做?把 3 秒轮询升级成 WebSocket(附断线降级方案)

简介: 本文详解设备看板从轮询到WebSocket的实战升级:直击轮询“无效请求多、延迟固定”两大痛点,结合真实平台代码,剖析定时全量推送、CopyOnWriteArraySet选型、session写锁等关键实现,并强调**必须保留轮询降级**——网络异常时保障功能可用。

设备看板要"实时",新手第一反应是前端 setInterval 轮询。能用,但有两个天生的毛病。这篇用我设备接入平台里的真实代码,讲清楚轮询 → WebSocket 的完整升级路径,以及最容易被忽略的降级方案。

先看最终效果——这是我平台的真实运行截图,温湿度数据 2 秒一刷:

iot-运行截图-看板全景.png

设备在线状态、最新温湿度、60 点实时曲线、最新数据帧,全部来自 MQTT 真实上报链路,不是静态假数据。

轮询的两个毛病

我第一版看板就是前端每 3 秒 GET /api/devices/overview 一次。能用,但:

  1. 浪费:数据没变化也在发请求,100 个打开的页面 = 每分钟 2000 次无效请求
  2. 实时性上限:数据变化后最多要等 3 秒才能看到,这个延迟写死在轮询间隔里

所以升级成 WebSocket:服务端控制节奏,一条连接服务所有刷新需求。

核心实现:一个 Handler 干三件事

@Component
@RequiredArgsConstructor
public class OverviewWebSocketHandler extends TextWebSocketHandler {
   

    private final OverviewService overviewService;
    private final ObjectMapper objectMapper;

    private final Set<WebSocketSession> sessions = new CopyOnWriteArraySet<>();

    @Override
    public void afterConnectionEstablished(WebSocketSession session) {
   
        sessions.add(session);
        sendSnapshot(session); // 连上立刻给一帧,前端不用等下一个推送周期
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
   
        sessions.remove(session);
    }

    /** 每 2 秒向所有在线连接广播一次概览快照 */
    @Scheduled(fixedDelayString = "${iot.ws.push-interval-ms:2000}", initialDelay = 5000)
    public void broadcast() {
   
        if (sessions.isEmpty()) {
   
            return;
        }
        String payload = snapshot();
        for (WebSocketSession session : sessions) {
   
            try {
   
                if (session.isOpen()) {
   
                    synchronized (session) {
   
                        session.sendMessage(new TextMessage(payload));
                    }
                } else {
   
                    sessions.remove(session);
                }
            } catch (IOException e) {
   
                log.warn("推送失败,剔除连接 {}: {}", session.getId(), e.getMessage());
                sessions.remove(session);
            }
        }
    }
}

三个实现取舍,每一个都是面试考点:

① 固定 2 秒推全量快照,而不是"有变化才推"

变化检测需要比对逻辑(脏标记/增量计算),而概览快照本身很小。先简单正确,将来设备多了再上增量——这个取舍比"上来就搞增量"聪明。

② sessions 用 CopyOnWriteArraySet

连接数少、每次广播都要遍历全部连接:读多写少的场景,写时复制比加锁更合适。如果连接数上万,这个选择就要重新评估。

③ 推送失败直接踢掉坏连接

sendMessage 抛 IOException 说明连接已坏(半开连接),不做复杂的健康检查,直接从集合剔除,等前端自己重连。简单,且不会泄漏死连接。

两个容易漏的细节

连上立刻推一帧:afterConnectionEstablished 里马上 sendSnapshot。不然前端要干等最多 2 秒白屏。

sendMessage 要加锁:synchronized (session)。Spring 的原生 WebSocketSession 不支持并发写,定时广播和连接建立时的首帧推送可能同时写同一个 session,不加锁会偶发 IllegalStateException: TEXT_PARTIAL_WRITING——这个报错搜不到几篇中文资料,我替你踩过了。

降级方案:WebSocket 挂了页面也不能死

网络环境复杂,公司代理、校园网都可能掐 WebSocket 长连接。所以轮询没有删掉,而是做成降级路线:

前端逻辑:
1. 优先建 WebSocket,收到推送就刷新
2. onclose / 超时未收到消息 → 自动切回 3 秒轮询
3. 每隔一段时间尝试重建 WebSocket,成功就切回推送

后端代码一行不用改——因为推送的数据结构和 GET /api/devices/overview 完全相同(同一个 Service 构建、同一个 DTO),前端一套渲染逻辑两处复用。这是这次升级里我觉得最值的设计决策:数据契约不变,传输层随便换。

升级后的刷新效果(曲线自动延伸、右上角"已刷新"时间戳每 2 秒跳动):

iot-运行截图-实时曲线.png

面试怎么讲

被问"实时推送怎么做的",三层答法:

  1. 选型:看板类低频全量刷新,服务端定时推快照就够;如果是消息类要毫秒级,才考虑按事件推
  2. 并发:CopyOnWriteArraySet 适配读多写少;session 写要加锁,Spring 原生 session 不支持并发写
  3. 可靠性:坏连接直接剔除等重连;必须保留轮询降级,WebSocket 不是可用性承诺而是体验增强

"必须保留降级"这一点说出来,面试官会知道你考虑过生产环境——WS 在复杂网络里就是会断,功能永远可用的兜底思维比技术本身值钱。

下一步

现在看板的数据链路是:模拟设备 → EMQX → 消费入库 → 定时聚合 → WebSocket 广播。再往下一步是把"设备注册/密钥管理"补成完整的管理端,然后上 Kafka 把消费和接入解耦——那是下一篇文章的事。


我是软件工程在读,正在从零搭一个物联网设备接入平台(Spring Boot + EMQX + MySQL),所有代码和踩坑记录都会发出来。欢迎关注,一起卷物联网后端。

相关文章
|
7天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
6827 9
|
5天前
|
人工智能 测试技术 API
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
Jev是TypeSafe AI推出的“系统一模型”,不生成文本,专做毫秒级结构化决策:Choice(多选)、Score(打分)、Noul(是非概率)。响应快193倍、成本低444倍,适合工单路由、内容审核、测试定级等高频判断场景。
1371 4
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
|
5天前
|
人工智能 并行计算 PyTorch
秋叶 ComfyUI 2026 整合包 v3.2 完整部署教程:Python 3.13 + Torch 2.13 全栈升级
秋叶aaaki ComfyUI 2026年8月整合包v3.2正式发布!全面升级Python 3.13.11、PyTorch 2.13.0+cu130及ComfyUI v0.30.2,原生支持MiniMax H3、Wan 2.2、Qwen-Image-2.1等2026主流音视频/图像模型,解压即用,无需环境配置。
799 5
|
19天前
|
人工智能 自然语言处理 安全
阿里云千问办公 QwenWork详细介绍:产品核心能力、典型场景、价格及常见问题解答
千问办公是阿里云推出的一站式AI办公平台,主打"不止于对话,更注重交付",依托通义千问旗舰大模型,用户一句话即可完成数据分析、PPT生成、视频剪辑等复杂任务,直接输出可用成果。产品深度打通钉钉生态与企业OA,覆盖桌面端、网页端,提供企业标准版198元/人/月等多档订阅方案,新用户注册即赠2000积分,适配工程师、HR、财务等多职业办公场景,成为能动手干活的"全能AI同事"。
3421 10
|
13天前
|
缓存 IDE Java
【保姆级】Android Studio下载、安装和汉化教程(2026最新)
Android Studio 是 Google 官方推出的免费 Android 应用开发集成环境,基于 IntelliJ IDEA,内置模拟器、调试器、性能分析及 Compose 界面工具,功能全面,文档丰富,是安卓开发首选工具。(239字)
1491 1
|
18天前
|
IDE 开发工具
Qoder 上线 Sonus 模型,Computer Use 能力全面增强
Qoder国际版上线全新内置大模型Sonus(/ˈsoʊnəs/),全球领先,专精超长任务执行与电脑操作(Computer Use)。配合Qoder桌面端0.2.3版本,可自主完成编程、金融建模、科研及表格制作等复杂工作。现全面支持Qoder全系产品,效率提升3.2倍。
1884 9
Qoder 上线 Sonus 模型,Computer Use 能力全面增强

热门文章

最新文章