最近需要部署搭建个 WebSocket 的游戏网关服务端, 考虑之后从 Java 之中选取设计方案; 而这里首先排除 Spring 全家桶系列, 因为内部集成太过冗余且对底层操作也比较麻烦, 最后敲定方案采用仅仅对网络工具方法抽象的 Vert-X.
这里 Actor 最开始考虑 akka, 但是目前最新版本已经从开源协议转为商业协议, 为了后续规避潜在的商业纠纷最后采用同源的开源替代 pekko.
而消息交换协议, 最开始在单纯二进制和 protbuf 之间考虑, 主要问题是 protobuf 协议生成的类文件对于项目侵入太严重; 所以考虑在三之后选择性能更好且通用型更强的 msgpack.
建议对 WebSocket 协议规范 rfc6455 进行学习, 因为相对于 TCP 来说底层已经做好 帧(Frame) 概念处理, 所以直接只用处理消息接收和推送即可.
对于 WebSocket 来说基本上传递数据格式已经内置数据类型:
0x1: 文本内容 0x2: 二进制内容 0x8: 关闭连接 0x9: Ping 0xA: Pong 这主要是区分好消息格式发送什么, 用来推送给 Actor 内部消息来处理不同的业务逻辑.
另外需要设计好 actor 拓扑图, 需要对 actor 功能做基本设计分布:
[ActorSystem,最基础的系统] | | [Supervisor,核心管理器负责监控所有 Worker] --- [Worker:WebSocket,网络层负责协调客户端和Actor关联,同时负责动态会话创建] | | | | | |- [Worker * N:(UUID) Session, 每个会话都动态创建 actor] | | | |- [会话Actor是不断动态创建的].