websocket是实现异步任务进度实时通知最自然、高效的技术选择,它通过持久化双向连接让服务端毫秒级主动推送任务状态,彻底替代低效轮询。

WebSocket 是实现异步任务进度实时通知最自然、高效的技术选择。它让服务端在任务执行过程中,主动把“当前处理到哪一步”“进度多少”“是否出错”等状态,毫秒级推送给前端,彻底告别用户盯着静止进度条干等的糟糕体验。
为什么不用轮询而选 WebSocket
传统轮询需前端反复发请求(比如每秒一次),但多数时候后端还没更新状态,造成大量空响应和资源浪费;间隔拉长又导致反馈延迟。WebSocket 建立一次连接后长期保持,服务端有新进度就立刻发,不占额外带宽,也不增加无谓请求压力。
关键实现逻辑要点
核心在于把“任务执行”和“消息推送”解耦,同时确保线程安全与会话可寻址:
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
- 前端建立 WebSocket 连接时,携带唯一任务 ID(如 URL 参数 ?taskId=abc123),服务端据此绑定 Session
- 后端启动异步任务(如用线程池或 CompletableFuture),并在关键节点(如加载模型、预处理完成、风格迁移中、后处理结束)构造 TaskProgressInfo 对象
- 通过线程安全的 Session 映射表(如 ConcurrentHashMap
)找到对应连接,调用 session.sendMessage() 推送 JSON 消息 - 前端监听 onmessage,解析进度字段更新 UI,完成后自动关闭连接或进入结果页
实际应用中的常见注意点
真实部署时几个细节容易踩坑:
- 连接需做鉴权:不能让任意客户端随意连上 /ws/progress,建议在 @OnOpen 阶段校验 Token 或用户登录态
- 任务超时或异常要兜底:若后端任务卡死或崩溃,应主动向对应 Session 发送 error 消息并关闭连接,避免前端一直等待
- 避免消息堆积:如果进度上报太密(如每毫秒一次),可在服务端加简单限频(如最小间隔 200ms),或前端做防抖处理
- 连接中断要可恢复:前端监听 onclose 后,可记录当前 taskId,重连成功后主动询问服务端最新状态,而非从头开始
典型适用场景不止于图像处理
只要涉及“用户提交 → 后台耗时执行 → 需要过程反馈”的流程,都适合接入:
- 大文件导入导出(Excel 解析、数据库批量写入)
- AI 视频生成、语音合成、3D 模型渲染
- 后台数据报表生成、ETL 任务执行
- 订单履约状态流转(如“已打包→出库→在途→签收”)










