db(一般是mysql,或是类似的,比如mariadb)在游戏服务器中,启动了数据落地的作用。游戏服务器可以直接和db建立访问连接操作数据,或者通过一个中间人(DbServer)来完成这个工作。本文,我们以独立DbServer来分析带来的好处,以及遇到的问题。

下文提到的一些优势,如果不单独封装一个db服务器(通过一个存储模块的方式来实现)也可能可以做到。但如果有一个独立的db服务器时,更容易把这一点实现的比较纯粹。

适配存储过程,隐藏存储细节

db服务器可以做到,缓存数据存储到redis,超时数据mysql落地,而外层数据完全无感。同样的,当底层进行存储切换,或是升级时,只需要改动db服务器的代码。举一个例子,我们的服务器支持部分机器人玩家进入游戏,但是机器人玩家的数据我们不希望会改变,从而方便我们重复做一些性能测试。于是,我们再dbserver上做了差异化,机器人的数据加载后,不再接受数据回写,感觉上是这些数据是只读的。

db服务器可以额外做一层逻辑业务有关的cache。比如玩家登出后30分钟,他的数据实际还在db服务器上,再次登录不需要从mysql走一套。

外围服务器(这里称除了db服务器,都是外围服务器)不再需要链接db相关的库

外围服务器需要发起存储,只能通过网络消息等方式发起,而无法直接访问数据库。

隐藏存储方案的细节

我们知道,每次mysql的访问都需要建立一条单独的mysql连接。而通过是同步的mysql访问会独占当前线程一定的cpu时间。由此,我们自然可以推出,dbserver需要有一个线程池和一个连接池,这样可以最大化mysql的存储吞吐量。

如果这样的连接池和线程池实现在所有的游戏进程中(假设我们是一个多进程的服务器组)。如果滥用,mysql的总连接数已经系统的总线程数容易暴涨;而如果非常谨慎开支,又无法最大化IO。而如果单独放置在DBServer上来调度,就比较容易控制和调度这些资源,做到兼顾性能和资源浪费问题了。

隔离逻辑类型

在我们的方案中,大部分数据在db中都是以blob的形式存储的。那么,在dbServer中,我们需要有一个从对象转换为byte[]的过程。而我们系统中只有注册的存储类型才能够正常序列化。这就要求,逻辑服务器中使用的数据结构和最终存储的数据结构是一个数据结构(比如逻辑运算使用PackItem,存储使用DbPackItem)。

这么做的好处

类型功能清晰,归属明确。

存储的数据字段,不会因为逻辑的临时需要,多存储一些无用数据。也就是双方(逻辑和存储)不用互相迁就。

坏处也比较明显,可能需要多一次对象创建和内存拷贝。

不足

加载周期变得更长,因为跨进程的缘故,如果是串联读取多个数据,需要进行异步等待,代码复杂度和时间消耗都会增加。

增加了服务器启动和关闭的流程复杂性。比如逻辑服务器因为需要取一些系统上次缓存的数据来恢复游戏,但必须等db服务器启动完成,才能这么做。

存储的数据结构增多时,需要定义大量的数据同步协议,相比于多线程可以限制性的直接操作(如果多线程情况下使用消息传递数据的情况,和我们遇到的问题应该差不多),要繁琐和难以维护一些。

服务器组复杂度上升后的问题。比如如果db服务器和逻辑服务器的socket连接断了,数据该怎么办。

