游戏服务端架构演进

文章目录

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

前言

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

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

初出茅庐

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

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

粗通皮毛

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

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

略有小成

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

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

炉火纯青

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

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

其次这些操作其实更多的是想客户端连接中写入数据,这些功能主要是一个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…

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

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

如何启动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文件不存在&…

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

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

第十三章 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、…

VUE 开发——Vue学习(三)—— 智慧商城项目

目录 解释各个模块 api接口模块&#xff1a;发送ajax请求的接口模块utils工具模块&#xff1a;自己封装的一些工具方法模块components组件模块&#xff1a;全局通用的组件router路由模块&#xff1a;封装要所有路由views&#xff1a;各个页面assets&#xff1a;各种资源 van…

源码编译llama.cpp for windows on arm

源码编译llama.cpp for windows on arm 这里有编译好的&#xff0c;直接下载使用 https://github.com/turingevo/llama.cpp-build/releases 1 先编译openblas for windows on arm 查看我的文章 《源码编译 openblas for windows on arm》 2 启用OpenBlas加速 上一步openb…

Java+Jenkins实现自动化打包部署流程

目录 jenkins简介 前置依赖 1. jdk17 2.apache maven 3.8.6 3.git 4.docker 5.下载jenkins 启动配置jenkins 优缺点对比 Jenkins 的优点&#xff1a; Jenkins 的缺点&#xff1a; jenkins简介 Jenkins 是一个开源的自动化服务器&#xff0c;可以用于自动化各种任务&…

Mistral AI 开源 Pixtral 12B 多模态 LLM,多场景能力理解,支持中文指令遵循!

Mistral AI 开源了 Pixtral 12B 多模态 LLM。具有自然场景理解&#xff0c;代码生成&#xff0c;图像转代码&#xff0c;图像理解&#xff0c;多图指令跟随&#xff0c;图表理解与分析以及复杂图形推理等多项能力。从效果演示来看模型的能力很强&#xff0c;其中对中文能力的理…

利用C++封装鼠标轨迹算法为DLL:游戏行为检测的利器

在现代软件开发中&#xff0c;鼠标轨迹模拟技术因其在自动化测试、游戏脚本编写等领域的广泛应用而备受青睐。本文将介绍如何使用C语言将鼠标轨迹算法封装为DLL&#xff08;动态链接库&#xff09;&#xff0c;以便在多种编程环境中实现高效调用&#xff0c;同时探讨其在游戏行…

pymobiledevice3使用介绍(安装、常用命令、访问iOS沙盒目录)

项目地址&#xff1a;https://github.com/doronz88/pymobiledevice3 首先先介绍一下pymobiledevice3&#xff0c; pymobiledevice3是用Python3 实现的&#xff0c;用于处理 iDevices&#xff08;iPhone 等&#xff09;。它可以跨平台使用&#xff0c;支持&#xff1a;windows…

Python | Leetcode Python题解之第479题最大回文数乘积

题目&#xff1a; 题解&#xff1a; class Solution:def largestPalindrome(self, n: int) -> int:if n 1:return 9upper 10 ** n - 1for left in range(upper, upper // 10, -1): # 枚举回文数的左半部分p, x left, leftwhile x:p p * 10 x % 10 # 翻转左半部分到其…

【论文笔记】Fine-tuned CLIP Models are Efficient Video Learners

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Fine-tuned CLIP Models a…

aws(学习笔记第五课) AWS的firewall SecurityGroup,代理转发技术

aws(学习笔记第五课) AWS的firewall– SecurityGroup&#xff0c;代理转发技术 学习内容&#xff1a; AWS的firewall– SecurityGroup代理转发技术 1. AWS的filewall– SecurityGroup 控制进入虚拟服务器的网络流量 通常的firewall(防火墙)配置 AWS上使用安全组进行网络流量…

SpringCloud-OpenFeign-服务接口调用

是什么 把需要暴露的api使用接口来暴露&#xff0c;客户端需要调用的时候&#xff0c;直接查看这个接口中有没有就可以了 通用步骤 架构说明 common模块 common 引入 openfeign 新建服务接口类 FeignClient(value "cloud-payment-service") // 服务名 public i…

SwiftUI 6.0(iOS 18)自定义容器值(Container Values)让容器布局渐入佳境(上)

概述 我们在之前多篇博文中已经介绍过 SwiftUI 6.0&#xff08;iOS 18&#xff09;新增的自定义容器布局机制。现在&#xff0c;如何利用它们对容器内容进行“探囊取物”和“聚沙成塔”&#xff0c;我们已然胸有成竹了。 然而&#xff0c;除了上述鬼工雷斧般的新技巧之外&…