文章目录
- 前言
- 初出茅庐
- 粗通皮毛
- 略有小成
- 炉火纯青
- 内劲深厚
- 最后
前言
对于网络游戏,一般分为客户端和服务端,客户端主要负责界面图像的渲染与一些交互操作,服务端主要负责数据的业务处理与存储还有与客户端之间的信息交互
比如玩家聊天、广播通知、玩家修改名称等操作基本都需要一个游戏服务器充当消息的生产者、消息的消费者、消息的中转站
初出茅庐
武功初学者,刚刚开始涉足武学
对于每个在线的客户端,游戏服务器开启一个对应的线程进行相应的客户端连接数据的读写操作即网络通信、业务逻辑的处理、将运行中将玩家在线的一些信息保存在程序的内存中、或者将信息持久化地保存在文件中
主体流程是客户端通过与服务端之间建立的连接,进行请求数据包的发送,服务端接收到数据包后,对字节流的数据包进行拆包解析成程序内部可以使用的消息对象,然后调用该消息对应的处理函数进行业务处理,业务处理可以选择进行数据存储,也可以选择进行响应消息的封包转换成字节流,然后对客户端进行请求响应的写回等等
粗通皮毛
武功略知一二,未得精髓
使用内存结合文件的方式在用户量较小的情况下可以正常过运行,但是当玩家的体量逐渐庞大增长起来,对于数据存储的性能,数据库操作的需求变得更加复杂,需要一个结构化的数据存储结构,来高效的管理这些数据,这个时候我们就引入了数据库,通过数据库来完成数据的加工处理与存储
略有小成
武功修炼有了初步的成就
对于游戏来说一般实时性交互要求比较高,这个时候我们发现使用数据库之后还是会存在数据存储与数据检索上的瓶颈,这时我们可以考虑对于服务端加上一些缓存的机制,对于一些热点数据的检索优先在读写速度更快的缓存中查询,以提高查询效率,提供缓存数据定时持久化、异步批量持久化等操作保证数据的安全性
炉火纯青
武功已经非常熟练,技艺高超
随着游戏服务端业务逻辑变得复杂起来,我们可能需要支持更多的能力,比如玩家之间的聊天,消息广播推送等功能
首先我们每个线程只去处理了自身绑定的客户端连接,我们如果向其它在线的玩家进行通知可能需要进行跨线程的交互,这个时候我们先把客户端的连接抽成一个连接管理的模块,用于与客户端之间建立连接,并保存所有在线的客户端连接
其次这些操作其实更多的是想客户端连接中写入数据,这些功能主要是一个IO操作,我们有可能是向所有玩家进行消息推送,如果这个推送过程是在我们的业务逻辑中进行处理的话,可能会导致我们的业务逻辑处理的响应变得很慢,对于玩家的体验上也不友好,这个时候我们可以考虑使用一个广播模块进行异步的消息推送
内劲深厚
内功修为深厚,内力充沛
我们当前的游戏服务器架构受限于单台服务器的硬件性能的制约,如果当在线用户很庞大时,我们单台服务器可能无法处理大量的客户端请求,这个时候我们需要进行水平拓展,将业务功能分散到多台服务器中,目前更通用的做法是进行游戏分服,每个分服之间的数据隔离。然后我们将每个分服运行在一个服务器上,这样就是实现了游戏服务器的水平拓展,支持更大体量的客户端进行并发请求
当进行新开分服,或者说分服信息、分服服务地址调整时需要将分服待调整的内容同步到全局服务器的注册中心中
我们在用户登录到游戏中的时候会基于全局服务器进行分服服务器的选择
之后客户端的交互都是与分服服务器之间进行的,这样就按照基于分服这个机制进行了客户端的分片,每个分服服务器只需要处理好自己这个分片内的所有客户端连接即可
最后
我是醉墨居士,这此分享先到这,后面可能会在添加一些新的内容与功法,助力各位道友神功大成