打开次世代的钥匙: 腾讯游戏云如何重构⼤世界数字边界 ⽬录Menu ·⼀、⼤世界游戏技术现状与挑战 ·⼆、腾讯游戏云⼤世界技术实践 ⼀、⼤世界游戏现状与挑战 什么是⼤世界游戏 ⼤世界游戏,⼜称开放世界游戏,其核⼼特点在于提供⼀个⼴阔且⽆缝连接的游戏世界,允许玩家 ⾃由探索、⾏动和互动。这类游戏通常具备以下特征: 海量玩家同时在线 ⼴阔且⽆缝的地图 ⾼度的⾏动⾃由 丰富的环境互动 动态剧情发展 持续进化的游戏世界 多样化的任务和剧情结构 ⾃由度和探索性 ⼤世界游戏技术挑战 相较于传统游戏,⼤世界游戏凭借更⼴袤的地图与海量内容,通过⽆缝加载和动态⽣态系统,带来更⾼的⾃由度与沉浸感,但这些也对底层技术架构提出了更⾼要求: 跨平台性能差异 渲染复杂度激增 海量数据⾼效存储 保障低延迟与⾼并发 弹性调度与服务⾼可⽤ ⾼效动态光照表现 ⼤世界游戏技术挑战 LevelStreaming: LevelStreaming技术通过动态加载和卸载关卡部分,优化性能和内存使用,提升大型游戏世界的流畅性HLOD: 在远处的地方加载最差一级的LOD, 在最近的地方我们是加载全精度的LOD,从而达到节省内存的目的 ⼤世界游戏技术挑战 WorldPartition: 自动数据管理和基于距离进行加载的关卡流送系统,它针对大型世界管理提供了一个完整的解决方案。这个系统将整个世界划分为网格单元,保存在一个固定的关卡,不再需要划分繁冗的子关卡,并提供一个自动流送系统,基于与流送源之间的距离来加载和卸载这些网格。 ⼤世界游戏技术挑战 Datalayer: 用于分组、管理和动态加载场景内容,以优化性能和简化开发协作。它允许开发者将复杂场景的内容按功能、区域或用途进行分类和分层,并根据需要动态加载或卸载这些层,以提高内存使用效率和渲染性能 ⼆、腾讯游戏云⼤世界技术实践 ①TKE-资源弹性调度与服务⾼可⽤ 典型⼤世界架构和技术特点 应⽤场景: •超大场景,例如8KM*8KM以上。 •当玩家在大世界的任意位置上,周围环境(包括其他玩家)都是可见的。 •同场景玩家数目众多,例如1万以上,实体总数3万以上(具体根据玩法、单位玩家的平均计算量等估算)。 •目前商用的无缝大世界方案目前主要是SpatialOS和BigWorld ⽆缝策略: •按逻辑分离:场景的主逻辑仍然在一个进程中,主逻辑进程容易形成单点的瓶颈。 •按空间分离:场景分为多个区域,每个区域的场景逻辑运行在独立的进程中。在BigWorld中,分布式场景被称为Space,其中的区域被称为Cell。SpatialOS的Unity服务端也支持这个策略(称之为zoning)。 技术特点: •游戏存在难以预估的波峰波谷,需要快速的扩缩容。 •对网络延迟敏感,游戏服务需要直接/加速对外提供服务,玩家直连。 •游戏需要频繁更新地图、道具等,需要频繁发版和灰度发布。 COS SDK服务 CLB 登录服务 … 3.无损热更 2.Udp直连 1.秒级扩容 EO 4.EO加速和高防 ?可选? GateServer TKE容器服务–超级节点 K8S的发布体验,虚拟机的运⾏效果 CellGameServer CellGameServer SessionServer CellGameServer SpaceGameServer GateServer Client 推荐⼤世界云原⽣游戏部署架构 CDN ⽀付 … 账号数据库 公共服务 玩家数据库 xx数据库 CLS⽇志采集 Prometheus … TKE超级节点能⼒⼀览 云原⽣架构vs⾃建⽹关+cvm(优劣对⽐) 有状态服务Pod扩缩容 1.Pod优雅终⽌ 要实现优雅终⽌,⾸先战⽃服业务代码需要⽀持优雅终⽌的逻辑,在业务代码 ⾥⾯处理下SIGTERM信号,⼀般主要逻辑就是"排⽔",即等待存量的连接完全结束,再退出进程。 2.StatefulSetPod并⾏扩缩容 importsun.misc.Signal; importsun.misc.SignalHandler; publicclassExampleSignalHandler[ publicstaticvoidmain(String...args)throwsInterruptedException[ intcounter=0;while(true)[ System.out.println(counter++);Thread.sleep(500); ] ] ] Signal.handle(newSignal("TERM"),newSignalHandler()[ publicvoidhandle(Signalsig)[ //处理容器上的存量连接,通过业务逻辑确认连接全部处理完成后,再退出进程 //while(true)...System.exit(0); ] ]); apiVersion:apps/v1kind:StatefulSetmetadata: name:nginx-parallel spec: … podManagementPolicy:"Parallel"#并行扩缩容生效,更新不生效 2.灵活调节HPA扩缩容速率 spec: behavior: scaleDown: stabilizationWindowSeconds:300#需要缩容时,先观察5分钟 policies: -type:Pods value:1#每10分钟最多只允许缩掉1个Pod periodSeconds:600scaleUp: stabilizationWindowSeconds:0#需要扩容时,立即扩容 policies: -type:Percent value:900 periodSeconds:15#每15s最大允许扩容当前9倍数量的Pod -type:Pods value:20 periodSeconds:15#每15s最大允许扩容20个Pod selectPolicy:Max#使用两种扩容策略中算出来扩容Pod数量最大的 Pod长连接场景及最佳实践 1.长连接terminationGracePeriodSeconds配置问题 长连接场景下,销毁Pod时需要的优雅终⽌时间可能较长(preStop+业务进程停⽌超过30s),有的极端情况甚⾄可能长达数⼩时,这时候可以根据实际情况⾃定义terminationGracePeriodSeconds,避免过早的被SIGKILL杀死。 具体设置多⼤可以根据业务场景最坏的情况来预估,⽐如对战类游戏场景,同⼀房间玩家的客户端都连接的同⼀个服务端Pod,⼀轮游戏最长半个⼩时,那么就设置terminationGracePeriodSeconds为1800。 2.滚动更新负载不均问题 3.扩容Pod失效问题 apiVersion:apps/v1kind:StatefulSetmetadata: name:nginx-terminationgraceperiodsecondsspec: podManagementPolicy:"OrderedReady" … serviceName:"nginx"replicas:3template: metadata: …spec: containers: -name:nginximage:nginxports: -containerPort:80name:nginx terminationGracePeriodSeconds:1800 4.处理长连接负载不均的最佳实践 •业务层⾯⾃动重连,避免连接"固化"到某个后端Pod上。 •⽐如周期性定时重连,或1个连接中处理的请求数达到阈值(⽐如:1000)后⾃动重连。 ②MongoDB-海量数据存储 为什么是MongoDB 需要更灵活的数据结构 现代业务和应⽤需要数据库⽀持处理半结构化的数据,⽐如游戏背包、战⽃等数据,同时也需要将不完全相同结构的数据整合到⼀起存储,MongoDB的灵活数据结构能够很好的满⾜业务需求。 需要⽀持更快的迭代速度 关系型存储 MongoDB存储 [ first_name:‘Paul’,surname:‘Miller’city:‘London’, location:[45.123,47.232],cars:[ [model:‘Bentley’,year:1973, value:100000,…], [model:‘RollsRoyce’,year:1965, value:330000,…] ] ] 互联⽹业务发展迅速,更新周期越来越短,对数据库的存储结构的变化速度也有了更⾼的要求;MongoDB的Schemaless特性⽀持随时修改数据结构,⽀撑业务和应⽤的快速迭代 BSON数据结构兼容JSON语法,开发⼈员学习使⽤极易上⼿,⼤⼤加快研发和更新速度。 需要⽀持超⼤规模数据业务 ⼤规模系统往往承载敏感业务,服务中断影响极⼤,需要业务和存储层都能够保证业务不中断。MongoDB原⽣分布式架构,轻松保障业务⾼可⽤性和可靠性; 随着业务规模的不断增加,分库分表耗时耗⼒且风险较⾼;MongoDB分⽚架构⽀持实时⽔平扩展,最多可达数百TB甚⾄PB级的数据存储规模,轻松⽀撑海量业务数据。 需求特点 回档闪回 回档不依赖恢复整个实例或者库表 ⽀持对单个⽂档进⾏秒级别回档 ⾼可⽤ 多可⽤部署、灾备实例等特性提供企业级可⽤性和可靠性保证 ⼀站式监控、诊断、优化建议和⼯具 MongoDB ⾼容量⾼性能 分⽚集群架构+顶级硬件,⽀撑亿级dua,单分⽚6TB数据、20w+qps 不停服扩容 增量路由刷新,平滑扩缩容 ⼤幅降低集群rebalance引起的性能抖动 安全稳定 腾讯云多年技术积累和内核优化,完备安全特性以及专业团队快速响应确保服务⽆忧 数据闪回 数据回档效率提升--按key闪回 功能价值 回档时不再需要恢复整个实例或者库表,数据影响⾯可控,降低运维风险; 可以极速回档⼀批记录到指定时间点,⼤幅提⾼业务恢复速度; 可指定业务Key进⾏闪回,也可多集合同时闪回,灵活易⽤。 在线游戏有时会因为Bug或者线上故障导致部分玩家数据错乱,或者⼀⼩撮玩家利⽤游戏漏洞攫取不当利益的情况,或者玩家误操作/盲⽬消费需要回滚数据等情况。在遇到这些问题时⽆法进⾏整库/整表回档,往往只能通过编写脚本甚⾄⼿⼯进⾏数据修复,效率低下且容易产⽣⼆次故障。对此,腾讯云MongoDB按Key闪回功能,⼤幅提⾼数据修复效率和准确性。 Mongodb⼤规模集群优化:内核增量路由刷新 腾讯云路由优化后效果 内核版本 数据量 Chunk数 官方版本时延 优化后时延 性能提升结果 3.6 80T 450W 4500ms 2ms 提升2200倍 4.0 1.2T 25W 300ms 2ms 提升150倍 4.2 25T 150W 1200ms 2ms 提升600倍 5.0 30T 200W 750ms 2ms 提升450倍 腾讯云路由优化后,不管集群规模多⼤,增量路由获取都维持2ms左右。 问题影响: 1.分⽚集群在进⾏moveChunk、splitChunk等操作过程中,需要进⾏ 增量路由更新、路由; 2.版本检查,官⽅版本路由替换过程有三次遍历过程,因此集群越⼤、路由信息越多,抖动越明显; 3.该问题是⼤集群必现问题,官⽅版本当前依然存在,增量路由刷新可实现性能数百上千倍,性能提升,彻底解决分⽚集群chunks较多时引起的抖动; 内核优化⽅案: 1.修改底层路由存储数据结构和路由相关算法; 2.使⽤⼆维数组存储路由信息,⼤幅降低遍历复杂度; 3.优化路由查询,路由更新等算法; 透明平滑扩容,提升客户极致体验 腾讯侧优化实践: 1.现在腾讯云MongoDB已经⽀持不停服扩容分⽚,扩容分⽚对⽤户透明,业务不会闪断,加完分