Webgame服务端分布式架构设计

article/2025/9/13 19:47:48

Webgame服务端分布式架构设计

——By  King

          最近在设计实现Webgame服务端游戏架构,跟大家分享下。

 

 


以下对架构的几点说明:

1.  DB:数据库层。使用MongoDB, 可以作分布式,按webgame的需求,基本应该是不需要的。设置3个数据库,分别是GameData(游戏数据), GameLog(游戏日志),GameConfig(游戏配置)。

2.  Cache:缓存层。使用Redis,作为数据中间层。主从库分布,有了DB作永久存储,就不需要存储文件了。

3. SceneServer:逻辑服务器。负责场景业务逻辑。这层设计为分布式,有N个Server,每个Server可以管理多个场景。可以扩展为分线分布式。

4.  ProxyServer:代理服。处理玩家连接,和数据转发(到Server层),数据包加解密,和过滤非法数据包。这层设计为分布式,有N个 Proxy服,为了分压客户端连接。

 

        玩家在切换地图时,无需断开连接,只要更新该玩家在Proxy代理层的数据流向。

        为免减少复杂性,这里不设置World服或者Chat服,对于世界性的业务,可以通过Redis来转发处理。

        聊天在Proxy层直接使用redis的发布订阅就可以实现,数据不需要上到Server层,减少Server层压力。但是玩家登录时需要Server通知Proxy玩家一些状态。另外也可以设计为单独的聊天集群,每个服都连接到聊天群,和游戏逻辑分离,好处是即使聊天挂掉,也不会影响游戏服。

       操作数据的原则:是先操作DB,再操作Cache,以数据库为准,确保数据无误。数据更改尽量作增量操作,而不是覆盖操作,减少并发产生的问题。

 

优点:

1.      分布式架构,可以通过增加服务器来分担逻辑服或代理服的压力。

2.      当一个代理服宕机后,也不会影响其它代理服的游戏。

3.      当一个场景服宕机后,影响的也只是当前地图的玩家。

4.      业务分离成单独的服务器,分散访问流量,而且可以动态增加,提高在线。

5.      代理保证了游戏服安全,使外网无法直接访问内网游戏服。

缺点

1.      代理服务器成为高负载情况下的通讯瓶颈问题

2.      Cache缓存在高负载下可能压力较大。

3.      由于网关的单节点故障导致整组服务器无法对外提供服务的问题

 

 

欢迎大家讨论和建议,转载请注明作者。——By  King

Email: pencil1@qq.com


http://chatgpt.dhexx.cn/article/MawfLWIY.shtml

相关文章

Vue3之获取DOM元素

