随着社交应用、在线客服和实时协作工具的发展,WebSocket 技术在高并发实时通信场景中发挥重要作用。传统 HTTP 请求模式在高频消息场景下容易出现延迟和阻塞,无法满足用户实时交互体验。本文结合作者在厦门一家社交应用项目的实践经验,分享 Node.js 高并发 WebSocket 服务设计、消息分发优化以及性能调优经验,为实时通信系统提供参考。
一、为什么选择 Node.js + WebSocket
厦门社交应用特点:
-
实时聊天:文字、图片、表情、文件
-
高并发:峰值在线用户超过 50 万
-
低延迟:消息 P99 延迟 < 100ms
-
可扩展:支持多机房分布式部署
选择 Node.js 原因:
-
单线程事件循环,天然非阻塞 IO
-
WebSocket 库成熟:
ws、socket.io -
高并发连接下资源占用低
-
开发效率高,便于快速迭代
二、系统架构设计
系统采用微服务 + 消息队列设计:
客户端 → WebSocket 网关 → 消息路由服务 → 用户/群组服务 → Redis / Kafka → 客户端
核心模块
-
WebSocket 网关:管理长连接,负载均衡
-
消息路由服务:异步分发消息至目标用户或群组
-
用户/群组服务:用户状态管理、群组信息存储
-
消息队列:Kafka 实现跨机房消息同步
-
缓存:Redis 保存在线状态、离线消息
架构原则:
-
事件驱动、异步处理
-
服务解耦,支持水平扩展
-
高可用和容错设计
三、高并发 WebSocket 连接管理
单机支持 10 万+ WebSocket 连接,需要优化:
-
连接池管理
-
事件循环非阻塞处理
-
心跳机制,避免僵尸连接
-
分片推送,避免单次阻塞
示例:Node.js ws 服务器
const WebSocket = require('ws'); const wss = new WebSocket.Server({ port: 8080 }); wss.on('connection', ws => { ws.isAlive = true; ws.on('pong', () => ws.isAlive = true); ws.on('message', msg => { handleMessage(ws, msg); }); }); setInterval(() => { wss.clients.forEach(ws => { if (!ws.isAlive) return ws.terminate(); ws.isAlive = false; ws.ping(); }); }, 30000);
四、异步消息分发与高吞吐优化
消息分发流程:
-
消息入队(Redis 或 Kafka)
-
异步消费
-
查找在线客户端
-
分片推送
示例:
async function handleMessage(ws, msg) { const message = JSON.parse(msg); const targets = await getOnlineUsers(message.to); targets.forEach(client => client.send(JSON.stringify(message))); }
优化点:
-
批量消息推送,减少 IO 调用
-
Redis 缓存用户在线状态
-
使用 Node.js 内置
setImmediate或process.nextTick避免事件循环阻塞
五、离线消息处理
用户离线时,消息需可靠存储:
-
Redis 列表缓存离线消息
-
用户上线时异步推送
-
消息持久化至 MongoDB 或 MySQL
示例:
async function storeOfflineMessage(userId, message) { await redis.lpush(`offline:${userId}`, JSON.stringify(message)); }
六、水平扩展与负载均衡
高并发场景采用多机房部署:
-
Nginx / LVS 负载均衡 WebSocket 连接
-
消息路由服务通过 Kafka 实现跨节点同步
-
Redis Cluster管理在线状态和离线消息
优势:
-
用户在不同节点上线,消息依旧可投递
-
系统可动态扩容节点
七、监控与性能调优
关键指标:
-
在线连接数
-
消息处理延迟
-
消息队列堆积量
-
心跳丢包率
实践经验:
-
使用 Prometheus + Grafana 监控指标
-
队列堆积超过阈值触发扩容
-
心跳检测保证连接稳定
八、性能测试结果
厦门社交平台实际指标:
| 指标 | 单机性能 | 分布式性能 |
|---|---|---|
| 在线用户 | 10 万 | 50 万 |
| 消息延迟 P99 | 80ms | 95ms |
| CPU 占用 | 70% | 60% |
| 内存占用 | 4GB | 18GB |
| 消息丢失率 | <0.1% | <0.1% |
系统峰值承载稳定,满足日常高并发实时聊天需求。
九、经验总结
-
事件驱动 + 异步消息分发是高并发 WebSocket 核心
-
Redis/Kafka实现跨节点可靠通信
-
心跳 + 连接池避免僵尸连接
-
离线消息缓存与异步推送保证消息可靠性
-
监控与水平扩展保障系统长期稳定
通过该架构,厦门社交平台实现了百万级实时在线、低延迟消息分发和高可用运行,为移动社交应用提供了可靠的技术支撑。