Skip to content

WebSocket 实时通信架构分析

高层架构

WebSocket 实时通信架构可以分为以下几个层次:

┌─────────────────────────────────────────────────┐
│           应用层 (Application)               │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  路由    │  │  控制器   │  │  中间件   ││
│  └──────────┘  └──────────┘  └──────────┘│
├─────────────────────────────────────────────────┤
│           WebSocket 层                      │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  服务器  │  │  客户端   │  │  消息处理 ││
│  └──────────┘  └──────────┘  └──────────┘│
├─────────────────────────────────────────────────┤
│           业务层 (Business)                  │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  房间    │  │  用户    │  │  消息     ││
│  └──────────┘  └──────────┘  └──────────┘│
├─────────────────────────────────────────────────┤
│           存储层 (Storage)                   │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  Redis   │  │  MongoDB │  │  PostgreSQL││
│  └──────────┘  └──────────┘  └──────────┘│
└─────────────────────────────────────────────────┘

WebSocket 服务器架构

服务器组件

┌─────────────────────────────────────────────────┐
│            WebSocket 服务器                │
├─────────────────────────────────────────────────┤
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  连接管理 │  │  消息路由 │  │  房间管理 ││
│  └──────────┘  └──────────┘  └──────────┘│
├─────────────────────────────────────────────────┤
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  消息队列 │  │  事件系统 │  │  错误处理 ││
│  └──────────┘  └──────────┘  └──────────┘│
└─────────────────────────────────────────────────┘

连接生命周期

┌─────────┐       ┌─────────────┐       ┌──────────┐
│  客户端  │──────▶│  WebSocket  │──────▶│  服务器  │
└─────────┘       └─────────────┘       └──────────┘
     │                   │                   │
     │  1. 握手请求       │  2. 握手响应
     │◀──────────────────│◀──────────────────│
     │                   │                   │
     │  3. 连接建立       │
     │◀───────────────────────────────────────│
     │                   │                   │
     │  4. 消息交换       │
     │◀──────────────────────────────────────▶│
     │                   │                   │
     │  5. 关闭连接       │
     │──────────────────────────────────────▶│

消息处理架构

消息流程

┌─────────────────────────────────────────────────┐
│              消息处理流程                   │
├─────────────────────────────────────────────────┤
│  1. 接收消息                              │
│     - 解析消息格式                        │
│     - 验证消息内容                        │
├─────────────────────────────────────────────────┤
│  2. 路由消息                              │
│     - 确定目标接收者                      │
│     - 选择发送方式                        │
├─────────────────────────────────────────────────┤
│  3. 处理消息                              │
│     - 执行业务逻辑                        │
│     - 更新状态                            │
├─────────────────────────────────────────────────┤
│  4. 发送响应                              │
│     - 发送给目标客户端                    │
│     - 记录消息日志                        │
└─────────────────────────────────────────────────┘

消息类型

┌─────────────────────────────────────────────────┐
│              消息类型                     │
├─────────────────────────────────────────────────┤
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  文本    │  │  二进制   │  │  JSON    ││
│  └──────────┘  └──────────┘  └──────────┘│
├─────────────────────────────────────────────────┤
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  广播    │  │  单播     │  │  多播     ││
│  └──────────┘  └──────────┘  └──────────┘│
└─────────────────────────────────────────────────┘

房间管理架构

房间结构

┌─────────────────────────────────────────────────┐
│              房间管理                     │
├─────────────────────────────────────────────────┤
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  房间A   │  │  房间B   │  │  房间C   ││
│  └──────────┘  └──────────┘  └──────────┘│
├─────────────────────────────────────────────────┤
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  用户1   │  │  用户2   │  │  用户3   ││
│  └──────────┘  └──────────┘  └──────────┘│
└─────────────────────────────────────────────────┘

关系:
房间 ──N──M── 用户

房间操作

┌─────────────────────────────────────────────────┐
│              房间操作                     │
├─────────────────────────────────────────────────┤
│  1. 创建房间                              │
│     - 生成房间 ID                        │
│     - 初始化房间状态                      │
├─────────────────────────────────────────────────┤
│  2. 加入房间                              │
│     - 验证用户权限                        │
│     - 添加用户到房间                      │
├─────────────────────────────────────────────────┤
│  3. 离开房间                              │
│     - 从房间移除用户                      │
│     - 清理空房间                          │
├─────────────────────────────────────────────────┤
│  4. 房间消息                              │
│     - 广播给房间内所有用户                │
│     - 记录消息历史                        │
└─────────────────────────────────────────────────┘

扩展性架构

水平扩展

┌─────────────────────────────────────────────────┐
│              负载均衡                     │
├─────────────────────────────────────────────────┤
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  服务器1 │  │  服务器2 │  │  服务器3 ││
│  └──────────┘  └──────────┘  └──────────┘│
├─────────────────────────────────────────────────┤
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  Redis   │  │  消息队列 │  │  数据库   ││
│  └──────────┘  └──────────┘  └──────────┘│
└─────────────────────────────────────────────────┘

消息分发

┌─────────────────────────────────────────────────┐
│              消息分发                     │
├─────────────────────────────────────────────────┤
│  1. 接收消息                              │
│     - 任意服务器接收消息                    │
├─────────────────────────────────────────────────┤
│  2. 发布消息                              │
│     - 发布到消息队列                      │
├─────────────────────────────────────────────────┤
│  3. 订阅消息                              │
│     - 所有服务器订阅消息队列              │
├─────────────────────────────────────────────────┤
│  4. 转发消息                              │
│     - 服务器将消息转发给连接的客户端        │
└─────────────────────────────────────────────────┘

总结

WebSocket 实时通信架构涉及多个层次,从应用层到存储层。理解 WebSocket 的架构设计,有助于我们构建高性能、可扩展的实时应用。