web网络通讯中实现实时通讯的常见方式:轮训、SSE、Websocket、Webhook,以及对应的Springboot和前端简易demo代码
在现代Web应用中,实时通讯能力变得越来越重要,它允许服务器主动向客户端推送数据,从而提供即时更新的用户体验。本笔记将介绍几种常见的实时通讯方案,包括它们的原理、特点、优缺点及适用场景。
1. Polling (轮询)
Polling是一种客户端定时向服务器发送请求,以查询最新数据的机制。它通过模拟实时性来工作。
1.1 Short Polling (短轮询)
- 原理:客户端以固定的时间间隔向服务器发送HTTP请求,询问是否有新的数据。
- 特点:
- 模拟实时:通过频繁请求来获取最新数据。
- 兼容性高:基于标准的HTTP请求,无需特殊协议,兼容所有浏览器和网络环境。
- 天然无状态:每次请求都是独立的,对服务器的分布式部署友好。
- 工作流:
- 客户端定时(例如每隔5秒)向服务器发起HTTP请求。
- 服务器接收请求后,立即返回当前数据(无论是否有更新)。
- 客户端接收响应后,处理数据并等待下一个轮询周期。
- 优缺点:
- 优点:实现简单,兼容性极佳,易于部署在分布式环境中。
- 缺点:
- 效率低下:大部分请求可能没有新数据,造成带宽和服务器资源的浪费。
- 延迟性:数据更新的实时性取决于轮询间隔,间隔越长延迟越高。
- 服务器压力:高并发场景下,频繁的请求会给服务器带来较大压力。
- 适用场景:
- 对实时性要求不高,数据更新不频繁的场景(如:后台管理系统的数据刷新)。
- 简单任务结果的查询。
1.2 Long Polling (长轮询)
- 原理:客户端发送请求后,服务器会“挂起”连接,直到有新的数据可用,或者达到预设的超时时间才返回响应。客户端收到响应后,会立即发送新的请求。
- 特点:
- 减少无效请求:相比短轮询,显著减少了客户端和服务器之间的HTTP请求次数。
- 更接近实时:数据一旦可用即可立即推送给客户端,降低了延迟。
- 保持连接:服务器需要维护挂起的连接,对服务器资源有一定消耗。
- 工作流:
- 客户端向服务器发送HTTP请求。
- 服务器接收请求后,如果当前没有新数据,则不立即响应,而是将请求挂起。
- 当有新数据可用时,服务器立即响应客户端,并发送数据。
- 如果在指定时间内没有新数据,服务器会超时响应,客户端收到响应后会立即发起新的长轮询请求。
- 客户端收到响应后,处理数据并立即发起新的长轮询请求。
- 优缺点:
- 优点:相比短轮询,实时性更好,减少了无效��求和服务器压力。实现相对简单,兼容性好。
- 缺点:
- 连接占用:服务器需要长时间保持连接,在高并发下仍可能消耗大量资源。
- 复杂性增加:服务器端需要管理挂起的连接和超时机制。
- 仍有延迟:在数据不活跃时,仍可能因超时而产生一定延迟。
- 适用场景:
- 需要准实时数据更新的场景,如聊天室、在线客服、通知系统等。
- 客户端需要等待特定事件发生的场景。
demo:
2. Webhooks
- 简单HTTP通讯:通过给定一个NotifyUrl,来接收回调通知;
- 无资源占用:不需要链接建立、等待等资源消耗,完全异步通知;
- 无状态:分布式友好;
工作流:
- 任务发起:任务的执行方通常可以接受一个webhook链接;
- 结果通知:当结果执行完后,调用对应的webhook通知执行结果即可; 特点:
- 优点:高效、无额外资源占用;
- 缺点:通常需要暴露公网endpoint,需要额外的安全措施;如:QPS限流、ip白名单、请求签名验证等; 场景:
- 通常用于与三方服务对接,由三方服务执行webhook;(交易系统、电子签等等)
- 某些RPC框架也支持服务间的webhook;
demo:
3. Server-Sent Event
特点:
- 单向通信:仅服务器向客户端推送数据。
- 基于HTTP:使用简单,兼容现有HTTP基础设施。
- 文本格式:默认支持UTF-8文本数据(可通过编码传输二进制)。
- 协议本身基于HTTP,是无状态的,如果需要持续保持链接,并保持推送目标则需要服务端自行维护状态;
工作流:
- 客户端通过EventSource接口订阅服务器事件流。
- 服务器以text/event-stream格式持续发送数据。
特点:
- 优点:自动重连、轻量级。
- 缺点:不支持客户端向服务器发送数据。
场景:
- 大模型Chat;
- 实时新闻、社交媒体等内容推送;
- 股票等行情数据;
demo参考:
4. 流式HTTP
5. WebSocket
- 全双工通信:客户端和服务器可同时发送数据。
- 低延迟:基于TCP,建立连接后持续保持,无需重复握手。
- 协议标识:ws://(非加密)或wss://(加密)。
工作流:
- 握手阶段:客户端通过HTTP Upgrade头请求升级协议。
- 持续连接:握手成功后,转为二进制帧传输数据。
特点:
- 优点:高效实时、支持双向通信。
- 缺点:分布式集群化的服务,在节点发布、下线时需要需额外处理连接中断和重连逻辑。通常的解决方案有:
- 集中式状态管理与重连机制;
- 消息代理;在客户端和服务端集群中增加「消息代理」,客户端与消息代理交互,消息代理服务和后端服务之间执行无状态交互;(成本高)
- 发布过程中,优雅下线 + 滚动升级 + 断线重连;机器要下线时,先断开链接,重连到未下线机器;
场景:
- IM;
- 多人在线游戏;
- 协同编辑工具;
demo: