站务联系

高性能分布式游戏服务器框架(2)

发布时间:2021-03-17   来源:网络整理    
字号:

游戏服务器框架的看法

自己心中也对游戏服务器框架有一些自己的见解,最终决定造这个轮子。

高性能,支持多核

这在未来开发,扩展,维护会轻松这些,比如Python那样一台服务器跑上百个进程的游戏服务器,维护上去就太使人头痛

支持解释器

协程在客户端中应用不大,但在服务器开发中可以发挥极大的威力:

高并发,能最大的运用cpu资源异步开发同步化,免去了反弹函数设计,避免了地狱反弹

支持分布式,但也支持单进程布署

有些框架写一个demo都须要启动多个进程,实际上在项目前期或许一台服务器就能否支持了,我希望实现一个既可以单进程布署又可以分布式布署的框架

单进程才能实现高性能分布式布署不用重新设计编码

这个需求的实现主要靠约定,只要开发的时侯按分布式环境来开发,代码通常都不需要移植

有丰富的客户端开发库

让开发者埋头业务开发,不同再去造轮子了

mqant框架的构架

mqant就是根据以上的思路设计的,同时设计思路上参考了Pomelo,并且也使用了leaf框架的部份代码。

golang原本支持高性能,支持多核

支持轮询

因此mqant的RPC通讯都可以按同步来写, 例如:

//远程调用 Login模块的getRand方法
result,err:=m.RpcInvoke("Login","getRand",roomName)
if err==nil{
    //getRand 调用成功了,再做下面的远程调用
    result,err:=m.RpcInvoke("Login","getName",roomName)
}
//上面的调用都执行完了才执行下面的代码
....
result 是远程调用成功以后的返回值
err     是远程调用失败的信息
以上代码非常清晰,跟普通的函数调用基本一样,但如果用回调函数的话,如下:
m.RpcInvoke("Login","getRand",roomName,func(result string,err string){
        if err!=nil{
            m.RpcInvoke("Login","getName",roomName,func(result string,err string){
                //调用都执行完了才执行下面的代码
            })
        }
})
...

支持分布式,但也支持单进程布署

mqant是按模块为单位来界定功能模块的,可以将一组模块置于一个进程来运行,也可以将所有模块置于同一个进程来运行(即单进程机制)

mqant模块间约定按标准的RPC来互相读取

RPC底层分两种方式

1. 基于golang chan的单进程通信
2. 基于rabbitmq的跨进程通信

RPC会按照模块间的布署状况采用适当的通讯方法,以达到在单进程机制下RPC通讯的最低功耗耗损跟最快的响应时间

有丰富的客户端开发库

mqant没有考虑帮开发者造一个客户端开发库,而是采用了现在物联网中十分流行mqtt合同来作为通讯合同,mqtt本来就有各个平台的客户端开发库,因此可以直接用mqtt的客户端开发库对接至mqant上来。实现了mqant跨平台通讯的要求

KBEngine

是一款开源的游戏服务端引擎,使用简略的约定合同能够够让客户端与服务端进行交互,使用KBEngine插件才能迅速与(Unity3D, OGRE, Cocos2d,HTML5, 等等)技术结合产生一个完整的客户端。

服务端底层框架使用c++撰写,游戏逻辑层使用Python(支持热更新),开发者无需重复的实现一些游戏服务端通用的底层技术, 将精力真正集中至游戏开发层面上来,快速的塑造各类网路游戏。kbengine底层构架被设计为多进程分布式动态负载均衡方案, 理论上只须要不断扩充软件就能否不断提高承载上限,单台机器的承载上限取决于游戏逻辑原本的复杂度。

图说天下

×
二维码生成