首页 > 其他分享 >峰值21WQps、亿级DAU,小游戏《羊了个羊》是怎么架构的?

峰值21WQps、亿级DAU,小游戏《羊了个羊》是怎么架构的?

时间:2023-01-18 15:24:20浏览次数:61  
标签:架构 游戏 21WQps 流量 DAU 小游戏 必备 最全 史上

文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 :

免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备
免费赠送 经典图书:《Java高并发核心编程(卷1)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:《Java高并发核心编程(卷2)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:《Java高并发核心编程(卷3)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:尼恩Java面试宝典面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 资源宝库: Java 必备 百度网盘资源大合集 价值>10000元 加尼恩领取


小游戏《羊了个羊》 短短的7天内,DAU突破了1亿、吞吐量峰值21WQps。

《羊了个羊》运营后台数据显示,在短短的7天内,这款小游戏的DAU就突破了1亿。

要知道,除了王者荣耀、原神等屈指可数的现象级手游之外,1亿DAU是这个行业的天花板,

可是,它却被一个看上去设计粗糙的小程序游戏轻松实现了。

然而,其最初技术架构仅支撑 5000QPS并发,7天内突破了1亿、吞吐量峰值21WQps

如何通过架构优化,让一款小程序游戏可以在短时间内实现对上亿DAU的支持?

技术架构、运维体系、以及安全防范等技术体系都存在巨大的挑战。

那么:峰值21WQps、亿级DAU,超高吞吐小游戏,是怎么架构的?

注:本文以 PDF 持续更新,最新尼恩 架构笔记、面试题 的PDF文件,请从下面的链接获取:码云 或者 语雀

1 低吞吐、低可用的最初技术架构

《羊了个羊》最开始的技术架构,

因为技术以及时间等因素,在设计上有些简单,

如下图1所示,

玩家流量通过一个接入层 LB进入,

传输给服务层几个 POD 进行游戏逻辑处理,

再将数据进行存储,

其中,热数据存储在Redis中, 持久化数据存在MongoDB。

最初的服务层几个 POD ,都是单点服务

单点服务的性能瓶颈,再加上代码未进行充分优化,造成当时的系统最高只能承受5000的QPS

但实际流量增长很快, 并且持续升高并到达性能瓶颈,游戏服务开始瘫痪,全部玩家无法再进行游戏。

2 技术架构全面升级

大部分项目,都存在低吞吐、低可用的最初技术架构

但是,如果吞吐量一上来,就面临着优化

so,

面对服务中断, 《羊了个羊》团队在详细分析原来架构的不足之后,

《羊了个羊》 做了 技术架构全面升级

具体如下图:

接入层的架构优化:

  • 启用CDN做游戏动静态资源分离,让玩家使用的游戏资源实现就近下载,减轻网络端压力;

  • 设计多LB入口实现入口高可用和限流,避免系统被超额流量过载;

服务层的架构优化:

  • 优化服务层的自动扩容,应对巨量的 突发流量
  • 具体措施上,首先通过引入腾讯云TKE Serverless 的弹性机制,实现游戏服自动纵向和横向扩展,
  • 实现服务解藕,增加容错和熔断机制;

Cache层的架构优化:

  • Redis缓存热数据,分担数据库查询压力等。

存储层的架构优化:

  • 把MongoDB转换为读写分离模式,配合代码逻辑优化实现性能提升,
  • 引入分库实现业务分层与隔离,

优化之后,《羊了个羊》最新技术架构

经过上述一系列技术升级, 新架构经受住了一波又一波的流量峰值考验,

在高峰期DAU过亿后,游戏技术系统依旧表现稳定,

这对于一个发布才几个月的小游戏来说,在国内也很难再找到这样的例子。

注:本文以 PDF 持续更新,最新尼恩 架构笔记、面试题 的PDF文件,请从下面的链接获取:码云 或者 语雀

3 运维体系的升级

通过技术架构的迭代以及不断激增的用户,《羊了个羊》技术团队也认识到,因为爆火太快,更需要快速补齐运维能力,才能更好的持续调整和提升游戏体验。

