游戏服务器架构的思考
Posted m08090420
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了游戏服务器架构的思考相关的知识,希望对你有一定的参考价值。
时间总是在不经意的时候就流走了,突然回想我已经做了四年游戏开发,经历了几个游戏项目,以前项目中的游戏服务器框架都不是我心中理想的框架,虽然不知道是不是我见识还不够。下面记录下我对游戏服务器架构的简单思考。好的游戏框架可以提高开发效率,节省人力成本。首先最简单的服务器框架,那就是只要一个网关和一个游戏服务器。如图:
图中agentserver负责客户端连接,客户端收发数据,将客户端数据转发给服务器,将服务器数据转发给客户端,几乎没有逻辑,这样可以应对大并发io。所以agent可以采用一个epoll线程,负责客户端连接和数据发送。一个日志线程,负责记录运行过程中的日志。主线程负责将数据发送给gameserver和将gameserver数据发送到客户端发送队列中。gameserver就是主要的游戏服务器了,主要就是负责游戏逻辑功能。gameserver的线程有:socket线程负责接收消息,日志线程负责写入日志,db线程负责数据加载和存档。bill账单线程负责将游戏运行中的一些数据写入数据库作为运营日志。主线程负责逻辑,也就是逻辑单线程架构模式。db线程中可以加入redis等nosql的应用,作为缓存。这个架构比较简单,逻辑也比较清晰,不需要进行数据同步和锁相关的操作,但是这个架构无法实现跨服功能。
下面加入跨服功能的游戏服务器架构,如下图:
图中我们新加了两个服务器进程分别是router路由服务器和世界服务器也就是跨服服务器。gameserver和agentserver服务器功能不变。router负责路由消息,world服务器负责处理跨服功能。router可以直接一个线程负责连接和数据收发。world服务器则直接和gameserver线程架构一样。这样的架构可以轻松实现跨服功能,逻辑都是当初所以简单易于开发。
现在服务器都是多核cpu,从上面服务器,上面的服务器架构除了逻辑线程消耗cpu外其实其他线程都是消耗io,对cpu的消耗很少。也就是我们的服务器都没法充分的发挥出cpu的并行计算的能,那唯一的办法就是逻辑多线程处理。逻辑多线程在发挥cpu并行计算能力的同时也会增加开发成本,和服务器开发的负责度。为了避免锁的使用可以在增加一个进程。
下图是一个逻辑多线程的架构:
为了实现逻辑多线程,我们需要加入一个本地世界服务器,这个服务器进程可以负责比如工会好友之类的功能,当加入了本地世界服之后其实我们可以轻松的实现逻辑多线程和多进程的功能,也就是我们的服务器可以按照功能或者地图将逻辑分配到不同的进程和线程中。
上面说了三种服务器的架构,我个人觉得第二种更好,加入router之后我们可以增加网关服务器加大并非量,但是需要gamerserver能够处理的过来。如果游戏确实特别火最后一种架构可以应对。网关可以动态增加,gameserver也可以动态增加。
服务器开发中账单和协议都可配置xml后用工具直接生成,如果需要协议兼容那可以使用谷歌协议工具。内存可以直接用new分配并加入tcmalloc或者jemalloc,数据库选择mysql,缓存选择redis。配置最好是xml或者数据库配置。csv配置容易出问题,不方便查找,如果要做国外版本csv容易翻译出错,脚本一般选择lua,用lua_tinker作为中间库。
现在的服务几乎都是Linux中运行了,所以没必要做跨平台功能。
以上是关于游戏服务器架构的思考的主要内容,如果未能解决你的问题,请参考以下文章