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

本文介绍了mqant游戏服务器框架的设计思路与实现细节。该框架采用Go语言开发,支持多核并发、协程及分布式部署,并使用MQTT协议实现跨平台通信。文章对比分析了多种语言和框架的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

欢迎大家Fork mqant开源框架

为什么决定要重新造一个轮子?

目前网上优秀的开源游戏服务器框架也不少(当然与web框架比起来就少太多了),但总结起来都各有各的优缺点,下面列出我在选型过程中的一些考量,希望大家能开放的讨论,有不恰当的地方也请指正。

首先是开发语言

目前用于游戏服务器开发的主要应该有以下这些语言:

  1. c/c++

    优点:

    性能很好

    开源框架:

    skynet
    底层是C 开发语言是lua,
    没有客户端库
    
    kbengine
    底层是C++ 开发语言可以使用C#,Python
    有多个平台的客户端库
    
  2. C#

    优点:

    性能很好

    开源框架:

    Scut
    底层C#   开发语言是 C#、Python和Lua多种脚本进行开发
    有多个平台的客户端库
    
    Photon
    底层C#   好像是收费的,但毕竟出名
    有多个平台的客户端库
    
  3. Python

    是我最想使用的一种开发语言

    1. 开发效率非常高
    2. 支持协程,能开发出高并发性的游戏,而且代码可读性好
    3. 目前有很多游戏公司应该都使用的是Python作为后端游戏服务器开发语言,有相对成熟的案例

    缺点:

    1. Python很致命的一个问题是进程不能利用多核,也就是说一个进程只能利用一个CPU进行计算,如果要用多核就需要新开进程,这样会造成服务器的维护成本增加,而且开发项目时所需要考虑的问题也更多

    开源框架:

    twisted  可以用来做网关服务器
    firefly  应该很早就不维护了
    
  4. Java

    1. 没有找到比较好的开源框架
    2. 对协程支持不够好
    3. 开发效率较低
  5. JavaScript

    优点:

    1. 语法灵活(这是一把双刃刀,用起来要小心,尤其是团队开发中)
    2. 开源库丰富
    

    缺点:

    1. 语法上有一些缺陷
    2. 跟Python一样不支持多核
    3. 对协程支持不够好,地狱回调很可怕,虽然有一些解决方案,但用起来稍微有点别扭
    

    开源框架:

    Pomelo 网易出的,安静了一段时间,最近又开始维护了
    有多个平台的客户端库
    
  6. golang

    优点:

    1. 性能好,跟C/C++/C#一样编译型语言
    2. 语法比较简单,开发效率也比较高,接近Python
    3. 语言级别支持协程
    4. 单进程支持多核并发计算
    

    缺点:

    1. 开源库较少,会golang的开发者比较少
    

    开源框架:

    leaf        接触的第一个golang框架,设计不错,但不支持多进程
    没有客户端库,需要自己实现
    cellnet 刚接触,没法评价,但好像它用了callback回调函数的设计,这样的设计在golang应该可以避免
    

游戏框架的不足

结合个人的实际情况,当时我主要的选择从 skynet Pomelo leaf 这三个框架里面来选择

skynet设计思路非常牛逼,看了风云大牛的设计感觉应该是一个高性能,高稳定性的游戏服务器框架,而且有很多产品已经使用上了。 
但个人认为skynet可能也会有以下的两个问题

  1. Actor模式可能对架构能力比较高,不如rpc模式明了
  2. skynet使用第三方网络库的时候可能需要造轮子,要放开膀子开发有些难,跟python tornado的一样,要写出高性能的程序也对开发人员有一定的要求

Pomelo由网易团队开发的,对多进程架构做的非常好,不过由于javascript性能的关系Pomelo的定位也在一些中小型非即时战斗类游戏,经过一段时间的学习和测试,最后还是无奈放弃了

最后经过多方考虑,我选择golang作为开发语言,当时第一个接触的就是leaf,学习开发了一段时间发现了leaf的一些不足

  1. 不支持多进程
  2. 没有客户端开发库,需要自己造轮子

上面列出来的都是这几个框架的缺点,其实这几个框架都非常优秀,只是不同的需求有不同的要求罢了,希望大家能根据自己实际需求选择最适合自己的框架

对游戏服务器框架的想法

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

  1. 高性能,支持多核

    这在未来开发,扩展,维护会轻松很多,比如Python这样一台服务器跑上百个进程的游戏服务器,维护起来就很让人头疼

  2. 支持协程

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

    1. 高并发,能最大的利用cpu资源
    2. 异步开发同步化,免去了回调函数设计,避免了地狱回调
  3. 支持分布式,但也支持单进程部署

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

    1. 单进程能够实现高性能
    2. 分布式部署不用重新设计编码

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

  4. 有丰富的客户端开发库

    让开发者专心业务开发,不同再去造轮子了

