App.rpcto所需参数serverid,从哪里来哪?首先pitaya框架有以下几个函数:
GetServer() *cluster.Server
GetServerByID(id string) (*cluster.Server, error)
GetServersByType(t string) (map[string]*cluster.Server, error)
GetServers() []*cluster.Server
GetServer是获取本进程在集群中的服务器信息,里面包含服务器id等,
GetServers是获取集群中所有连接的服的信息,当将etcd设为集群时,可获取所有服信息.
假如后端服务器是个房间服,每进来一个玩家我们就将服务器id和人数纪录到redis中zset表,每种服务器类型存一个表,比如房间类进程表.在处理消息时,我们可以查询数据库服,知道服务器类型名,通过房间类进程表,按照设定的算法求人数最少的那个房间进程服务器id或者让多一些的玩家一起玩的算法去做.这样就能得到一个进程服务器id.玩家初次登录时可以这样,而之后的信息处理,可以存储服务器进程id到底层玩家的session中,这样再有消息发来可以直接转发到指定玩家已进入的服中.session的绑定是登录时通过bind连接玩家和session的.
Pitaya底层是封装了组和组件的概念的,组是指同一个房间或者同一个广场中的玩家组成的组,是玩家进入房间或者创建房间时,创建或者加入的组.组件是类似go的接口一样,用来处理客户端消息和收发处理rpc消息的函数组成的接口.
所以通过玩家所在组,可以直接发送消息给组内成员.
组件是能实现多组件名字在各自后端服务器进程中运行,并与前端服务器关联的.
多服情况下route的获取与设置:
通过例子中的DocsHandler.Docs可以获取到服务器类型名,组件名,函数名,三者的关系,存储"类型名字+函数名"与组件名到map中,在底层消息发来时就可以通过类型名+函数名(就是消息的名字)找到组件名,这样就组装出了pitaya底层需要的route(服务器类型名:组件名:函数名).
关于跨服,比如从广场到自己房间,通过广场与房间之间rpc通信(实际是通过nats通信),设置玩家登录时所登录的前端服务器中玩家session数据即可,通过session中数据,实现消息转发到新的服上.
pitaya特别适合快速接入的,分布式游戏服务框架,适合横向扩展,而且go语言本身支持高并发.