当我设计游戏服务器时,我在想些什么?(4)

我兴高采烈的把我的架构图发给一个有经验的前辈看,他指出来,也许不需要这么多逻辑进程。听他这么说,我想到这么早就把逻辑强行拆开给设计带来了不必要的复杂度,也没有让架构更加优美,甚至这种拆分可能是不必要的,过早的逻辑拆分就跟提前优化代码一样,都应该避免。

于是我去掉了 chat、mail 进程,打算把所有逻辑都放在 loc 进程进行处理,如果后期发现有拆分的必要再进行拆分。

最开始的时候,我提到过,想要服务器进程可以方便的横向动态进行改变,使用 zmq 满足了动态改变的需求,那么怎么能进行横向扩展呢?我在介绍我前一个项目的服务器架构时谈过,由于服务器进程是存在状态的,所以几乎无法进行动态增添服务器来降低压力,那么该怎么做才能把服务器写成无状态的呢?

状态信息,说白了就是数据相关,把一些热数据放在进程空间里,导致这个进程如果想要横向扩展,必须同步这部分数据,这个同步通常是困难的,甚至有的时候不太可能,而且对我来说设计起来不太容易。我的好友XY又发挥了巨大的作用,跟他聊天,他正好提到他们的web服务器用redis来保存session信息,我突然想到,可以把玩家信息保存在redis里,让进程不再拥有状态,这样就可以把服务器写成无状态的,利用redis这种内存级的数据库完全可以实现这一点。于是我在游戏服务器里又引入了redis。当然,这中间我也问过一些朋友,他们有没有在实际项目中使用,得到肯定的答复让我下定了决心。

我封装了 node-redis 模块,让处理逻辑的进程可以轻松访问 redis 服务器,这样我又可以去掉 db 进程了,每个进程单独和数据库进行通信:

这里可以看到,客户端跟服务器间的通信机制也被改掉了,客户端程序想要使用 websocket,于是我放弃了之前用 luasocket 写的网络库,改用 websocket 写了一套新的,虽然性能降低了4,5倍不止,但是算是尝了一次鲜。

nodejs 这边我使用的是 ws 模块,测试过很多别的模块,例如 socket.io、websocket等等,最后发现 ws 模块是最简单的,而且这几个模块性能都差不多,我也不需要他们提供的额外功能,我只需要一个解析 websocket 协议的功能而已。至此,服务器这方的设计算是有了一个基本的雏形,可以在其上进行逻辑开发了,当然,后期还需要不断调整,我同时也画了一下可能的服务器部署图:

redis 的数据落地策略采取的是每秒做 aof,同时每天做 rdb,aof 超过一倍就重写,主从库的设计也是不确定的,要在实践中进行修改,也要跟专业的运维人员一起商量才能确定。mysql 的重新引入是为了记录一些不变的玩家数据,这些在后面的设计可能会发生更改。

我之前的痛苦、纠结到此基本就算结束了,不过那些都是设计期的煎熬,真正的煎熬是游戏上线运营之后才会发生的,我深深的明白这一点。

下一篇我会谈一下,在这个过程中,遇到的 nodejs、redis 的一些考虑和坑。

时间: 2024-10-06 07:11:47

当我设计游戏服务器时,我在想些什么?(4)的相关文章

当我设计游戏服务器时,我在想些什么?(1)

机缘巧合的机会,我有幸能够从头开始设计一个游戏的服务器.中间遇到很多欢声笑语和悲伤泪水,这里分享一下. 我之前所在项目组的游戏服务器架构如下图: 这款游戏是一款MMO的端游,GateWay网关的任务是接受客户端的连接,然后通过分发策略,把玩家丢进GameSvr上去,之后玩家的所有请求都直接发给GameSvr,由GameSvr处理了.当然这里的分发策略跟一般的web服务器是不同的,web服务器一般会做成无状态的服务器,也就是对于客户端来说请求到达哪一个服务器都没有关系,都能够被处理,但是游戏服务器

当我设计游戏服务器时,我在想些什么?(2)

半年前我参与了一个手游项目,第一次能够主导整个游戏的设计,这篇文章单说服务器的架构,客户端就不提了. 对于服务端,我想从之前的端游服务器改过来肯定是走不通的(详见:),因为手游的开发周期比端游短很多,上面那一套架构开发了5年不止,当然,期间推翻重做了很多次.而这个手游项目只有快则6个月,慢则10个月的时间. 既然决定不用端游的架构,一切从0开始,那么快速搭建起一个可用的服务器是我考虑的第一个原则,第二点就是我做为程序员的一点私心,尽量使用以前没有用过的技术,这样自己能够接触更广阔的世界. 首先当

