mcpField
W
websocket-engineer

websocket-engineer

github.com/404kidwiz开发137 次安装
代码仓库

关于 websocket-engineer

websocket-engineer 是面向实时通信工程师的技能,涵盖 WebSocket 与事件驱动系统的设计和运维。内容包括架构选择、扩展、连接恢复、性能与安全,适用于聊天、仪表盘和游戏。

主要功能

  1. 01WebSocket 与 Socket.IO 架构
  2. 02使用 Redis Adapter 横向扩展
  3. 03SSE 与协议选择指南
  4. 04连接检测与重连实践
  5. 05性能和安全检查清单

适用场景

  1. 01设计实时聊天系统
  2. 02跨服务器扩展 Socket.IO
  3. 03排查连接中断与心跳故障
  4. 04为实时更新选择推送协议

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/404kidwiz/claude-supercode-skills --skill websocket-engineer

安装后在 Claude Code 中输入/websocket-engineer确认已加载。

详细介绍

WebSocket 与实时通信工程师

目的

提供实时通信专业知识,专注于 WebSocket 架构、Socket.IO 和事件驱动系统。构建低延迟双向通信系统,支持数百万个并发连接。

适用场景

  • 构建聊天应用、实时仪表盘或多人游戏
  • 横向扩展 WebSocket 服务端(Redis Adapter)
  • 实现用于单向更新的“服务器发送事件”(SSE)
  • 排查连接断开、心跳失败或 CORS 问题
  • 设计有状态连接架构
  • 从轮询迁移到推送技术

示例

示例 1:实时聊天应用

场景: 构建面向企业使用的可扩展聊天平台。

实现:

  1. 使用 Socket.IO 设计 WebSocket 架构
  2. 实现 Redis Adapter 以支持横向扩展
  3. 创建基于房间的消息路由
  4. 添加消息持久化和历史记录
  5. 实现在线状态系统(在线/离线)

结果:

  • 支持 100,000+ 个并发连接
  • 消息平均送达时间为 50ms
  • 连接稳定性达 99.99%
  • 可无缝横向扩展
示例 2:实时仪表盘系统

场景: 构建具备亚秒级更新能力的实时分析仪表盘。

实现:

  1. 实现低延迟 WebSocket 服务端
  2. 创建高效的消息批处理策略
  3. 添加 Redis 发布/订阅,以支持多服务端
  4. 实现客户端更新合并
  5. 为大型负载添加压缩

结果:

  • 仪表盘更新耗时不到 100ms
  • 支持 10,000 个并发仪表盘视图
  • 与轮询相比,服务端负载降低 80%
  • 重新连接期间零数据丢失
示例 3:多人游戏后端

场景: 构建低延迟多人游戏服务端。

实现:

  1. 使用二进制协议实现 WebSocket 服务端
  2. 创建权威服务端架构
  3. 添加客户端预测与状态校正
  4. 实现延迟补偿算法
  5. 设置服务端物理模拟和碰撞检测

结果:

  • 端到端延迟为 30ms
  • 每个服务端支持 1000 名并发玩家
  • 即使网络状况变化,游戏仍能流畅运行
  • 服务端权威机制可抵御作弊

最佳实践

连接管理
  • 心跳:实现 ping/pong 以检查连接状态
  • 重新连接:采用带退避机制的自动重新连接
  • 状态清理:断开连接时妥善清理状态
  • 连接数限制:防止资源耗尽
扩展
  • 横向扩展:使用 Redis Adapter 支持多服务端
  • 粘性会话:正确配置负载均衡器
  • 消息路由:为广播/单播实现高效路由
  • 速率限制:防止滥用和过载
性能
  • 消息批处理:在适当情况下批量处理消息
  • 压缩:压缩消息(permessage-deflate)
  • 二进制协议:对性能关键型数据使用二进制协议
  • 连接池:高效复用客户端连接
安全
  • 身份验证:在握手时进行验证
  • TLS:始终使用 WSS
  • 输入验证:验证所有传入消息
  • 速率限制:限制连接和消息速率


2. 决策框架

协议选择
What is the communication pattern?
│
├─ **Bi-directional (Chat/Game)**
│  ├─ Low Latency needed? → **WebSockets (Raw)**
│  ├─ Fallbacks/Auto-reconnect needed? → **Socket.IO**
│  └─ P2P Video/Audio? → **WebRTC**
│
├─ **One-way (Server → Client)**
│  ├─ Stock Ticker / Notifications? → **Server-Sent Events (SSE)**
│  └─ Large File Download? → **HTTP Stream**
│
└─ **High Frequency (IoT)**
   └─ Constrained device? → **MQTT** (over TCP/WS)
扩展策略
规模架构后端
< 10k 用户单体 Node.js单实例
10k - 100k集群Node.js Cluster + Redis Adapter
100k - 1M微服务Go/Elixir/Rust + NATS/Kafka
全球边缘Cloudflare Workers / PubNub / Pusher
负载均衡器配置
  • 粘性会话: Socket.IO(握手阶段)必需。
  • 超时: 增加空闲超时时间(例如,60s 以上)。
  • 请求头: Upgrade: websocket,Connection: Upgrade。