db服务器在游戏服务器组中的作用相关推荐

  1. web服务器也是端系统么,Web服务器和游戏服务器的那些事儿

    随便聊聊 我接触过的软件,最早定义为C/S(Client/Server)和B/S(Brower/Server),如今传统意义上的C/S程序已经很少了,其实App和网络游戏还归位这一类.但更多的是B/S ...

  2. 登陆服务器和游戏服务器为甚要分开总结

    登陆服务器和游戏服务器为甚要分开 摘自知乎 把游戏登陆逻辑单独成一个服务的优点有如下几点: 登陆入口唯一.:游戏如果不是自己运营,则需要上其他平台.每个平台只能有一个登陆服务器,但是游戏逻辑服务器要跟 ...

  3. 为什么手游服务器一般将登陆服务器和游戏服务器分开?

    搭建手游服务器,网上很多资料都是登陆服务器和游戏服务器分开,问一下,这样做有什么优势? 把游戏登陆逻辑单独成一个服务的优点有如下几点: 1.登陆入口唯一.:游戏如果不是自己运营,则需要上其他平台.每个 ...

  4. 网上游戏服务器维护,游戏服务器正在维护中

    游戏服务器正在维护中 内容精选 换一换 应用容器化改造有三种方式,您可单击这里查看.本教程以某游戏为例,将该游戏进行微服务的架构改造,再进行容器化.本教程不对改造细节做深度讲解,仅讲解大致的建议.如需 ...

  5. 游戏一直服务器维护,游戏服务器显示维护中

    游戏服务器显示维护中 内容精选 换一换 应用容器化改造有三种方式,您可单击这里查看.本教程以某游戏为例,将该游戏进行微服务的架构改造,再进行容器化.本教程不对改造细节做深度讲解,仅讲解大致的建议.如需 ...

  6. 传统软件服务器与游戏服务器架构区别

    项目 智能客服 爬虫 SLG游戏 语言 java python kotlin 模型 异步事件驱动 可能没什么模型可言 actor模型 传输协议 http http tcp + netty 传输结构 j ...

  7. 网站查询服务器租期,游戏服务器租期

    游戏服务器租期 内容精选 换一换 创建一台或多台裸金属服务器.裸金属服务器的登录鉴权方式包括两种:密钥对.密码.为安全起见,推荐使用密钥对方式.密钥对指使用密钥对作为裸金属服务器的鉴权方式.接口调用方 ...

  8. 一键端服务器维护,游戏服务器一键端

    游戏服务器一键端 内容精选 换一换 如果您需要使用鲲鹏GCC编译器中一些加速库,则需要先在服务端安装鲲鹏GCC编译器.鲲鹏GCC编译器是针对鲲鹏平台的高性能编译器,它基于开源GCC开发的编译器工具链( ...

  9. 怎样制作网吧服务器,网吧游戏服务器制作的过程是怎样的

    网吧的游戏都是放在服务器上面的,这就涉及到网吧游戏服务器制作,对于一些新生的网吧管理员可能还不是很清楚,网吧游戏服务器制作的过程,作为网吧游戏资讯,以2000SEVER+win98为例. 一.服务器部 ...

  10. [自己做个游戏服务器二] 游戏服务器的基石-Netty全解析,有例子,多图解释

    目录 1.Netty 是什么 2.Netty的优点 3.核心组件 3.1 Netty的线程模型 3.2 EventLoopGroup 3.3 Channel 3.4  option()与childOp ...

最新文章

  1. R语言可视化包ggplot2绘制平滑曲线、回归线实战:geom_smooth() 函数
  2. 【程序员跳槽】学弟被高薪挖走不到一年就后悔的无奈经历,到底是老板的水深?还是学弟太年轻?
  3. 开发日记-20190711 关键词 Perl的后续学习
  4. AMAZING AUCTION (第三届省赛)
  5. linux实验串行端口程序设计,Linux下串口编程心得(转)
  6. Java web后端1 XML URI与URL HTTP Tomcat
  7. 中国电信回应“变相涨价说”:对原畅享套餐进行的优化升级
  8. java aop xml配置_spring AOP使用 xml配置
  9. 监控系统选型,这篇不可不读
  10. Java中String,StringBuffer,StringBuilder的区别
  11. Camera--V4L2驱动学习记录
  12. CentOs 6.2 x64双网卡绑定
  13. [转]大量正版软件下载链接
  14. B站 郝斌C语言 课件+笔记 (全)
  15. 27、一个扒网站软件——teleport ultra(静态页面)
  16. 【数据结构与算法-动态规划系列经典例题汇总】
  17. PTA - 数据库合集3
  18. 学习Vue3 第二十七章(自定义指令directive)
  19. 吃热狗游戏Java_《我的世界》吃才是王道“食物工艺”让你尝遍八大菜系
  20. 创业投资——巴比伦富翁的理财课

热门文章

  1. 程序员提高自身能力的N种方式
  2. 百果园app系统开发b2c模式详解
  3. 跨境电商:我们快要死了!可能都撑不过一个月
  4. python抢淘宝的东西-Python实现淘宝秒杀功能
  5. 年底个人安全注意事项
  6. 桌面快捷方式小箭头去除与恢复方法
  7. A Magic Lamp
  8. CTSC2018 APIO2018 颓废 + 打铁记
  9. no python application found, check your startup logs for errors错误解决
  10. 《回炉重造》——注解