游戏服务端架构演进

server/2024/12/22 2:10:37/

文章目录

  • 前言
  • 初出茅庐
  • 粗通皮毛
  • 略有小成
  • 炉火纯青
  • 内劲深厚
  • 最后

前言

对于网络游戏,一般分为客户端和服务端,客户端主要负责界面图像的渲染与一些交互操作,服务端主要负责数据的业务处理与存储还有与客户端之间的信息交互

比如玩家聊天、广播通知、玩家修改名称等操作基本都需要一个游戏服务器充当消息的生产者、消息的消费者、消息的中转站

初出茅庐

武功初学者,刚刚开始涉足武学
在这里插入图片描述

对于每个在线的客户端,游戏服务器开启一个对应的线程进行相应的客户端连接数据的读写操作即网络通信、业务逻辑的处理、将运行中将玩家在线的一些信息保存在程序的内存中、或者将信息持久化地保存在文件中
主体流程是客户端通过与服务端之间建立的连接,进行请求数据包的发送,服务端接收到数据包后,对字节流的数据包进行拆包解析成程序内部可以使用的消息对象,然后调用该消息对应的处理函数进行业务处理,业务处理可以选择进行数据存储,也可以选择进行响应消息的封包转换成字节流,然后对客户端进行请求响应的写回等等

粗通皮毛

武功略知一二,未得精髓
在这里插入图片描述

使用内存结合文件的方式在用户量较小的情况下可以正常过运行,但是当玩家的体量逐渐庞大增长起来,对于数据存储的性能,数据库操作的需求变得更加复杂,需要一个结构化的数据存储结构,来高效的管理这些数据,这个时候我们就引入了数据库,通过数据库来完成数据的加工处理与存储

略有小成

武功修炼有了初步的成就
在这里插入图片描述

对于游戏来说一般实时性交互要求比较高,这个时候我们发现使用数据库之后还是会存在数据存储与数据检索上的瓶颈,这时我们可以考虑对于服务端加上一些缓存的机制,对于一些热点数据的检索优先在读写速度更快的缓存中查询,以提高查询效率,提供缓存数据定时持久化、异步批量持久化等操作保证数据的安全性

炉火纯青

武功已经非常熟练,技艺高超
在这里插入图片描述

随着游戏服务端业务逻辑变得复杂起来,我们可能需要支持更多的能力,比如玩家之间的聊天,消息广播推送等功能
首先我们每个线程只去处理了自身绑定的客户端连接,我们如果向其它在线的玩家进行通知可能需要进行跨线程的交互,这个时候我们先把客户端的连接抽成一个连接管理的模块,用于与客户端之间建立连接,并保存所有在线的客户端连接

其次这些操作其实更多的是想客户端连接中写入数据,这些功能主要是一个IO操作,我们有可能是向所有玩家进行消息推送,如果这个推送过程是在我们的业务逻辑中进行处理的话,可能会导致我们的业务逻辑处理的响应变得很慢,对于玩家的体验上也不友好,这个时候我们可以考虑使用一个广播模块进行异步的消息推送

内劲深厚

内功修为深厚,内力充沛
在这里插入图片描述

我们当前的游戏服务器架构受限于单台服务器的硬件性能的制约,如果当在线用户很庞大时,我们单台服务器可能无法处理大量的客户端请求,这个时候我们需要进行水平拓展,将业务功能分散到多台服务器中,目前更通用的做法是进行游戏分服,每个分服之间的数据隔离。然后我们将每个分服运行在一个服务器上,这样就是实现了游戏服务器的水平拓展,支持更大体量的客户端进行并发请求

当进行新开分服,或者说分服信息、分服服务地址调整时需要将分服待调整的内容同步到全局服务器的注册中心中
我们在用户登录到游戏中的时候会基于全局服务器进行分服服务器的选择
之后客户端的交互都是与分服服务器之间进行的,这样就按照基于分服这个机制进行了客户端的分片,每个分服服务器只需要处理好自己这个分片内的所有客户端连接即可

最后

我是醉墨居士,这此分享先到这,后面可能会在添加一些新的内容与功法,助力各位道友神功大成


http://www.ppmy.cn/server/132212.html

相关文章

【C语言教程】【常用类库】(十三)异常处理 - <setjmp.h> 和 <assert.h>

13. 异常处理 - <setjmp.h> 和 <assert.h> 在C语言中&#xff0c;异常处理不像在一些现代高级语言中有内建的 try-catch 机制&#xff0c;但可以通过使用 <setjmp.h> 提供的setjmp和longjmp 来实现类似的异常处理机制。同时&#xff0c;<assert.h> 提…

『网络游戏』客户端发送消息到服务器【17】

将上一章服务器的协议PEProtocol的.dll文件重新生成导入unity客户端中 命名为Net 点击生成 另一种导入.dll文件方式 在客户端粘贴即可 此时Net文件夹的.dll文件就导入进来了 创建脚本&#xff1a;NetSvc.cs 编写脚本&#xff1a;NetSvc.cs 修改脚本&#xff1a;GameRoot.cs 在…

从opencv-python入门opencv--GUI功能之绘图鼠标与图像界面的交互

从opencv-python入门opencv--GUI功能之绘图和鼠标操作 一、文章介绍二、opencv绘制直线、矩形、圆形1、cv.line()2、cv.circle()3、cv.rectangle()4、在图像上绘制直线、矩形和圆形5、cv.ellipse()&#xff08;在空白画布上绘制椭圆&#xff09;&#xff08;1&#xff09;img …

用AI做期货量化交易应该怎么做

用AI做期货量化交易主要分为几个步骤&#xff0c;包括数据收集、数据处理、特征工程、模型选择与训练、策略回测以及实盘交易。以下是一个更详细的过程说明&#xff1a; 1. 数据收集 量化交易首先需要大量的市场数据&#xff0c;这些数据包括&#xff1a; 历史期货价格数据&…

Linux nohup 命令详解

文章目录 Linux nohup 命令详解基本语法nohup 工作原理实用示例示例 1&#xff1a;运行一个脚本并保持后台执行示例 2&#xff1a;指定输出文件示例 3&#xff1a;结合 sleep 命令 使用 jobs 和 bg 管理后台进程使用 ps 和 kill 管理进程常见的 nohup 参数结合 nohup 和 cron注…

反走样算法(MSAA、TAA、FXAA、DLSS)

光栅化的采样过程会导致图形走样,走样有很多种形式: 锯齿 摩尔纹 走样的本质原因是采样速度跟不上信号变化的速度 采样频率低,使得我们将连续变化的信号离散化. 反走样方法 anti-alisaing MSAA 多重采样反走样 超采样 优点&#xff1a; 对几何反走样效果良好 缺点…

p20 docker自己commit一个镜像 p21 容器数据卷 p22mysql同步数据(国内镜像被封锁暂时往后放)p23具名挂载和匿名挂载

如何自己commit一个镜像 这里还是先引用一下老师的笔记 关于如何自己commit一个镜像这个问题目前因为从仓库中拉下来的Tomcat里面是没有项目的&#xff0c;所以把webapps.dist里面的拷贝到webapps里面去作为自己的镜像在commit一下 这里用Tomcat举例子首先把镜像拉取下来执…

HTML 常用的块级元素和行内元素

1. 常用的块级元素 块级元素具有如下特点&#xff1a; 占据父容器的整行宽度。通常从新的一行开始。可以包含其他块级元素和行内元素。 常用的块级元素&#xff1a; div&#xff1a;通用的容器&#xff0c;用于布局和分块内容。 h1 到 h6&#xff1a;标题标签&#xff0c;定义…