游戏服务器开发一些心得体会

  1. 通信数据大小端需要注意:java收发的都是网络格式的数据是大端数据,c++运行在Linux中的服务如果没有转成网络格式数据,服务器一般都是小端格式的数据,这个在编解码的时候需要留心,否则可能解不出对方发来的数据,自己发的数据对方也解不出来。如何确认双方发送的数据是否一致呢,一般来说可以在收到一个完整的消息包后,把该消息包字节流的数据使用16进制字符串打印出来,就可以很容易比较

  2. 对于网关服务 GateServer,登录服务 LoginServer 这两种部署在外网的服务与客户端之间之间打交道的,它们的压力大部分来自网络IO而非业务计算,尤其是网关服务器 GateServer 几乎没什么业务逻辑处理,主要处理网络消息的转发(客户端发送到后端服务器,后端服务器发送到客户端)与过滤。从它负责的业务角度上可以看出一个好的 GateServer 其实就是一个高性能的网络服务。针对高性能网络服务的实现有很多方式

    常见模型有:

  • 多线程模型
    one loop per thread 是一个高性能网络服务常用模型,loop是基于反应器Reactor的设计模式实现,每个IO线程里面都有且只有一个loop,一个socket/channel连接只会在一个线程里面处理,一个线程利IO复用可以处理多个连接。Java 的 Netty、Mina,C++的 Muduo 都是默认使用这种模型编写的高性能网络库

  • 协程
    语言级别的golang,erlang,单独库形式的libco,skynet等

    我们游戏里面使用的方案是基于linux系统下的多线程模型,在我们实际运行过程对服务器硬件的一些参数进行优化设置后,单GateServer最高同时在线达到10w+问题不大,机器整体的负载也不高。

  1. 对于逻辑服务 LogicServer 游戏逻辑主要在这个服务上处理。常见的实现,IO线程 + 单独的业务线程。IO线程接收到的数据解码成具体的消息数据后通过消息队列传入到业务线程中,消息数据汇总到同一个线程中处理,也就是说游戏业务处理是单线程的,这种设计的优势在于避免业务开发中数据竞争。如果单线程实在不能满足性能要求,比如一些mmo游戏中,可以采用多进程的模式,也就是有多个LogicServer,管理和协调这些LogicServer 可能还需要一个逻辑管理服务。

  2. 对于管理服务 GMServer 一般来说除了需要处理与其他后端服务的tcp的连接之外,还需要启动一个http的服务来处理游戏的后台管理发来的http请求。

  3. 对于DB服务 DBServer 数据库的代理层,负责与数据库交互,解耦业务层的数据处理,适应数据库的改变,业务逻辑也相对简单。DBServer通常会开一个线程池来处理,根据玩家id分配到不同的线程上处理玩家的数据,对数据库的操作根据不同的场景需求可以实时操作,也可以定时操作。它也可以合并到LogicServer里,但是独立开来,整体框架更加清晰

  4. 对于数据库,玩家游戏数据的存储 常见的游戏数据库包括: mysql,redis,mongodb等。对于mysql这种传统数据库设计表的时候一定要注意结构的合理性和索引的建立,否则很有可能导致数据库大瓶颈。

  5. 对于这些后端服务(除了网关服务和登录服务之外)来说连接数是固定并且有限的,一般来说也就一两个其他后端服务与自己连接,另外自己也会发起与其他后端服务的连接。所以这些服务并不需要所谓的高性能网络IO的处理,一个Reactor处理网络IO就够了,编写模式也比较固定,所有的网络数据接收解析后通过消息队列传到主业务线程+线程池处理。

  6. 游戏的业务主要是响应外部请求和处理内部状态改变,包括以下两种驱动方式:

  • 消息驱动

    针对各种网络消息做出响应。比如,玩家的点击反馈等。常见实现方式是通过命令模式,也就是消息封装成一个对象,不同的消息参数化。

  • 时间驱动

    一些业务需要基于时间而做出改变。比如,定时活动的开启,玩家数据定时的保存等。常见的实现方案是定时器,定时器采用的算法可以是时间轮,红黑树等。

    实现这两种驱动之后,游戏服务器可以响应外部和内部的改变,基本上服务就可以正常的运转。游戏业务与其他所有后端业务都一样,本身就是数据结构的组织。

  1. 如果网络是普通的千兆以太网,那么吞吐量不大于 125MB/s。这个吞吐量比起现在的 CPU 运算速度和内存带宽简直小得可怜。对于不特别在意 latency 的应用,只要能让千兆以太网的吞吐量饱和或接近饱和,用什么编程语言其实无所谓。Java 做网络服务端开发也是很好的选择(不是指 web 开发,像游戏的网关服务)。尽管可能 C++ 只用了 15% 的 CPU,而 Java 用了 30% 的 CPU,Java 还占用更多的内存,但是千兆网卡带宽都已经跑满,那些省下在资源也只能浪费了;对于外界(从网线上看过来)而言,两种语言的效果是一样的,而通常 Java 的开发效率更高。(Java 是比 C++ 慢一些,但是透过千兆网络不一定还能看得出这个区别来。)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339