在运维体系这块,包括 业务日志、性能监测等。

为快速补齐运维能力,通过业务日志诊断程序性能,配合业务调优以减少服务器压力;

《羊了个羊》选择了开箱即用的日志服务 云服务度 CLS,

当然,有条件的团队,使用自建的 elk平台,或者基于clickhouse的高并发分布式日志监测平台,也是可以的。

CLS 对游戏接口稳定性、异常调用趋势的监控可帮助他们快速观测产品质量 ,并第一时间获取到异常panic统计分析和告警 ;

在游戏运营方面,玩家登录链路耗时/对局时间等数据亦可通过 CLS 分析、校验及处理,进而调整和提升游戏体验;同时还能满足游戏用户行为及审计对账等需求。

CLS的云原生特性,辅助进行稳定性和程序性能调优。另外,CLS用作简单运维工具查日志、做接口调用告警

借助CLS的SQL分析、仪表盘、监控告警能力,

可以分析出程序可优化点,解决游戏开发商在初期和爆发期对游戏稳定性和运营数据分析的难题。

除了运维数据外,

CLS还提供了数据观测功能

在游戏调整玩法、分析活动数据时,运营人员可借助CLS快速观测数据变化,并作出应对策略。

另外,还将游戏的通关数据、用户行为分析、审计对账等运营数据在CLS中存储分析。

4 安全防范领域的升级

哪里有流量,哪里就有黑产。

许多恶意BOT流量大量涌入到游戏中,导致游戏服务器 QPS、带宽快速升高,影响服务可用性等情况

由于设计之初没有充分考虑安全问题,因此引来大量不法分子通过恶意BOT抢刷游戏排行,

几乎每分每秒,都有恶意流量访问游戏接口,

并且这一部分恶意群体通过互联网、QQ群和微信群中传播恶意刷排行的脚本,

极大的破坏了游戏公平性,让本该属于游戏对抗的乐趣被恶意BOT抹杀。

而且更重要的是随着羊了个羊热度的不但攀升,许多恶意BOT流量的大量涌入,导致游戏服务器 QPS、带宽快速升高,一度影响服务可用性。

《羊了个羊》接入腾讯云WAF进行防护,

一开始接入WAF的时候,相关 QPS 峰值已达 21W,

接入WAF之前CPU一直处于临界值水位 、网络链接打满的导致服务不可用的情况。

通过选择负载均衡型WAF, 即可在不改动网络架构的情况下3秒完成业务接入WAF,实现在用户无感的情况下对恶意流量进行清洗及防护。

为了有效打击攻击者的恶意流量,

WAF 中 BOT 行为管理也提供了全链路、全生命周期的的恶意行为流量体系,实现快速高效的恶意流量治理。

最后在安全防范领域,通过安全方案抵抗异常流量攻击。

5 互联网应用设计的“三高”原则

通过《羊了个羊》团队在小游戏架构扩容、系统运维以及安全防范领域的实战经验,可以给大家一些参考。

面对突发流量,互联网应用在设计的过程中需要考虑以下能力:

第一是高并发,能够承载瞬时爆发流量,保证响应时长在可接受的范围;

其次是高可用,系统持续提供服务,小概率发生宕机时,过载保护将故障控制在可承受范围内,不影响核心业务;

最后是高扩展,服务系统应该具备水平和垂直扩展能力,在成本和可用性中实现最佳平衡点。

注:本文以 PDF 持续更新,最新尼恩 架构笔记、面试题 的PDF文件,请从下面的链接获取:码云 或者 语雀

推荐阅读:

Docker面试题(史上最全 + 持续更新)

场景题:假设10W人突访,你的系统如何做到不 雪崩?

Springcloud gateway 底层原理、核心实战 (史上最全)

Flux、Mono、Reactor 实战(史上最全)

sentinel (史上最全)

Nacos (史上最全)

分库分表 Sharding-JDBC 底层原理、核心实战(史上最全)

TCP协议详解 (史上最全)

