闲聊go开源微服务框架pitaya(2)

1 篇文章 0 订阅
1 篇文章 0 订阅

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中数据,实现消息转发到新的服上.

0e90b319a0f448678675cc1f941fe319.bmp

pitaya特别适合快速接入的,分布式游戏服务框架,适合横向扩展,而且go语言本身支持高并发.

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值