当前位置: 首页 > news >正文

近年GDC服务器分享合集(四): 《火箭联盟》:为免费游玩而进行的扩展

如今,网络游戏采用免费游玩(Free to Play)加内购的比例要远大于买断制,这是因为前者能带来更低的用户门槛。甚至有游戏为了获取更多的用户,选择把原来的买断制改为免费游玩,一个典型的例子就是最近的网易的永劫无间改免费。不过修改付费模式后,可能带来用户量的大幅增长,这就对原来的服务端架构有了更高的要求。

在GDC 2021上,来自《火箭联盟》项目的工程师就为我们分享了类似的经验——《《火箭联盟》:为免费游玩而进行的扩展》(Rocket League: Scaling for Free to Play)。他讲述了如何优化架构,以支撑改版后用户量多达5倍的增长。
在这里插入图片描述

《火箭联盟》是一款由美国独立游戏工作室Psyonix开发的赛车竞速游戏,获得过TGA年度最佳体育游戏大奖,在国内也有腾讯代理。为了拓展更多的用户,它在2020年夏天转为免费游戏。

分享主要包括几方面:一是为改版做的准备和压力测试,二是对架构的扩展和改进,三是从改版中获得的经验。

改版准备

项目组估计,改版后新玩家数量是改版前常规release发布时的3-5倍。因此压力测试以5倍上限作为目标。

同时项目组向Google和Redis Labs需求技术支持,花费在这上面的代价肯定小于机器宕机的代价。

在这里插入图片描述

压力测试选用的框架是Locust。这是一个用Python写的开源压力测试工具,它是分布式和可伸缩的,可以支持成千上万用户,而且提供基于Web的UI查看测试结果。
在这里插入图片描述

测试结果的评估包括几个方面:HTTP返回码、服务日志及资源利用率。根据测试结果,对代码做了相应的调整和改进。

在这里插入图片描述

架构扩展

首先是核心服务迁移到Kubernetes。从原来的Google App Engine(GAE)迁移到Google Kubernetes Engine(GKE)。前者只有容器功能,而后者提供了完整的服务编排和集群功能。

在这里插入图片描述

其次是匹配服务的改造。原有的匹配服务是一个单线程的.NET应用,性能较差。新版匹配服务改用了性能更好的OpenMatch。OpenMatch是一个谷歌发布的开源游戏匹配框架,依托于容器和Kubernetes来运行;它的匹配算法基于MapReduce,可扩展性强。

在这里插入图片描述

再次是Redis企业版移植。Redis企业版的全自动重分片(Re-sharding)功能是他们特别需要的特性,尽管它会带来一些性能开销。另外,Redis企业版提供了更好的命令可视化,以及完善的监视图表。

在这里插入图片描述

然后是MySQL改进。原来的架构只支持MySQL垂直扩展,面对改版后更高的并发压力,单机承载面临瓶颈,又没有时间迁移到水平扩展的架构,因此选择使用ProxySQL。ProxySQL是一种MySQL代理中间件,选择它主要是看中了动态查询路由、故障切换等功能以及扩展能力强的特点,尽管使用它会带来一定的学习曲线。

在这里插入图片描述

最后是流量限制(Rate Limit)。使用了登录队列来控制流量,这也是许多游戏的通常做法。后续还进一步对除了登录外的其他服务进行流量控制。

在这里插入图片描述

经验总结

上线之后的巅峰在线人数多于改版前的5倍,但是少于压力测试的最高值,因此还在允许的承载范围内,原先的5倍预估还算比较准确。在线人数稳定后也仍然维持在3倍的高位,更多的在线对服务器带来了更大的承载压力,因此后续版本迭代也在进行持续的压力测试。

在这里插入图片描述

经过这次改版,收获了以下经验:

  1. 早早开始规划。不要羞于寻求外界帮助,但也不要过度规划。
  2. 要做好压力测试很难,但是非常重要。
  3. 有序安排好重要的特性开发,依据中间的时间节点按时完成。
  4. 像流量限制一样实现多种功能的控制。

在这里插入图片描述

相关文章:

近年GDC服务器分享合集(四): 《火箭联盟》:为免费游玩而进行的扩展