clickhouse 超底层原理 + 高可用实操 (史上最全)

nacos高可用(图解+秒懂+史上最全)

队列之王: Disruptor 原理、架构、源码 一文穿透

环形队列、 条带环形队列 Striped-RingBuffer (史上最全)

一文搞定:SpringBoot、SLF4j、Log4j、Logback、Netty之间混乱关系(史上最全)

单例模式(史上最全)

红黑树( 图解 + 秒懂 + 史上最全)

分布式事务 (秒懂)

缓存之王:Caffeine 源码、架构、原理(史上最全,10W字 超级长文)

缓存之王:Caffeine 的使用(史上最全)

Java Agent 探针、字节码增强 ByteBuddy(史上最全)

Docker原理(图解+秒懂+史上最全)

Redis分布式锁(图解 - 秒懂 - 史上最全)

Zookeeper 分布式锁 - 图解 - 秒懂

Zookeeper Curator 事件监听 - 10分钟看懂

Netty 粘包 拆包 | 史上最全解读

Netty 100万级高并发服务器配置

Springcloud 高并发 配置 (一文全懂)

标签:架构,游戏,21WQps,流量,DAU,小游戏,必备,最全,史上
From: https://www.cnblogs.com/crazymakercircle/p/17059585.html

相关文章

  • 三子棋小游戏
    今天实现一个三子棋小游戏,虽然小,但是“麻雀虽小,五脏俱全”,通过三子棋游戏,我们来学习如何模块化地写代码。首先,我们创建一个game.h头文件,再创建一个game.c和test.c源文件。//......
  • 【补档】15 Jan 2293. 极大极小游戏(每日一题)
    15Jan2293.极大极小游戏给你一个下标从0开始的整数数组nums,其长度是2的幂。对nums执行下述算法:设n等于nums的长度,如果n==1,终止算法过程。否则,创建......
  • 用Three.js写h5小游戏-3d飞机大战
    用Three.js写h5小游戏-飞机大战​​博主的话​​​​运行图片​​​​目录路径!​​index.html​​博主的话Three.js是js的一个3D引擎,比较复杂。比如光是Three.js就附带了10......
  • 适合编程初学者的开源项目:小游戏2048(安卓Compose版)
    目标为编程初学者打造入门学习项目,使用各种主流编程语言来实现。2048游戏规则一共16个单元格,初始时由2或者4构成。1、手指向一个方向滑动,所有格子会向那个方向运动。2......
  • 2293. 极大极小游戏
    2293.极大极小游戏给你一个下标从0开始的整数数组nums,其长度是2的幂。对nums执行下述算法:设n等于nums的长度,如果n==1,终止算法过程。否则,创建一个......
  • 【点击即用】自制的一款情侣小游戏
    开发前提学了3个月的编程,始终停留在书本阶段,并没有开发出产品。所以最近借鉴大神们的源码,加上自己的改动,做了一款在线小游戏(结合使用环境,主要照顾手机移动端,所以电脑端的体......
  • golang实现的一个小游戏–猜数字
    随机生成一个数字,输入一个数字看是否匹对,匹配则结速,反之提示是大了还是小了,代码如下:packagemainimport("bufio""fmt""math/rand""os""strconv""time")var......
  • 适合编程初学者的开源项目:小游戏2048(鸿蒙ArkTS版)
    目标为编程初学者打造入门学习项目,使用各种主流编程语言来实现。2048游戏规则一共16个单元格,初始时由2或者4构成。1、手指向一个方向滑动,所有格子会向那个方向运动。2......
  • java猜数小游戏
    问题:程序自动生成一个1~100之间的随机数字,使用程序猜出这个数字是多少:Random可以随机生成一个随机数使用方法:导包创建对象Randomr=newRandom();//只有r是变......
  • 前端使用canvas实现贪吃蛇小游戏
    贪吃蛇是一款益智小游戏,通过点击上下左右四个按键控制蛇头移动。设计思路主要是设计蛇的身体和移动方法。将蛇的身体设置成一个数组,数组里存放蛇身每一节的xy坐标。游......