mqant框架的架构

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

  1. golang本身支持高性能,支持多核
  2. 支持协程 
    因此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){
                    //调用都执行完了才执行下面的代码
                })
            }
    })
    ...
    
  3. 支持分布式,但也支持单进程部署

    mqant是按模块为单位来划分功能模块的,可以将一组模块放到一个进程来运行,也可以将所有模块放到同一个进程来运行(即单进程模式)

    mqant模块间约定按标准的RPC来相互调用

    RPC底层分两种模式

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

    RPC会根据模块间的部署情况选用适当的通信方式,以达到在单进程模式下RPC通信的最低性能损耗和最快的响应时间

  4. 有丰富的客户端开发库

    mqant没有考虑帮开发者造一个客户端开发库,而是选用了目前物联网中非常流行mqtt协议来作为通信协议,mqtt本身就有各个平台的客户端开发库,因此可以直接用mqtt的客户端开发库对接到mqant上来。实现了mqant跨平台通信的要求

  5. KBEngine http://kbengine.org/ 
    是一款开源的游戏服务端引擎,使用简单的约定协议就能够使客户端与服务端进行交互,使用KBEngine插件能够快速与(Unity3D, OGRE, Cocos2d, HTML5, 等等)技术结合形成一个完整的客户端。 
    服务端底层框架使用c++编写,游戏逻辑层使用Python(支持热更新),开发者无需重复的实现一些游戏服务端通用的底层技术, 将精力真正集中到游戏开发层面上来,快速的打造各种网络游戏。kbengine底层架构被设计为多进程分布式动态负载均衡方案, 理论上只需要不断扩展硬件就能够不断增加承载上限,单台机器的承载上限取决于游戏逻辑本身的复杂度。

    Gfirefly (9秒社区)https://github.com/9miao/ 
    免费、开源、稳定、快速扩展、能 “热更新”的分布式游戏服务器端框架,采用Python编写,基于Twisted框架开发。它包括了开发框架和数据库缓存服务等各种游戏服务器基础服务,节省大量游戏开发的工作时间,真正做到让使用者把精力放在游戏玩法逻辑上。用它可以搭建自定义的分布式架构,只需要修改相应的配置文件即可。 
    优势特性 
    采用单线程多进程架构,支持自定义的分布式架构; 
    方便的服务器扩展机制,可快速扩展服务器类型和数量; 
    与客户端采用TCP长连接,无需考虑粘包等问题; 
    封装数据缓存服务; 
    可实现实时热更新数据以及游戏逻辑,客户端玩家无感觉; 
    有几十个基础游戏玩法系统模块提供组装使用(v1.3.0提供);

    网易的柚子 http://pomelo.netease.com/ 
    服务器端引擎 Node.js 编写 js binding技术

    Scut http://www.scutgame.com/ 
    游戏服务器引擎是使用C#语言开发,特别适用于手机网络游戏,支持使用Python和lua进行游戏开发;可以支持多种数据库:支持HTTP/Socket协议同时接入。

    Mangos https://github.com/mangos 
    MaNGOS是WoW的模拟服务器端工程(魔兽私服模拟器),架设在sourceforge上,使用C++,开放源码,代码写的很清楚,架构清晰,质量很高.我看重的,是其对3D游戏服务端编程的通用流程和问题的处理手法和经验.研究消息包结构,一般就能推断WoW采取哪种逻辑方案来解决一些棘手的通用问题,而服务端编程质量在很大程度上取决于程序员的经验. 
    由于采用大量优雅的模板技法,MaNGOS的编译速度很成问题,调试变得有点困难.

    DEF(Distributed Entity Framework)https://git.oschina.net/cragon/DEF 
    是基于Unity3D扩充的纯C#服务端引擎,目标是通过Unity3D+DEF形成手游整体解决方案。 
    和Unity3D配套使用的服务端引擎 
    a. 使用c#语言,便于业务层构建客户端服务端公共库,减少异构语言造成的研发损耗; 
    b. 跨平台,引擎中提供的客户端库均可运行于pc,AndroidiOS; 
    c. 类Actor模型,易于分布式扩展; 
    d. Entity.Component,分布式实体组件模型,封装了实体,组件,属性概念以及三者交互; 
    e. Node系统,类似Unity3D的Playmaker,都是图形化节点驱动,区别是Playmaker是客户端单机,Node是服务端客户端配合运行。

    分布式游戏网关–fooking 
    fooking是一个分布式游戏网关,主要用于承载长连接,将客户端的数据包完整的转发给后端,后端服务处理完之后由fooking转发给客户端。 
    当然不只如此,他包括: 
    1、分布式网关配置,只需要简单配置就能动态添加网关,以提供更多的连接数量; 
    2、SESSION维持(回话),每个连接会有唯一sessionid,后端只需要指定sessionid发送消息即可,不用关心这个连接在哪台机器上; 
    3、组播,N个用户加入到一组,只需要向组名发送消息即可,不用关心这个组有多少人(当然你非要自己去循环session发送我也阻止不了你); 
    4、服务器状态监控,可以观察到当前有多少组服务器,总共有多少连接,每台服务器上有多少连接,哪些空闲,哪些繁忙; 
    5、客户端连接与断开事件通知; 
    6、后端无语言限制,遵循fastcgi协议即可;

    https://github.com/mono 最后一个只上链接不说话 O(∩_∩)O