如今,网络游戏采用免费游玩(Free to Play)加内购的比例要远大于买断制,这是因为前者能带来更低的用户门槛。甚至有游戏为了获取更多的用户,选择把原来的买断制改为免费游玩,一个典型的例子就是最近的网易的…...

android反射详解

1,反射的定义 一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的,并且能够获得此类的引用。于是我们直接对这个类进行实例化,之后使用这个类对象进行操作。 反射则是一开始并不知道我要初始化的类对象是…...

Python 反射和动态执行

反射主要应用于类的对象上,在运行时,将对象中的属性和方法反射出来,通过字符串对对象成员(属性、方法)进行查找、获取、删除、添加成员等动作,是一种基于字符串的事件驱动技术。 python是一门动态语言&…...

计算机网络常见端口号

端口号标识了一个主机上进行通信的不同的应用程序。比如网站服务器80端口一般都是开启的,等你来连接。 端口划分: (1)常用端口,公共端口(保留给公共服务所使用),端口号为0-1023之间…...

SpringBoot / Vue 对SSE的基本使用(简单上手)

一、SSE是什么? SSE技术是基于单工通信模式,只是单纯的客户端向服务端发送请求,服务端不会主动发送给客户端。服务端采取的策略是抓住这个请求不放,等数据更新的时候才返回给客户端,当客户端接收到消息后,…...

Qt串口基本设置与协议收发

前言 1.一直都想要做一个Qt上位机,趁着这个周末有时间,动手写一下 2.comboBox没有点击的信号,所以做了一个触发的功能 3.Qt的数据类型很奇怪,转来转去的我也搞得很迷糊 4.给自己挖个坑,下一期做一个查看波形的上位…...

interview3-微服务与MQ

一、SpringCloud篇 (1)服务注册 常见的注册中心:eureka、nacos、zookeeper eureka做服务注册中心: 服务注册:服务提供者需要把自己的信息注册到eureka,由eureka来保存这些信息,比如服务名称、…...

kafka详解一

kafka详解一 1、消息引擎背景 根据维基百科的定义,消息引擎系统是一组规范。企业利用这组规范在不同系统之间传递语义准确的消息,实现松耦合的异步式数据传递. 即:系统 A 发送消息给消息引擎系统,系统 B 从消息引擎系统中读取 A…...

Flutter yuv 转 rgb

1、引用yuv_converter库 yuv_converter: ^0.0.1 2、导入头文件: import package:yuv_converter/yuv_converter.dart;3、yuv转rgb YuvConverter.yuv420NV21ToRgba8888(yuvRawData, 512, 512) 根据yuv格式选择不同的api。 举个例子: void initState() …...

MySQL——子查询

2023.9.8 相关学习笔记: #子查询 /* 含义: 出现在其他语句中的select语句,称为子查询或内查询 外部的查询语句,称为主查询或外查询分类: 按子查询出现的位置:select后面:仅仅支持标量子查询fro…...

Java学习笔记---多态

面向对象三大特征之一(继承,封装,多态) 多态的应用场景:根据传递对象的不同,调用不同的show方法 一、多态的定义 同类型的对象,表现出的不同形态(对象的多种形态) 二…...

2023-09-10 LeetCode每日一题(课程表 II)

2023-09-10每日一题 一、题目编号 210. 课程表 II二、题目链接 点击跳转到题目位置 三、题目描述 现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1。给你一个数组 prerequisites ,其中 prerequisites[i] [ai, bi] ,表示在…...

合并区间【贪心算法】

