CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
WebSocket 实时通信/课时/水平扩展
RawBlame
课时目录12 节

WebSocket 实时通信

  1. 01WebSocket 是什么
  2. 02协议与握手
  3. 03Spring WebSocket
  4. 04STOMP 消息
  5. 05浏览器客户端
  6. 06Next.js 与 WebSocket
  7. 07鉴权与安全
  8. 08水平扩展
  9. 09SSE 对照
  10. 10Nginx 反代升级
  11. 11测试与调试
  12. 12综合练习

水平扩展

Sticky session、Redis 广播桥接概念。

30 分钟

水平扩展

单实例 enableSimpleBroker 只在 内存 广播;多 Spring Boot 副本时,A 实例上的用户收不到 B 实例上的消息。需 Sticky Session 或 Redis 桥接(redis-pubsub)。

学习目标

  • 理解 WebSocket 与无状态 REST 的扩展差异
  • 配置 Nginx ip_hash / cookie sticky
  • 知道 Redis Pub/Sub 做跨节点 fan-out 的思路

问题示意

用户1 ──WS──► 实例 A ── publish ──► 仅 A 的订阅者收到
用户2 ──WS──► 实例 B ── ✗ 收不到 A 上的消息

REST 可任意负载均衡;WS 连接 粘在某实例 直到断开。

方案一:Sticky Session

upstream coderoadmap_backend {
    ip_hash;  # 或 sticky cookie
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
}

见 ws-nginx。缺点:实例重启时该节点上的连接全断。

方案二:Redis 消息桥

实例 A ──► Redis channel lab.chat ──► 实例 A、B 都订阅 ──► 各自推给本地 WS 会话

Spring 可换 RabbitMQ / Redis 作为外部 Broker(enableStompBrokerRelay),替代 enableSimpleBroker:

@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
    registry.enableStompBrokerRelay("/topic", "/queue")
            .setRelayHost("redis") // 或 RabbitMQ
            .setRelayPort(61613);
}

与 redis-pubsub 概念一致:发布到 channel,所有订阅者收到。

会话状态

数据存放说明
聊天历史MySQLREST 写入
在线 presenceRedis SETTTL 心跳
WS 连接实例内存不可共享

redis-session 的会话共享 不替代 WS 连接共享,只解决 HTTP 登录态。

练习

  • 画双实例 + Redis 桥的消息路径
  • 说明 ip_hash 在 NAT 后校园网的弊端
  • 查 Spring 文档: vs 选型表
SimpleBroker
StompBrokerRelay

小结

扩展 WS = 粘连接或外置 Broker。 下一课 SSE 单向推送对照。

加载本节练习…
← 上一课鉴权与安全下一课 →SSE 对照