转载来源:云家社区原作者:余国良小游戏自上线以来,微信平台出现了很多现象级的小游戏,包括一跳一跳。微信小游戏和小程序在技术上有什么区别?开发者在开发小游戏时通常会遇到哪些问题?如何规避和解决,来自腾讯游戏云资深架构师于国良,将为我们带来微信小游戏架构的设计和发展方向。微信小游戏有什么特点?小游戏最大的特点是去中心化分发和友链传播。这将带来很多机遇和挑战。机会在于它可能会带来爆款。挑战在于以前的经验可能不适用,包括技术经验。那么微信小游戏的特性对我们的架构有什么要求呢?这里我主要列举两点。一是全区需求充分。为了充分利用微信的社交网络,游戏需要在所有地区和服务器上可用。第二个需求是线上扩容的需求,因为任何游戏都可能成为爆款,在微信上有几何级数的增长,所以几乎是刚性需求。我们来看一个案例,是我们腾讯云上一个真实客户的案例。其小游戏在短时间内从数万人猛增至约200万。这个客户经历了什么?首先,游戏上线后,我们很快发现流量增长很快,系统流量不够用。这时候我们可以通过云主机在线分发。但是第一个瓶颈出现了。吞吐量到了线就很难扩容了。他们连夜调整,很快将实际数量扩大到几十个。但紧接着另一个瓶颈又出现了。他们使用的数据库也是单一数据库,同样存在可扩展性问题。这个问题可以通过改用集群版数据库来解决。最后虽然解决了所有的问题,但是浪费了时间和损失,他们的在线人数也大幅下降。我们通过这个案例想表达的是,我们希望小游戏的结构足够轻,足够小,但是关键问题也需要提前考虑,避免在问题爆发时造成不必要的损失。那么我们怎么去设计架构呢,小游戏给我们提出了这个需求,那我就从两个层面来分析,第一是计算层面,第二是存储层面。我们先来看这样一个架构。我们不妨称之为无状态的分层架构。简单的说,就是按照节点之间的关系和架构之间的关系进行连接,然后后面的节点可以灵活伸缩。这种架构使用简单,对于一般的休闲游戏来说已经足够了。我们来看看它在腾讯云上的附加时间。国际客户端通过CLB扩充余额接入后台服务。我们通过BGT高防来保护游戏。当有流量时,高防服务可以对流量进行清洗,然后回收到系统中。我们使用不同的弹性主机来承载不同的服务,通过内网将它们连接起来,方便动态扩展。这里先介绍一下腾讯云的一些产品。第一个是CLB。腾讯CLB单集群提供最大连接数超过1.2亿,轻松应对上亿级访问量。单个集群可以处理40GB/S的峰值流量。它每秒可以处理多达600万个数据包。第二个是我们的弹性伸缩服务AS,它允许我们在不同时间伸缩集群中的节点数量。我们的启动策略有几种,一种是定时策略,一种是监控告警策略,一种是手动伸缩策略。在腾讯云上,1000台云主机的平均耗时是63秒。通过接入弹性伸缩服务和流的基础能力,我们可以轻松地快速动态地扩展和收缩服务。三是我们的BGT高防服。必要的时候我们可以使用BGT高防来保护游戏。其特点首先是平台拥有T级保护带宽,其次是算法精准。在提供保护的同时,我们可以最大程度地保证网络覆盖质量。该架构的优点和局限性是什么?优点是可靠性高,单节点拍手不影响整体可用性,扩缩容方便。局限性,无状态需要额外的数据写入存储层。对于这个问题,我们往往会在节点内存中缓存比较高的对象,这就对LB提出了一些要求。因为扩展需要知道将哪个节点发送给某个对象,它是建立对象和节点之间的流动性关系。显然,一般的LB是没有办法做到这一点的。还有一个问题就是在这个架构中,节点之间不能同时发送请求,但是对于游戏来说,我们往往希望节点之间同时发送请求。比如我们向朋友发送组队邀请时,朋友的对象和我的对象不在同一个节点上,那么就需要将请求发送到朋友的节点,再转发到朋友的客户端。但是对于无状态的分层架构,往往需要共享数据,存在实时性和性能损失的问题。为了解决这两个问题,我们来看一下星型模式。通过路由器对不同节点进行解析,实现节点间的集成。例如,A节点的Player1对象要向B节点的Play2对象发送请求或邀请,可以将消息发送给路由器,路由器将其转发给大节点处理后再发送给B节点。朋友客户端。在这种结构中,所有节点都是对等的,中间的路由器可以相互通信,更加灵活。但它有一个明显的问题。路由器为单点,容量小,可扩展性差。建立(英文)可以实现主备自动切换,当主节点出现故障时可以切换到节点。它们之间的连接,我们可以将多个结构连接在一起,实现架构的扩展。比如Player1用(英文)发送给节点A,Player发送给节点B。当Player1给Player2发送组队邀请时,消息可以先发送给router1,然后router1转发给router2,最后到达nodeB.路由器可以向对象发送消息,所以它必须维护这样一个全局安装。我们来看看路由器是干什么的?汇聚环节,简化内部沟通管理,建立共同目标地游戏机制,简化游戏开发。第三,我们还可以通过路由器实现负载均衡和广播。路由器用途广泛,可以作为通用的游戏接口。在可扩展性方面,我们可以在两个层面上进行扩展。比如我们可以在发现节点不够多的时候添加节点,分散相应的路由器,然后再添加到系统中。当一个达到极限后,我们可以通过辅机进一步扩展和添加新的。假设我们有0和1,需要加2的时候流程可以这样,我们先部署2。当2起来时,router1和router2可以发现新节点并与其建立连接。连接后,router2将自己的信息发送给router1或router0,并将自己的信息同步给router1和router0,从而建立。当play2登录router2时,router2会将信息同步给router2和router0,这是架构的扩展过程。这张图是腾讯云扩展信息结构的实践。对于高级游戏,例如坦克大战游戏,我们实施多点布局。比如华南的玩家可以加入华东,广州的UPC和上海的UPC可以内部实现。网络连接。接下来我们看看存储层的设计。我们的目标是构建一个大的存储层来满足动态扩展的问题。我们需要满足数据库水平扩展的问题。如果我们自己做,有3种方法。第一种基于增量区间的分配,基于可以实现动态扩展,但是存在性能热点。因为它永远是访问最多的,旧分片的性能会随着损失而受到限制;第二种方法,根据id的flashbattery,分配到不同的shard,不存在性能热点问题,但是增加新节点的问题有时候,数据经常是单切的,实现起来比较困难快速自动扩展。第三种方法是两者结合,可以同时解决两个问题,需要增加中间数据路由。为了简化大存储的设计,我们可以使用一些分布式数据库产品,比如腾讯云的DCDB。它的原理是在多个物理感官上加一个中间代理层,复杂度完全封装在代理层。这两张图是我们在DCDB上的性能测试。第一张图显示了单个分片与MYSQL相比的性能,它随着CPU内核和现有数量的增加而线性增加。DCDB支持新发现的扩展以及现有的扩展。扩容池系统会自动对相应的流量进行迁移和切换,业务层可以感知。我所要做的就是单击页面上的几个按钮。第二个产品是TCaplus,具有三个特性,支持Protobuf接口接入。界面友好,适合游戏开发。第二个产品结合了Cache和硬盘。TCaplus是目前腾讯内部使用最广泛的。数百款游戏使用TCaplus作为主数据库,包括王者荣耀、绝地求生等游戏。如果你想获取原版PPT,了解更多小程序开发知识,欢迎扫描下方二维码关注“WeGeek”,公众号,一起共建微信生态。
