游戏服务端架构演进

文章目录

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

前言

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

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

初出茅庐

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

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

粗通皮毛

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

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

略有小成

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

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

炉火纯青

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

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

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

内劲深厚

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

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

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

最后

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/56220.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

黑马程序员-redis项目实践笔记1

目录 一、 基于Session实现登录 发送验证码 验证用户输入验证码 校验登录状态 Redis代替Session登录 发送验证码修改 验证用户输入验证码 登录拦截器的优化 二、 商铺查询缓存 缓存更新策略 数据库和缓存不一致解决方案 缓存更新策略的最佳实践方案 实现商铺缓…

TS中如何正确处理window类型

在Typescript项目中,你可能都遇到过这个错误: Window & typeof globalThis 类型上不存在属性 X。 快速修复方案 我们将介绍几种不同的解决方案来解决这个问题。 Window 接口是在名为 lib.dom.d.ts 的文件中全局定义的。你可以使用各种技术来更改它&a…

Redis的应用以及Redis工具类的封装

在前后端分离的项目中,通过session和cookie的通信一般就失去效益了,即使这么做了也会产生著名的漏洞问题CSRF(Cross-site request forgery), 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。因…

Windows 11 24H2版本有哪些新功能_Windows 11 24H2十四大新功能介绍

距离上次发布的23H2版本已经过去了一年时间,现在,Win 11的24H2版本终于等到了,微软已经全面公开发布Win11 24H2版本,版本号为26100.1742,此次官宣的版本包括了消费者版、商业版、LTSC 2024版等,各种语言版本…

H.264视频,HEVC视频,VP9视频,AV1视频小知识

H.264、HEVC(H.265)、VP9和AV1是不同的视频编码格式,它们的主要区别在于压缩效率、支持的分辨率、编码技术以及专利和授权费用等方面。以下是这些编码格式的主要区别: H.264(AVC): 压缩效率&…

STM32中的RAM和ROM分别是什么

RAM(Random Access Memory,随机存取存储器)和ROM(Read-Only Memory,只读存储器)是计算机系统中的两种常见存储器类型,它们各自有不同的功能和用途。 1. RAM(内存) 定义…

如何启动hive

检查mysql是否启动 通过Navicat测试mysql是否可以连接 找打hive配置文件所在目录 检查连接mysql的账号密码是否正确,如果不正确就要修改为正确的 初始化hive元数据存储的库:schematool -dbType <database_type> -initSchema 检查mysql中是否创建hive数据库,这里看到hive数…

zookeeper客户端

启动单机版的zookeeper 配置Maven环境 (1) IDEA自带maven (2) 更新Maven库镜像地址&#xff1a; ① 拷贝D:\Program Files\JetBrains\IntelliJ IDEA 2018.3.5\plugins\maven\lib\maven3\conf\settings.xml [IntelliJ的安装目录]到 C:/用户/username/.m2 (如果.m2文件不存在&…

Android屏幕旋转流程(2)

&#xff08;1&#xff09;疑问 &#xff08;1&#xff09;settings put system user_rotation 1是什么意思&#xff1f; 答&#xff1a;设置用户期望的屏幕转向&#xff0c;0代表&#xff1a;Surface.ROTATION_0竖屏&#xff1b;1代表&#xff1a;Surface.ROTATION_90横屏&a…

cmake与c/c++拓展的关联

CMake和VSCode中的C扩展在项目管理和代码编辑中起到不同的作用。CMake用于构建系统配置&#xff0c;负责生成编译项目所需的Makefile或其他构建文件&#xff0c;而VSCode中的C扩展负责代码编辑、语法高亮、代码提示和调试等功能。 在VSCode中&#xff0c;即使CMake已经正确配置…

华宇携司法大模型亮相2024中国移动全球合作伙伴大会

2024中国移动全球合作伙伴大会于10月11日在广州琶洲保利世贸博览馆盛大开幕。本届大会以“智焕新生 共创AI时代”为主题&#xff0c;深入探讨数据、算力与人工智能如何深度融合&#xff0c;全力推进AI规模发展、规模应用&#xff0c;加快形成AI技术能力、经济效益上的规模效应&…

Android中有哪些布局方式?

Android中的布局方式是实现用户界面设计的基础&#xff0c;通过合理的布局&#xff0c;可以创建出美观且易用的应用程序界面。Android提供了多种布局方式&#xff0c;每种布局方式都有其特定的应用场景和特点。以下是对Android中主要布局方式的详细介绍&#xff1a; 一、线性布…

第十三章 RabbitMQ之消息幂等性

目录 一、引言 二、消息幂等解决方案 2.1. 方案一 2.2. 方案二 一、引言 幂等是一个数学概念&#xff0c;用函数表达式来描述是这样的&#xff1a;f(x) f(f(x)) 。在程序开发中&#xff0c;则是指同一个业务&#xff0c;执行一次或多次对业务状态的影响是一致的。有些业务…

react实现实时计时的最简方式

js中时间的处理&#xff0c;不借助于moment/dayjs这样的工具库&#xff0c;原生获取格式化的时间&#xff0c;最简单的实现方式可以参考下面这样。 实现效果 代码实现 封装hooks import { useState, useEffect } from "react";export function useCountTime() {c…

Python酷库之旅-第三方库Pandas(150)

目录 一、用法精讲 681、pandas.Timestamp.now方法 681-1、语法 681-2、参数 681-3、功能 681-4、返回值 681-5、说明 681-6、用法 681-6-1、数据准备 681-6-2、代码示例 681-6-3、结果输出 682、pandas.Timestamp.replace方法 682-1、语法 682-2、参数 682-3、…

MongoDB Shell的使用

下载地址&#xff1a;https://www.mongodb.com/try/download/shell 以下是关于如何使用 MongoDB Shell 的一些基本步骤和常见操作&#xff1a; 前提条件&#xff1a;确保已经安装并启动了 MongoDB 服务。 启动 MongoDB Shell&#xff1a;在命令行终端中输入mongosh命令。如果…

Java 拉取并解析Kafka的Topic,Insert到InfluxDB

Maven依赖 <dependencies><!-- Kafka Client --><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>3.4.0</version></dependency><!-- InfluxDB Client --&g…

删除 Docker 容器的日志文件

要删除 Docker 容器的日志文件,你可以通过以下几种方法来实现: 方法一:手动清理日志文件 单容器设置 1.查看容器日志文件位置: Docker 默认的日志文件存储在 /var/lib/docker/containers// 目录下。你可以通过以下命令找到具体位置: [root@BM01-cyzx-sqmygjpt-001 ~]# do…

单点登录Apereo CAS 7.1客户端登出配置及免认证页面问题

从上一篇博客中,我们已经实现了CAS客户端集成和服务端授权,能够通过统一认证登录访问系统资源了,接下来我们讲一下如何实现CAS客户端登出及免认证页面配置的问题,还有以个人见解讲一下CAS和Spring security的关系。 上一篇博客:单点登录Apereo CAS 7.1客户端集成教程-CSD…