架构设计:负责网络、定时、坐下、站起、重连等,支持多类游戏的无锁房间
2024-08-04 10:00:00
重中之重就是想实现无锁!无锁!无锁!
源码
预计还会实现gate_server
,接受并保持websocket
长连接,按需双向流到game_server
进行消息转发
未来上述服务均会以容器的形式由k8s
自动化部署、扩展、管理
实现简单示例:自创的骰子游戏
服务端
cd ~/go/src/github.com/panshiqu/server/game_server
go run main.go
客户端
cd ~/go/src/github.com/panshiqu/server/game_server/game/dice/client
go run main.go -u=1 -r=1 -seat=-1 -name=dice -auto=false -print=false
# 输入 shake 或 print
# go run main.go -print
# 以上展示两种安全打印内存的方式
请查看主要对象的接口,若是能从命名、注释、查看引用就能很快理解的,下面大概率是不赘述的
游戏主要接口调用时机
Init(IRoom) error
房间创建初始化时,调用失败会导致房间创建失败Reconnect(IUser)
连接即坐下,用户已在此房间有座SitDown(IUser)
连接即坐下,用户首次进入此房间StandUp(IUser, int) bool
断开即站起或其它譬如游戏结算后站起离线用户OnDisband(int64)
停服解散所有房间或其它譬如游戏结算后房间因无人而解散
框架开放的个别接口(赋予游戏的能力)
room.Disband()
直接对房间发起解散user.Disband()
借用户发起解散其所在房间user.Disconnect(int)
主动断开客户端连接-
user.StandUp(int)
站起用户 user.SetData(any)
为用户设置任意数据room.Send[Pb]
支持排除部分用户
核心设计
- 连接即坐下,断开即站起
- 游戏可以拒绝站起,将视为离线,框架负责识别重连
- 全局错误码,
pb.ErrorResponse
即错误,返回错误即回复,开发环境错误回复填充调用路径 - 框架为适应各类游戏仅负责必要逻辑,基本不校验游戏的调用,不集成用户准备、房间游戏状态等逻辑
- 好用的定时器模块,支持添加重复定时、定时器支持重置、停止、获取剩余时间,并发亦可安全
简单说明
- 指定数量
config.Seat
座位以外是旁观席且会自动扩容 - 游戏在用户落座后检测到不符合准入条件可调用旁观接口(待实现)将用户移到旁观席
- 框架因房间已满用户落座旁观席,待有座时游戏可调用换座接口(待实现)将用户移到可游戏座位
- 用户在A房间却想进B房间,创建却无人进的B房间当前是懒解散,建议游戏实现逻辑解散不活跃的房间
gate_server
收到game_server
的pb.Cmd_Disconnect
会调用stream.CloseSend
来允许GracefulStop
关于匹配(待实现)
- 当前进入游戏必须携带房间编号,未来会实现
match_server
微调雪花算法来生成房间编号 - 基于规则优先返回已有的房间(金币场),实现打立出局、定局积分等赛制(比赛场)
- 考虑扩展
game_server
支持未携带房间编号的单服匹配(小微游戏) - 敬请期待实现后再来阐述更多细节
写在最后
- 写代码的时候,太多想写进博客,确实也有备忘,最后复看代码,还是不要啰哩啰嗦啦
- 基于此刻源码成文,代码大概率会继续完善,也会尽量同步更新此文,但话不绝对