简介 我们一般用ref函数来获取DOM元素 使用步骤 使用ref函数创建容器在需要获取的dom元素上写refdom元素保存在容器的value属性上 代码 <script setup> import {ref,onMounted} from "vue"const inputRef ref() onMounted(() > {console.log(inputRef…

vue中动态获取dom元素进行操作

这几天我远程面试了一家公司,期间问题我都回答上来了 但有一个问题我很纳闷 就是你说下vue中获取dom元素的方法吧 我说大体上俩中吧 1.vue中 ref的方法 给元素起一个ref名称 通过 this.$refs.ref名称获取 2.第二个无非是 原生dom操作了 document.getElement // document…

Vue笔记四:Vue获取DOM元素和组件元素的方法

文章目录 Vue获取组件元素ref获取组件元素 Vue获取组件元素 如果想使用哪个DOM元素&#xff0c;就给它加上ref属性&#xff0c;然后用$refs属性获取它的元素对象&#xff0c;示例如下&#xff1a; 全部代码&#xff1a; <!DOCTYPE html> <html><head><m…

Vue.js中$refs{}获取DOM元素

如果我们想获取DOM元素&#xff0c;一般使用js中的document.querySelector来获取这个dom节点&#xff0c;然后在获取元素的值&#xff0c;现在Vue提供给我们一种更便捷的方式来获取DOM元素-----$refs{} $refs{}----获取标签元素 说明&#xff1a;一个对象&#xff0c;持有注册…

vue中怎么获取元素

vue中怎么获取元素 在元素上添加 v-el&#xff1a;food-wrapper &#xff08;不用驼峰的写法&#xff09; vue1版本 报错&#xff1a; vue2版本 &#xff08;vue2把vue1中的 v-el 改为了 ref vue1 v-el:foods-wrapper 调用的时候 this. el.foodsWrappervue2ref:foods−wrapp…

vue怎么点击获取当前元素

vue中有两种方法获取到当前元素 var el event.target; //当前元素&#xff0c;可修改&#xff08;能够用此方法获取到他的子元素&#xff0c;不能获取他本身的内容&#xff09; var el event.currentTarget;//当前元素&#xff0c;不可修改&#xff08;能够用此方法获取到他的…

vue3获取dom

在vue3中获取dom&#xff0c;有几点需要注意&#xff1a; 1&#xff0c;获取dom的ref元素名称&#xff0c;要对应暴露的名称&#xff0c;不然会出现无效的dom报错&#xff0c;也就是拿到的是null 2,在setup中&#xff0c;使用ref&#xff08;null&#xff09;获取dom 3,不能…

vue3中获取dom元素和操作

一&#xff0c;需求概述 直接举例子来说明吧&#xff0c;我想要做的是&#xff0c;遍历这几个菜单&#xff0c;获取他们的dom元素的宽度。当文字dom元素宽度太长的话&#xff0c;需要滚动显示文本。 二&#xff0c;实现思路 对应的html: <div class"icon-box"…

vue 3.0 使用ref获取dom元素

前言 附上vue3.0文档&#xff1a;Vue3中文文档 - vuejs 2022.10.22 更新 鉴于较多人询问几个高频问题&#xff0c;在此做统一回复 ref.value获取到的是null 答&#xff1a;检查是否将ref变量return出去了 答&#xff1a;检查是在哪里进行的console.log&#xff0c;setup函数…

Vue.js实例学习:获取DOM元素

一、获取DOM元素 在Vue中获取DOM元素&#xff0c;我们可以用ref。 用法(和React一样)&#xff1a; &#xff08;1&#xff09;在组件的DOM部分&#xff0c;任意标签中 写上&#xff1a;ref"xxx" &#xff08;2&#xff09;通过组件对象 this.$refs.xxx 获取到元素 …

ref 引用(vue获取DOM元素)

ref 引用 jquery 牛逼 简化了程序员操作DOM的过程 vue 优势&#xff1a; MVVM 在 vue 中&#xff0c;程序员不需要操作DOM。只需要把数据维护好&#xff01;(数据驱动视图) 结论&#xff1a;在 vue 项目&#xff0c;强烈不建议大家安装和使用jQuery&#xff01;&#xff01;&am…

sql中批量插入数据用法

单次插入数据方法 INSERT INTO 表名&#xff08;字段1&#xff0c;字段2&#xff0c;字段3&#xff09;VALUES(第一个值&#xff0c;第二个值&#xff0c;第三个值&#xff09; 多次插入方法 第一种 INSERT INTO 表名&#xff08;字段1&#xff0c;字段2&#xff0c;字段3…

sql-批量插入数据脚本

批量插入数据脚本 1、第一种批量插入数据脚本. 可以基本满足要求。理解上较为简单&#xff0c;所以这个最常用。 DECLAREmaxnumber CONSTANT INT : 5000;--插入5000条数据i INT : 1;--i的取值从1开始 BEGINFOR i IN 1 .. maxnumber loopinsert into ODS.TABLE1--表名(ID, P_ID…

oracle11g批量insert多条,Oracle高效批量插入数据

一、准备工作 建表 CREATE TABLE TEMP_20200210 ( DMC VARCHAR2(100); ) 用程序拼接如下的批量插入的SQL INSERT INTO TEMP_20200210 (DMC) SELECT CD.* FROM ( SELECT 1234567 FROM DUAL UNION SELECT 1234568 FROM DUAL UNION SELECT 1234568 FROM DUAL ) CD 在C盘文件夹下放…

springboot 注解方式批量插入数据

文章目录 一.使用场景二.实现方法1.mysql表结构2.domain3.mapper4.测试类5.测试结果 三.插入效率对比1.批量插入2.一条一条插入 一.使用场景 一次请求需要往数据库插入多条数据时&#xff0c;可以节省大量时间&#xff0c;mysql操作在连接和断开时的开销超过本次操作总开销的4…

Jmeter向数据库批量插入数据

Jmeter向数据库批量插入数据 下面介绍一下Jmeter向mysql数据库中插入数据的入门操作 1、新建一个线程组&#xff0c;这是必经步骤&#xff1a; 在测试计划上右键–>添加–>Theaders(Users)–>线程组 2、添加配置元件JDBC Connection Configuration 在线程组上右键…

【Hbase批量插入数据】

一.批量插入数据&#xff08;hbase用户执行&#xff0c;不可以调整key&#xff09; -- create ns_zj001:bigTab,f01 -- put ns_zj001:bigTab,001,f01:name,zhangsan java -cp ./hbase-tools-1.0.jar:hbase classpath com.suning.tools.Tools -zk hbase01-dev.cnsuning.com,h…

大数据写入到Oracle数据库(批量插入数据)

开发中经常遇到批量插入数据的需求&#xff0c;为了提高开发效率大多会使用ORM架构&#xff0c;个别之处 才会手写SQL&#xff0c;我们使用C#.NET Core5.0开发&#xff0c;所以优先选择了微软的EF。 但是EF原生没有批量操作功能&#xff0c;需要自己扩展或使用第三方的扩展&am…

Mybatis如何批量插入数据?

有一小段时间没有写技术博文了&#xff0c;今天我又来更新啦&#x1f60a;&#x1f60a;&#x1f60a;5月份中间有个小插曲&#xff0c;那就是我在单位打球意外导致脚跟腱受伤&#xff0c;然后住院在家修养了一个多月了&#xff0c;所以小伙伴们在外锻炼时还是时刻注意自身的安…

MYSQL-批量插入数据

批量插入数据 存储过程也有返回值&#xff0c;存储过程有一个或多个返回值&#xff0c;函数有且只有一个返回值 往表里插入1000w数据 1.建表 create database bigData; use bigData;create table dept( id int unsigned primary key auto_increment, deptno mediumint unsi…