危险信号 → 升级至 security-engineer:

  • 允许来自任意 Origin(*)且携带凭据的连接
  • 连接请求没有速率限制(存在 DoS 风险)
  • 在 URL 查询参数中发送 JWT(会记录在代理日志中)——改用 Cookie 或初始消息


3. 核心工作流

工作流 1:可扩展的 Socket.IO 服务(Node.js)

目标: 构建能够跨多个核心/实例扩展的聊天服务。

步骤:

  1. 安装依赖

    npm install socket.io redis @socket.io/redis-adapter
    
  2. 实现(server.js)

    const { Server } = require("socket.io");
    const { createClient } = require("redis");
    const { createAdapter } = require("@socket.io/redis-adapter");
    
    const pubClient = createClient({ url: "redis://localhost:6379" });
    const subClient = pubClient.duplicate();
    
    Promise.all([pubClient.connect(), subClient.connect()]).then(() => {
      const io = new Server(3000, {
        adapter: createAdapter(pubClient, subClient),
        cors: {
          origin: "https://myapp.com",
          methods: ["GET", "POST"]
        }
      });
    
      io.on("connection", (socket) => {
        // User joins a room (e.g., "chat-123")
        socket.on("join", (room) => {
          socket.join(room);
        });
    
        // Send message to room (propagates via Redis to all nodes)
        socket.on("message", (data) => {
          io.to(data.room).emit("chat", data.text);
        });
      });
    });
    


工作流 3:生产环境调优(Linux)

目标: 在单台服务上处理 50k 个并发连接。

步骤:

  1. 文件描述符

    • 增加限制:ulimit -n 65535。
    • 编辑 /etc/security/limits.conf。
  2. 临时端口

    • 增加范围:sysctl -w net.ipv4.ip_local_port_range="1024 65535"。
  3. 内存优化

    • 如果不需要 Socket.IO 的功能,使用更轻量的 ws。
    • 如果 CPU 使用率较高,则禁用“每条消息压缩”(压缩)。


5. 反模式与注意事项

❌ 反模式 1:有状态的单体架构

表现:

  • 在 Node.js 内存中存储 users = [] 数组。

问题:

  • 扩展到 2 台服务后,服务 1 上的用户 A 无法与服务 2 上的用户 B 通信。
  • 内存泄漏会导致进程崩溃。

正确做法:

  • 使用 Redis 作为状态存储(适配器)。
  • 服务无状态,后端有状态(Redis)。
❌ 反模式 2:“惊群效应”

表现:

  • 服务重启,100,000 个客户端立即重新连接。
  • CPU 使用率飙升,导致服务再次崩溃。

问题:

  • 连接握手开销很大(TLS + 身份验证)。

正确做法:

  • 随机抖动: 客户端等待 random(0, 10s) 后再重新连接。
  • 指数退避: 等待 1s、再等 2s、再等 4s……
❌ 反模式 3:阻塞事件循环

表现:

  • socket.on('message', () => { heavyCalculation(); })

问题:

  • Node.js 是单线程的。一个繁重任务会阻塞所有 10,000 个连接。

正确做法:

  • 将工作卸载到 Worker Thread 或 Message Queue(RabbitMQ/Bull)。


7. 质量检查清单

可扩展性:

  • **适配器:**已配置 Redis/NATS 适配器以支持多节点。
  • **负载均衡器:**已启用粘性会话(如果使用轮询回退)。
  • **操作系统限制:**已提高文件描述符限制。

弹性:

  • **重新连接:**已实现指数退避和抖动。
  • **心跳:**已配置 Ping/Pong 间隔(小于负载均衡器超时时间)。
  • **回退:**已启用并测试 Socket.IO 回退机制(HTTP 长轮询)。

安全性:

  • **WSS:**已启用 TLS(安全 WebSocket)。
  • **身份验证:**握手时会正确验证凭据。
  • **速率限制:**已启用连接速率限制。

反模式

连接管理反模式
  • 无心跳:不检测已失效的连接——应实现 ping/pong
  • 内存泄漏:不清理已关闭的连接——应实现适当的清理机制
  • 无限次重新连接:无退避机制地反复循环——应实现指数退避
  • 需要粘性会话:未按无状态方式设计——应使用 Redis 存储状态
扩展反模式
  • 单台服务器:无法扩展到多个实例——应使用 Redis 适配器
  • 无负载均衡:直接连接到服务器——应使用合适的负载均衡器
  • 广播风暴:盲目向所有连接发送消息——应针对特定连接
  • 连接饱和:每台服务器的连接过多——应进行水平扩展
性能反模式
  • 消息臃肿:消息过大且结构不合理——应使用高效的消息格式
  • 无节流:发送速率不受限制——应实现速率限制
  • 阻塞操作:同步处理——应使用异步处理
  • 无监控:盲目运行——应实现连接指标监控
安全反模式
  • 无 TLS:使用未加密的连接——始终使用 WSS
  • 身份验证薄弱:只进行简单的令牌验证——应实现适当的身份验证
  • 无速率限制:容易受到滥用——应限制连接数和消息数
  • CORS 未限制:跨源访问开放——应正确配置 CORS

评论

支持 Markdown