pomelo 是由网易开发的基于node.js开发的高性能分布式游戏服务器框架, 也可作为高实时web应用框架。 Pomelo的应用范围 pomelo最适合的应用领域是网页游戏、社交游戏、移动游戏的服务端,开发者会发现pomelo可以用如此少的代码达到强大的扩展性和伸缩性。当然还不仅仅是游戏,很多人断言未来的web时代是实时web应用的时代, 我们发现用pomelo开发高实时web应用也如此合适, 而且伸缩性比其它框架好。目前不推荐将pomelo用于大型的MMO rpg游戏开发,尤其是3d游戏, 还是需要象bigworld这样的商用引擎来支撑。 Pomelo的理念 pomelo的第一个理念是让游戏(高实时web应用)服务器的开发变得非常简单, 而不是解决某类算法或系统上的难题。这个设计理念跟rails是很类似的;第二个理念是重视性能和可伸缩性,用户用pomelo开发出来的游戏天生具有很强的伸缩性,扩展也很容易。我们在性能优化上也花了很多功夫,并且会持续进行;第三个理念是让第三方很容易扩展,框架用了很多插件式的设计, 组件component、路由规则、甚至管理控制台都可以完全由第三方扩展。 Pomelo的框架组成 pomelo包括三部分: 框架, pomelo的核心, 与以往单进程的游戏框架不同, 它是高性能分布式游戏服务器框架,并且使用很简单 库, 包括了开发游戏的常用工具库, 如人工智能(ai), 寻路, aoi等 工具包, 包括管理控制台, 命令行工具, 压力测试工具等 pomelo特性 快速、易上手的游戏开发模型和api 高可伸缩的多进程架构, 支持MMO的场景分区和其它各类分区策略 方便的服务器扩展机制,可快速扩展服务器类型和数量 方便的请求、响应、广播、服务器通讯机制, 无需任何配置 注重性能,在性能、可伸缩性上了大量的测试、优化 提供了较多扩展组件,包括游戏开发常用的库和工具包 提供了完整的MMO demo代码(客户端html5),可以作为很好的开发参考 基于socket.io开发,支持socket.io支持的多种语言客户端 为什么使用pomelo? 高并发、高实时的游戏服务器的开发是很复杂的工作。跟web应用一样, 一个好的开源容器或开发框架可以大大减少游戏开发的复杂性,让开发变得更加容易。遗憾的是目前在游戏服务器开发领域一直没有太好的开源解决方案。 pomelo将填补这个空白, 打造一款完全开源的高性能(并发)游戏服务器框架。 pomelo的优势有以下几点: 架构的可伸缩性好。 采用多进程单线程的运行架构,扩展服务器非常方便, node.js的网络io优势提供了高可伸缩性。 使用非常容易, 开发模型与web应用的开发类似,基于convention over configuration的理念, 几乎零配置, api的设计也很精简, 很容易上手。 框架的松耦合和可扩展性好, 遵循node.js微模块的原则, framework本身只有很少的代码,所有component、库、工具都可以用npm module的形式扩展进来。任何第三方都可以根据自己的需要开发自定义module。 提供完整的开源MMO游戏demo参考(基于HTML 5)。 一个超过1万行代码的游戏demo,使开发者可以随时借鉴demo的设计与开发思路。 在线演示:http://pomelo.netease.com/demo.html 标签:开发框架  游戏框架
mqantmqant 是一款基于 Golang 语言的简洁,高效,高性能分布式游戏服务器框架,研发的初衷是要实现一款能支持高并发,高性能,高实时性的游戏服务器框架,也希望 mqant 未来能够即时通讯和物联网方面的应用。特性分模块机制基于 golang 协程,开发过程全程到无 callback 回调,代码可读性更高RPC 支持本地和远程自动切换远程 RPC 默认使用 rabbitmq,未来可以添加更多种类的通信协议网关采用 MQTT 协议,无需再开发客户端底层库,直接套用已有的 MQTT 客户端代码库,可以支持IOS,Android,websocket,PC 等多平台通信现如今只有多进程的架构才能达到支撑较多在线用户,降低服务器压力,降低单点故障所带来的影响等要求,因此一个真正高可扩展的游戏运行架构必须是多进程的。然而在游戏的开发和运营也是按步骤阶段性进行的,尤其是现如今服务器硬件设备配置也越来越高的前提下,在游戏刚开始运营时单台服务器就足够支撑了,况且多进程部署所带来的运维成本也相对较高。mqant 的设计思想是在能用单台服务器时能让充分挖掘服务器的性能,而在需要多进程时再通过简单的配置就可以实现分布式部署。mqant 游戏服务器的运行架构mqant 服务器是按模块来划分功能模块的,例如 用户管理,在线聊天,战斗平台等等都应该划分为独立的模块模块之间通过 RPC 通讯,mqant 底层会根据实际情况选择 rpc 数据交互的通信渠道,在调用模块在同一个进程的情况下直接使用 golang chan 通讯,因此同进程内模块通信性能不受影响。 标签:mqant
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值