在开发一款休闲类实时游戏的过程中,我一开始使用了 socket.io,但它在原生平台上的兼容性问题令人头疼。并且臃肿的框架,对我来说,用它更多时候是在“适配它”,而不是“用它解决问题”。后来我改用 原生 WebSocket,服务器端使用 Node.js 的 ws 模块,虽然通信足够底层,提供了很大的灵活性,但无论是客户端还是服务端的功能都极其基础。心跳机制、断线重连、消息回调、房间管理……这些全都需要自己来封装。
与此同时,Node.js 的单线程、内存受限、GC 特性,可能在高并发时成为瓶颈,让人对其是否能胜任“海量玩家在线”场景产生怀疑。
所以,我决定自己造一个简单又高效的 WebSocket 分布式框架,可以 最大程度地保留原生 WebSocket 的灵活性,解决那些“原生灵活但需要自己扩展,无法专注于业务层”、“单机好用但分布式无从入手”的痛点。它封装了心跳机制、断线重连、事件回调、房间管理等基础功能,它完全遵循 WebSocket 协议标准,不依赖其他上层框架,保持运行逻辑的透明与可控。同时,它打破了 Node.js 在多进程与分布式部署上的限制,不管是释放多核性能,还是跨物理机部署,都能自然协作、无感切换。单机和分布式的消息下发保持一样的逻辑,不需要分布式的时候一键即可回退单机模式。同时它也是一个轻量级的跨服务事件通道,适用于更广泛的服务间通信场景。
框架仅包含两个模块,确保轻量:
WebSocketCrossServerAdapter(服务端通信核心)
一个为分布式架构而设计的通信适配器,支持服务端事件广播、跨服务器消息传递、房间管理等功能,适用于游戏服务、实时系统、微服务间通信等场景。
主要能力包括:
• 跨节点事件通信,支持回调/Promise
• Redis 分布式支持:动态添加节点、全通道订阅、压缩传输
• 分布式房间广播、客户端追踪、全局用户统计
• 事件优先本地响应,自动路由目标节点
• 支持以下多粒度消息发送能力(不依赖连接在哪个节点):
○ 全局广播(所有节点、所有客户端)
○ 单客户端发送(跨节点精确定位)
○ socketId 批量发送
○ 分布式房间广播
WebSocketConnector(客户端连接管理器)
一个轻量、简洁的 WebSocket 客户端类,适用于任何基于标准 WebSocket 协议的平台,例如浏览器、Node.js、Electron、React Native、小程序、Cocos Creator 等环境。内置心跳机制、断线重连、事件回调、延迟反馈等功能。
我的愿景:
我希望开发者在用这个框架时,能把精力放在游戏玩法和业务逻辑上,而不是被心跳、断线重连、跨服通信这些基础设施折腾半天。分布式不该是高高在上的概念,无论是单机开发还是多台服务器部署,都应该能一键切换,不需要改动任何逻辑。
哪怕是个人开发的游戏,只要懂 JavaScript,就能轻松搭建起 WebSocket 实时系统,不需要依赖后端团队,也能独立完成前后端联调,真正提升开发效率。
为了让别人也能看懂、用得上,从代码设计到文档编写,我都得换位思考、反复打磨。不是“我能跑起来”就行,而是“别人能一看就明白”。过程确实挺累,但这就是开源的意义吧。
经过千难万苦,我终于在昨天完成了开源发布,并在国外技术论坛上发了介绍文章。很快就收到了不少正面的反馈,也收到了负面的声音——有人甚至吐槽房间机制“只适合聊天场景”。我只想说,房间只是一个逻辑分组、广播单元、权限域划分的抽象概念,和聊天没半毛钱必然关系。
尽管如此,从 GitHub 后台数据和 npm 下载量来看,一晚上就有几十个下载,这也说明了一个事实:不需要的人在挑骨头,需要的人早就开始悄悄试用了。这也是一种动力吧。
所有文档都提供了中英双语支持,源码结构简单,核心只包含两个类文件,便于阅读和扩展。设计思路和逻辑我也在文档中详细说明了。
分布式的场景非常多样,欢迎大家测试,有什么想法或问题,随时交流!
GitHub 地址:https://github.com/LiuYiSong/websocket-cross-server-adapter