微信小游戏架构设计与开发:特点、挑战与应对策略

2024-11-17
来源:网络整理

自小游戏发布以来,微信平台上出现了许多现象级的小游戏,其中包括“跳一跳”。微信小游戏和小程序在技术上有什么区别?开发者在开发小游戏时通常会遇到哪些问题?如何避免和解决呢?来自腾讯游戏云的高级架构师余国梁将为我们带来微信小游戏架构设计和开发的方向。

微信小游戏有什么特点?

小游戏最大的特点就是去中心化的发行和好友关系链的传播。这将带来很多机遇和挑战。机遇是可能带来爆款产品,挑战是过去的经验可能不适用,包括技术上的。

那么微信小游戏的特点对我们的架构提出了哪些要求呢?这里我列出两个关键点。一是全区综合需求。为了充分利用微信的社交网络,游戏需要在所有地区和服务器上可用。第二个需求是线上扩容和缩容的需要,因为任何游戏都可能成为爆款,在微信上有指数级增长,所以几乎是必然。

我们来看一个案例。这个案例是我们腾讯云的一个真实客户的案例。其小游戏上线时间很短,用户数从数万飙升至200万左右。这位顾客经历了什么?首先,游戏上线后,我们很快发现流量增长很快,系统流量不够用。这个时候我们就可以通过云主机在线分配了。但第一个瓶颈出现了。当吞吐量达到线上水平后,就很难再扩展了。他们连夜进行调整,很快将实际数量扩大到了几十个。但随后又出现了另一个瓶颈。他们使用的数据库也是单一数据库,同样存在可扩展性问题。这个问题可以通过切换到集群版本的数据库来解决。最终,虽然所有问题都解决了,但是浪费了时间,造成了损失,在线人数也出现了较大幅度的下降。

我们想通过这个案例说明的是,我们希望小游戏的结构足够轻、足够小,但关键问题也需要提前考虑,避免出现问题时造成不必要的损失。

那么我们如何设计架构呢?小游戏对我们提出了这样的要求。接下来我会从两个层面来分析,首先是计算层面,然后是存储层面。

我们先来看这样一个架构。我们不妨称之为无状态分层架构。简单来说就是按照节点之间的关系和架构关系进行连接,然后后面的节点就可以灵活伸缩了。这种架构足够简单,可以处理一般的休闲游戏。我们来看看它在腾讯云上的额外时间。国际客户通过CLB扩展余额接入后台服务。我们通过BGT高防御来保护游戏。当流量发生时,高防服务可以对流量进行清洗,然后回收到系统中。我们使用不同的弹性承载不同的业务,通过内网连接起来,方便动态扩展。

我们对这里用到的一些腾讯云产品做一些介绍。第一个是CLB。腾讯CLB单集群最大连接数超过1.2亿,轻松应对亿级访问量。单集群每次可处理峰值流量40GB/S。每秒处理量可达600万条。

第二个是我们的弹性伸缩服务AS。通过弹性伸缩服务,我们可以在不同时间对集群中的节点数量进行伸缩。我们的启动策略包括以下几种:一是定时策略、监控报警策略、手动扩缩容策略。在腾讯云上,千台云主机的平均时间为63秒。通过访问弹性扩展服务和基本的流媒体功能,我们可以快速动态地扩展和收缩服务。第三个是我们的BGT高防服务,在必要的时候,我们可以使用BGT高防来保护游戏。其特点是:首先平台拥有T级保护带宽,其次拥有精准的算法。在提供保护的同时,我们可以最大限度地提高网络覆盖范围。质量。

架构的优点和局限性是什么?

优点是可靠性高,单节点运行不影响整体可用性,且易于扩缩容。限制:无状态性需要额外将数据写入存储层。对于这个问题,我们往往会将比较高的对象缓存到节点内存中,这对LB提出了一些要求。因为扩展需要知道某个对象被发送到哪个节点,所以需要建立从该对象到该节点的流动性关系。显然,一般的LB做不到这一点。

还有一个问题是,在这个架构中,节点之间不能同时发送请求,但是对于游戏来说,我们往往希望节点之间能够同时发送请求。例如,当我们向好友发送组队邀请时,好友的对象和我的对象不在同一个节点,那么需要将请求发送到好友的节点,然后转发到好友的客户端。

然而,对于无状态分层架构,往往需要共享数据,存在实时性和性能损失的问题。为了解决这两个问题,我们来看看星型架构。通过分析不同节点来实现不同节点之间集成的仪器。例如,如果节点A中的对象想要向节点B中的对象发送请求或邀请,则可以将消息发送到大节点,然后转发到大节点进行处理,然后发送到好友客户端。在这种结构中,所有节点都是点对点的关系,中间的节点可以相互通信。它更加灵活。但它有一个明显的问题,它是单点并且具有收缩和扩展的能力。建立(英文)可以实现主备节点自动切换。当主节点出现故障时,可以切换到该节点。它们之间的连接使得我们可以将多个结构连接在一起,实现架构扩展。例如,发送给(英国)的节点A,再发送给节点B。向节点2发送组队邀请时,消息可以先发送给节点B,然后转发给节点B,最后到达节点B。能够向一个对象发送消息,它必须维护这样的全局配置。

我们来看看都做了什么?融合环节,简化内部沟通管理,建立通用物地游戏机制,简化游戏开发。第三,我们还可以实现负载均衡和广播,用途广泛,可以作为通用的游戏界面。

在可扩展性方面,我们可以进行两个层面的扩展。例如,当我们发现节点不够时,我们可以添加它们,相应地分散它们,然后将它们添加到系统中。当一台机器达到极限时,我们可以通过辅助机器进一步扩展它并添加新的机器。假设我们有0和1,当我们需要加2时,过程可以是这样的。我们首先部署2。当2出现时,可以发现新节点并与其建立连接。连接后将其信息同步到 或 即可建立。登录时,信息会同步到and,这是架构的扩展过程。

这张图是扩展信息结构在腾讯云的实践。对于比较高端的游戏,比如坦克大战游戏,我们采用多点布局。例如,华南地区的玩家可以加入华东地区,广州的UPC和上海的UPC可以实施内部布局。网络连接。

我们看一下存储层的设计。我们的目标是构建一个大的存储层来满足动态扩展的问题。我们需要满足数据库水平扩展的问题。如果我们自己做的话,有三种方法。第一种基于增量区间的分配可以实现动态扩展,但存在性能热点问题。因为它的访问量总是最大的,旧的分片丢失后会出现性能限制;第二种方法是根据ID将闪存电池分散到不同的分片中。不存在性能热点问题,但是增加新节点的问题,有时候数据往往是单切的,很难实现快速自动扩容。第三种方法是将两者结合起来,可以同时解决两个问题。它需要添加中间数据路由。

为了简化大存储的设计,我们可以使用一些分布式数据库产品,比如腾讯云的DCDB。它的原理是在多个物理意义上添加一个中间代理层,复杂性完全封装在代理层中。这两张图是我们对DCDB的性能测试。第一张图是单性能对比,随着CPU核数和现有数量的增加而线性增加。 DCDB 支持新发现的扩展以及现有的扩展。扩展池系统会自动对相应的流量进行重新定位和切换,让业务层能够感知到。我所要做的就是单击页面上的几个按钮。

第二款产品的特点是支持三个接口接入,界面友好,适合游戏开发。第二个将与硬盘结合在一起。第三村学校空间无法上网,单桌最多可支持sotb。目前在腾讯内部使用最广泛,被用作数百款游戏的主数据库,包括王者荣耀、绝地求生等游戏。

分享