当我设计游戏服务器时,我在想些什么?(3)

有了单进程的服务器之后,在我想加入第一个游戏功能的时候,我又纠结了,这货不是我最后想要的东西啊,我就算用单进程写完了整个游戏,也绝不该是这样的啊,我想要的是一个多进程的服务器,而且进程之间应该是可以通信的,进程还可以是动态增删的.这样才可以扛住我自认为会出现的压力啊. 于是我开始思考,我的进程之间需要怎么去通信,数据该怎么去传输,服务器间的进程通信跟服务器与客户端的通信方式又不相同,跟客户端的通信,需要保证安全,同时需要数据量尽量的小,而服务器进程间却通常不存在这样的问题,因为大部分的服务器进程

【前言】为什么要设计游戏服务器框架

设计游戏服务器框架: 项目设定周期:7月1日 - 12月31日 项目语言:PHP.Golang 项目成果: 1.PHP版游戏服务器框架 2.Golang版游戏服务器框架 设计目的: 1.挑战自己的毅力,遇到困难,勇敢面对解决 2.学习未涉及的领域和技术

我是如何设计游戏服务器架构的

前言 现在游戏市场分为,pc端,移动端,浏览器端,而已移动端和浏览器端最为接近.都是短平快的特殊模式,不断的开服,合服,换皮.如此滚雪球! 那么在游戏服务器架构的设计方面肯定是以简单,快捷,节约成本来设计的. 来我们看一张图: 这个呢是我了解到,并且在使用的方式,而PC端的游戏服务器而言,往往是大量的数据处理和大量的人在线,一般地图也是无缝地图的完整世界观,所以不同的程序都是独立的进程并且在不同的server中运行! 而浏览器端和移动终端,在上面就说过了,它主要是不断的开服,合服,开服,合服,那

关于优化游戏服务器响应客户端消息的一点思考

现在假设有如下构建的游戏服务器,游戏服务器有一组gate服务器,用来验证客户端,并且通过gate服务器来与一组主服务器,然后主服务器与关系服务器进行通信. 其中relation服务器用来处理各种关系,例如好友关系,师徒关系等.现在有一个玩家A添加玩家B为好友,那么客户端发送给服务端的消息流程如上所示.首先gate收到客户端消息,进行验证等,然后转发给Main1服务器, 这里假设玩家A的信息存储在Main1服务器上,然后Main1服务器检测玩家A的各种要求,如果满足要求,则将消息转发给Main2服

租用游戏服务器要注意问题-众一网络

用游戏服务器,注意事项 游戏为我们和生活带来了更多的趣味和精彩,很多游戏网站的站长在挑选租用游戏服务器时,主要看游戏服务器的什么方面,结合实际生活的各方面,注意游戏服务器提供商的信誉实力售后支持.服务器本身就看稳定性.带宽价格这些事项.1.游戏服务器的提供商信誉实力 信誉实力在各行各业中都是最重要的,是现实中的保证.看一个游戏服务器服务商的信誉实力,可以从企业上传到网站的信誉之星,服务之星等一些证书进行查询.正规的游戏服务器运营商会形成一定的规模,如果有时间的话,为了以后各方面保障,直接去游戏服

棋牌游戏服务器架构设计

转载自:简书一位同行的文章 一,棋牌类服务器的特点 1,棋牌类不分区不分服 一般来说,棋牌游戏都是不分区不分服的.所以棋牌类服务器要满足随着用户量的增加而扩展的需要. 2,房间模式 即在同一局游戏中就是在同一个房间中,同一个房间中的人可以接收到其他人的消息. 3,每个房间的操作必须是顺序性 这个特性类似与一般游戏的回合制,每个玩家的操作都是有顺序性的. 二,需要解决的技术点 1,数据共享 因为棋牌类游戏不分区不分服,我们在设计服务器的时候,是按世界服的思想去设计,即服务器是一个n多台物理机的集群

FPS游戏服务器设计的问题 【转】

一.追溯 去gameloft笔试,有一个题目是说: 叫你去设计一个FPS(第一人称射击游戏),你是要用TCP呢还是要用UDP,说明理由 . 二.学习 这是两篇网上找到的文章,写非常不错. 当时笔试的时候自己没想到这么全,但大概想法都是一致的,摘录下来再学习一下. 1.网络游戏程序员须知 UDP vs TCP 作者:[email protected] 首发链接:http://blog.csdn.net/rellikt/archive/2010/08/21/5829020.aspx 这篇教程让我们就