游戏服务端

作者:Manistein
链接:https://www.zhihu.com/question/62386941/answer/197990865
来源:知乎

游戏服务端大体可以分为以下几个部分:

1、网络层

负责客户端和服务端,以及服务端集群内部之间的网络数据包收发,目前在游戏中广泛应用的两种协议,一种是TCP协议,还有一种则是HTTP协议。一般而言,那些网络数据包交互频繁的游戏采用TCP会更合适,比如MMORPG,而一些客户端和服务端交互不频繁的弱联网游戏,则采用HTTP协议,这些游戏一般以客户端为主,且通常防范作弊的能力有限。

数据包交互频繁的游戏,大多采用TCP协议,然而对于手游来说TCP却未必是最好的选择,TCP最大的特点,首先是按序到达,超时重传,此外TCP协议还有流量控制和拥塞控制。这里我对拥塞控制做一下简要说明,虽然TCP设计拥塞控制的初衷是,通过控制发送方往网络注入字节序的数量,来缓解拥塞,也就是说,如果发送方多次发送数据包都没收到确认,则判定为网络拥塞,此时TCP的滑动窗口可能会减少到原来的一半,而恢复往往却很慢,那些对网络有着苛刻要求的Moba类游戏来说,TCP可能就没那么友好了。因此有些项目会采用UDP协议来传输数据包,虽然UDP无连接的,可能会导致丢包,但是可以在应用层加以控制,实现一套TCP like协议,UDP是用户报文协议,基本上应用层下传多少数据包,就会发送多少数据包,应用层需要实现UDP包的超时重传和按序到达等机制,在遇到网络拥塞时,仍然不会让数据包的发送量减半,因此能够有效缓解网络传输问题。

上一段是网络协议在游戏上的一些应用的概述,对于服务端而言,网络层模型也是需要了解的,目前常用的是epoll模型,典型的使用情形是,服务端进程开一条socket线程,并且将包括监听、读取和发送事件在内的所有事件交给epoll来处理,在没有事件时,epoll_wait会阻塞socket线程,当有事件过来时,则唤醒socket线程进行相应的事件处理,此外,要网络层还需要进行分包和粘包处理,将数据包收齐以后再转给业务层。

虽然不深入去研究网络层,也不妨碍你写业务逻辑,但是研究还是对你有益处的。

2、协议层

这里的协议层和网络协议并非一个概念,游戏客户端和服务端在进行数据包交互的时候,往往需要将游戏内存中的数据结构,转成网络字节序,才能通过网络发送到另外一端。而这个转化的过程发送端要遵循一个序列化的规则,而接收方则需要需要遵循一个反序列化规则,遵循规则才能将数据转成网络字节序,传输,然后在另一端还原,这些被共同遵循的规则,则是协议。比较知名的序列化,反序列化的库是Google的Protobuf。

3、存库机制

游戏中,玩家的操作比较频繁,涉及的数据变更也很频繁,如果每次都要进行写库,那么会导致游戏服务器的性能极具下降,因此,一般的游戏设计是,玩家的操作都是基于内存的,并且定时将数据写库,从而减缓数据库的压力。存库的方式,这里比较推荐用大blob的方式,比如将玩家所有的数据序列化为json字符串,然后作为blob存入数据库中,这样做的好处是,开发过程中,可以做到变更玩家存储结构而不用修改数据表。

4、逻辑层架构

对于逻辑层架构,不同的游戏有不同的设计,这里就不举例说明了,不过大体上,都需要思考以下几个流程

1)启服关服流程:这一点很重要,在游戏进行停服维护时,要确保玩家以及和玩家相关的数据均落地以后,才能够杀进程,关服流程需要作出这种保证。

2)玩家登录登出流程:这也是一个比较容易出问题的流程,比如是否允许玩家在两个端同时登录服务器,如果允许如何避免数据被相互覆盖,导致玩家数据错乱等问题,如果不允许,如果改玩家实例已经在线,要不要踢下线?是立刻踢,还是发送一个延时踢的指令,并且这段时间内操纵这个实例的客户端所有请求均会被拒绝,并且给请求登录的玩家返回一个不能登录的错误码?这些都是需要考虑的问题,而且是需要慎重考虑。

3)容灾、扩容机制:对于高可用的服务端集群来说,7*24小时地进行运作,难免有时候会出一些状况,比如某个进程挂掉了,对于这种情况,我们需要有一种容灾的机制,保证进程宕掉,不会轻易地就要重启整个集群。如何设计扩容机制,直接影响到,当玩家大量涌入时,将部分玩家分流到新开的进程内,并且不影响原来的玩家?这些都需要考虑,虽然不难,但是需要慎重考虑

4)游戏同步机制:不同的游戏,会采用不同的同步机制,不过最典型的就是状态同步和帧同步,如果题主没有了解过,可以去找找资料研究一下。

5)配置机制:这点无需多言,只要将策划的配置表,转成程序中可用的文件格式即可。

以上是我对游戏服务端的一些理解,至于学习路线

网络层方面:精读《计算机网络(谢希仁著)》《TCP/IP详解》打好理论基础,同时可以结合《Unix网络编程》作为实践。

协议层方面:可以去Google的Protobuf官网看看其用法和说明。

数据库:说起来惭愧,我并没有看过很多关于数据库的著作,不过《Redis设计与实现》这本不错,很多人推荐,至于MySql,题主可以网上找找。

此外,选择一个成熟的服务端框架,也是非常重要的,最好不要自己写,我推荐云风的skynet,有时间可以多看看框架的源码,去理解人家的设计思路,开发思想,绝对是大有裨益的。多上网找找开源的demo来研究,然后自己手写一些demo,实践很重要。

自学服务端还是很辛苦的,需要自己写客户端,自己写服务端才能够跑起一套流程,还是做单机“简单一些”。虽然实际工作中,服务端要比客户端轻松一些,囧

最后,也是最重要的一点,就是要勤于总结才能快速进步,这里我分享一篇我写的skynet源码赏析的文章note.youdao.com/notesha

作者Blog地址:Manistein's Blog

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值