合并区间 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 class Solution {public int[][] merge(int[…...

2023,软件测试人的未来在哪里?

2023年,IT行业出现空前的萧条,首先是年初一开始各大厂像着了魔似的不约而同的纷纷裁员、降薪、奖金包缩水,随之而来的是需求萎缩,HC减少或封锁等等。 而有幸未被列入裁员名单的在职人员,庆幸之余也心有余悸&#xff0…...

Python中的Numpy向量计算(R与Python系列第三篇)

目录 一、什么是Numpy? 二、如何导入NumPy? 三、生成NumPy数组 3.1利用序列生成 3.2使用特定函数生成NumPy数组 (1)使用np.arange() (2)使用np.linspace() 四、NumPy数组的其他常用函数 (1)np.z…...

LeetCode刷题笔记【27】:贪心算法专题-5(无重叠区间、划分字母区间、合并区间)

文章目录 前置知识435. 无重叠区间题目描述参考<452. 用最少数量的箭引爆气球>, 间接求解直接求"重叠区间数量" 763.划分字母区间题目描述贪心 - 建立"最后一个当前字母"数组优化marker创建的过程 56. 合并区间题目描述解题思路代码① 如果有重合就合…...

nvidia-smi 命令详解

nvidia-smi 命令详解 1. nvidia-smi 面板解析2. 显存与GPU的区别 Reference: nvidia-smi命令详解 相关文章&#xff1a; nvidia-smi nvcc -V 及 CUDA、cuDNN 安装 nvidia-smi(NVIDIA System Management Interface) 是一种命令行实用程序&#xff0c;用于监控和管理 NVIDIA G…...

fork()函数的返回值

在程序中&#xff0c;int pd fork() 是一个典型的 fork() 调用。fork() 函数会创建一个新的进程&#xff0c;然后在父进程中返回子进程的进程ID&#xff08;PID&#xff09;&#xff0c;在子进程中返回0。所以 pd 的值会根据当前进程是父进程还是子进程而有所不同&#xff1a;…...

Stable Diffusion WebUI挂VPN不能跑图解决办法(Windows)

如何解决SD在打开VPN的状态不能运行的问题 在我们开VPN的时候会出现无法生成图片&#xff0c;也无法做其他任何事&#xff0c;这个时候是不是很着急呢&#xff1f; 别急&#xff0c;我这里会说明如何解决。 就像这样&#xff0c;运行半天生成不了图&#xff0c;有时还会出现…...

Android的本地数据

何为本地&#xff0c;即写完之后除非手动修改&#xff0c;否像嘎了一样在那固定死了 有些需求可能也会要求我们去写死数据&#xff0c;因为这需求是一成不变的&#xff0c;那么你通常会用什么方法写死呢&#xff1f; 1. 本地存储-SharedPreferences 此方法可以长时间保存于手…...

android NDK 开发包,网盘下载,不限速

记录下ndk 开发包的地址&#xff0c;分享给大家。 另外有Android studio的下载包&#xff0c; 在另一篇文章 链接&#xff1a;http://t.csdn.cn/JSr9x Android Studio.exe 下载 2023 最新更新&#xff0c;网盘下载_hsj-obj的博客-CSDN博客 主要是19-25&#xff0c;其他的没有…...

【每日一题Day320】LC2651计算列车到站时间 | 数学

计算列车到站时间【LC2651】](https://leetcode.cn/problems/calculate-delayed-arrival-time/) 给你一个正整数 arrivalTime 表示列车正点到站的时间&#xff08;单位&#xff1a;小时&#xff09;&#xff0c;另给你一个正整数 delayedTime 表示列车延误的小时数。 返回列车实…...

C语言柔性数组详解:让你的程序更灵活

柔性数组 一、前言二、柔性数组的用法三、柔性数组的内存分布四、柔性数组的优势五、总结 一、前言 仔细观察下面的代码&#xff0c;有没有看出哪里不对劲&#xff1f; struct S {int i;double d;char c;int arr[]; };还有另外一种写法&#xff1a; struct S {int i;double …...

Redis-带你深入学习数据类型list

目录 1、list列表 2、list相关命令 2.1、添加相关命令&#xff1a;rpush、lpush、linsert 2.2、查找相关命令&#xff1a;lrange、lindex、llen 2.3、删除相关命令&#xff1a;lpop、rpop、lrem、ltrim 2.4、修改相关命令&#xff1a;lset 2.5、阻塞相关命令&#xff1a…...

react拖拽依赖库react-dnd

注&#xff1a;对于表格自定义行可以拖拽和树自定义节点可以拖拽等比较适用&#xff0c;其余的拖拽处理可以使用dragstart&#xff0c;drop等js原生事件来实现 react-dnd使用方法很简单&#xff0c;直接上干货 第一步安装依赖并引入 import { DndProvider } from react-dnd;…...

win10环境安装使用docker-maxwell

目的&#xff1a;maxwell可以监控mysql数据变化&#xff0c;并同步到kafka、mq或tcp等。 maxwell和canal区别&#xff1a; maxwell更轻量&#xff0c;canal把表结构也输出了 docker bootstrap可导出历史数据&#xff0c;canal不能 环境 &#xff1a;win10&#xff0c;mysql5…...

Docker部署RabbitMQ

Docker部署RabbitMQ 介绍 RabbitMQ是一个开源的消息队列系统&#xff0c;它被设计用于在应用程序之间传递消息。它采用了AMQP&#xff08;高级消息队列协议&#xff09;作为底层通信协议&#xff0c;这使得它能够在不同的应用程序之间进行可靠的消息传递。 那么&#xff0c;…...

23个react常见问题

1、setState 是异步还是同步&#xff1f; 合成事件中是异步 钩子函数中的是异步 原生事件中是同步 setTimeout中是同步 相关链接&#xff1a;你真的理解setState吗&#xff1f;&#xff1a; 2、聊聊 react16.4 的生命周期 图片 相关连接&#xff1a;React 生命周期 我对 Reac…...

【python基础】——Anaconda下包更新的坑及安装与卸载、及安装后Jupyter Notebook没反应的解决方法

文章目录 前言一、起因:如何一步步走到卸载重装anaconda?二、卸载anaconda二、重新安装anaconda三、关于安装Anaconda后,打开Jupyter Notebook运行代码没反应且in[ ]没有*前言 本文主要用来记录自己近期踩坑的一些复盘。其中坑有: ‘.supxlabel’ 不起作用的解决pip list 与…...

CSS 中的 display 和 visibility

CSS 中的 display 和 visibility 都可以设置一个元素在浏览器中的显示或隐藏效果。 display: 隐藏某个元素时&#xff0c;不会占用任何空间。换句话讲&#xff0c;不会影响布局。visibility: 隐藏某个元素时&#xff0c;仍需占用与未隐藏之前一样的空间。换句话讲&#xff0c;…...

推广自己的网站需要怎么做/飞猪关键词排名优化

2017陕西省互联网大会将于9月16日至17日在西安高新区都市之门会议中心举行。 7月26日&#xff0c;2017陕西省互联网大会新闻发布会在西安召开。据了解&#xff0c;由陕西省互联网协会主办&#xff0c;西部网、陕西头条、陕西网络广播电视台承办的2017陕西省互联网大会将于9月1…...

wordpress卸载重装/网页怎么做

摘要: 主要特性: (1)软件小而高效&#xff0c;使用流畅&#xff0c;设计人性化 (2)支持截图区域的手工选择和根据窗口自动识别选择 (3)支持矩形&#xff0c;圆形&#xff0c;直线&#xff0c;箭头&#xff0c;画笔&#xff0c;文本等注释工具 (4)支持橡皮擦除功能 (5)无限次数的…...

网站设计和策划的步骤是什么/微博推广效果怎么样

这边我是使用了一个数组使用ArrayasLIst转换成了list集合&#xff1b; 打算遍历取出并删除原数据&#xff1b; 删除的时候报错UnsupportedOperationException 后来发现是asList只是给原来的数组套了一个list的接口&#xff0c;并没有实现原生的删除api所以无法使用&#xff1b…...

什么在线做动图的网站比较好/2022最新时事新闻及点评

VISA仪器控制/ VISA Instrument Control 1 VISA简介/ VISA Introduction VISA(Virtual Instrument Software Architecture&#xff0c;简称为VISA)&#xff0c;即虚拟仪器软件结构&#xff0c;是VXI plug&play联盟制定的I/O接口软件标准及其规范的总称。VISA提供用于仪器编…...

哪些网站是由wordpress做的/小说排行榜百度

文章讲的是大数据&#xff1a;释放应用价值&#xff0c;数据融合先行&#xff0c;我们所处的社会已经从IT(Information Technology)时代全面跨入DT(Data Technology)时代&#xff0c;数据渗透到当今每一个行业和业务职能领域&#xff0c;成为关键的生产要素之一。从Gartner发布…...

这2个代码 找做网站的 安装一下/怎么引流到微信呢

网络配置系列1interface dialernat outbound 3000inbound与nat server本系列主要描述在工作中碰到的网络配置问题及对应的解决方案&#xff0c;以备将来能够自己回溯和学习。特别提醒&#xff0c;阅读本文需要一些网络基础知识&#xff0c;文中不再做详细解释。interface diale…...