需求
聊天服务器、webrtc、游戏服务器等都需要一个节点来作为主节点来维护服务的状态,该主节点上运行这不同于其他节点的程序,每次开发新应用都需要写一套新的程序用于新应用的主节点
打算写个通用而简单的通讯枢纽组件来应对这一需求
技术选用
go运行内存占用极低,使用简单,易于上云,索性用go
websocket夸平台,能用于h5
概念
Room(房间)
跟游戏重的房间差不多,只有在同一房间里才能相互通讯
User(用户)
客户端携带有效验证信息才能与通讯枢纽组件通讯,在通讯组件中生成有唯一标识
Sytem(系统)
主节点没有用户,虚拟一个特殊用户:系统
Message(消息)
数据结构
:::info
type Message struct {
Room int64
FromGroup int64 // 来自哪个组
FromUser int64 // 来自哪个用户
ToUser int64 // 发送给哪个用户
ToGroup int64 // 发送给哪个用户
Content string
CmdResult *GeneralCmdResult
}
:::
Group(组)和Rule(规则) !关键!
组包含多个用户,规则定义了组与组之间能否通讯
特殊组
ID=1,默认组,房间里的所有人都在这个组中
ID=2,表示系统,虚拟的组
ID=3,表示用户,虚拟的组
规则类型与iptables中的规则链,依据FromGroup、ToGroup来寻找第一条符合的规则
特殊规则
当ToGroup=2,为系统命令(参见 系统命令),不会转发这种消息,不受Rule的影响
当ToGroup=3,发送给单个用户,需要指定ToUser
对于除了ToGroup=2之外的消息,系统会验证FromGroup,ToGroup是否合理,再转发给Group中所有用户
Auth鉴权服务
每个来自客户端的新连接需要携带验证信息,System会将这些信息发送给指定鉴权服务来获取用户信息,依据这些信息为用户生成唯一标识
系统命令
// 特殊指令 client -> server
// rooms
// ls-room offset limit : list rooms
// build-room -public=true -password=123 -desc= roomName example: build-room -public=true -password=1234 -desc=222 room1
// del-room roomId
// // transfer userId
//
// room roomId : list users and groups and rules
// kick roomId userid
// join roomId password
// quit roomId : quit room
// build-group roomId -groupId=userId1,userId2 ... build-group -6=1,2 -7=2 7092241525490286622
// build-rule roomId -1=1,2,3,-2,-4 build-rule -1=6,-7 -2=7,-6,0 7092241525490286622 // -2中有0标识reject,
//
// 响应 server -> client
// user-rooms -single
// user-down -all
// user-up -all
// user-join -all
// user-leave -all
// user-kicked -all
// room refresh room info
// room-deleted -all
// rooms -single
// others are message
改进
- 全是内存数据,考虑改用redis或dynamoDB