社区/文章分享/云开发如何为腾讯游戏年度发布会保驾护航

云开发如何为腾讯游戏年度发布会保驾护航

项目背景

受疫情影响,2020 腾讯游戏年度发布会以线上的形式进行。区别于往年的线下 toB 模式,线上面对的群体比较广泛,同时也希望借此机会能更贴近玩家,所以在线上发布的内容和线上呈现形式等方面,都要考虑如何做得更加玩家向。

发布会从预热到结束,历经 42 天,吸引了大量玩家的关注。因此,参与量如此大、互动如此多、内容如此丰富的线上服务类互动小程序如何抗住高并发得以稳定运行?

在经验方面,团队做过很多类似的线下服务类互动小程序,如 TIEM 年会小程序、英雄联盟观赛助手和 CF 赛事助手小程序等。

但这次却是第一次做参与量如此大、互动如此多、内容如此丰富的线上服务类互动小程序,其中有两个关键点:如何实现实时互动以及如何抗住高并发?

所以笔者在经过调研,并且找了几个有丰富线下服务经验的同学取经,跟开发、品牌、产品多次讨论后,最终确定选用云开发作为解决方案。

如何实现实时互动?

关于实现实时互动,我们团队已经很有经验了,做了不下 3 个线下实时互动的案例,关键点在于使用了云开发 watch [2]。但是这次发布会参与量大、官方阵地要稳定,所以肯定需要有更多解决方案来选择及互补。

这次小程序的最大亮点是 50+个发布会环节,每个环节有自己的定制互动。例如和平精英环节,会有和平精英专场掉落抽奖、和平精英闪现社区弹幕、议程也需要高亮和平精英模块等,如下图所示:

也有的环节是议程高亮同一个模块,抽奖和闪现社区弹幕却是不同游戏的。盘点了下,需要用 90+个开关来实时控制。

那么怎么实现 90+个开关实时控制页面上所有的互动?我们考虑过下面三个方案:

方案一:接口轮询——常规操作,后台需要考虑好高并发的问题。

方案二:json 文件轮询——在发布系统更新发布包含当前环节信息的 json,小程序轮询方式请求 json 文件。这个方案页面反应不够及时,压力从后台转移到了当天负责更新 json 文件的同学身上。

方案三:云开发数据库的实时数据推送——原生能力[3],开箱即用,无需管理长连,无需编写服务端代码,无需搭建和管理基础设施,自动收到更新推送。

自然是第三个方案最好,简单易上手、小程序原生能力!但我们还需要确定一件事情:它所能支持的最大连接数。

watch 给到每个用户最大限制是 5w 连接数。我们预估了发布会当天 DAU,5w 连接数是不够用的,最后在云开发同事们的帮助下完成了扩容服务,并且提前做了压测,在活动访问峰值期间都毫无压力。

所以我们就选择了第三个方案——云开发数据库的实时数据推送。非常简单,记住一个 API——watch 就够了。小程序可通过 watch 实时监听数据库变更,收到包含更新内容的推送后,做出实时响应。

毕竟有 90+个开关,为了方便品牌大大操作,我们也做了一个简单的小程序管理端。

管理端开启某个议程开关,小程序监听的集合数据就更新到对应议程的所有配置,包括章节 id、产品 id、议程 id、是否有抽奖、是否有闪现弹幕、是否需要预约等。

而发布会小程序,就是在监听议程和答题集合的数据是否有更新,来判断当前议程以及当前答题环节。

//监听当前议程开关
loadAdminConfig(cb) {
  let that = this
  const db = wx.cloud.database()
  that.globalData.adminWatch = db.collection('adminConfig').watch({
    onChange: function (result) {
      let adminData = result.docChanges[0].doc
      console.log(adminData)
    },
    onError: function (err) {
      console.error('the watch closed because of error', err)
    }
  })
}

还需要在适合的地方设置开始监听,在页面 onshow 的时候开始监听,onhide 的时候关闭监听,这样既不浪费监听数,也能尽量避免计划外的操作导致 watch 断连后无法重新连接。

onShow: function(){
  app.loadAdminConfig()
}

onHide: function () {
  app.globalData.adminWatch && app.globalData.adminWatch.close().then(() => {
    app.globalData.adminWatch = null
  })
}

watch 使用起来就是那么简单,效果却是超乎想象!简单的模块是否显示用 wx:if 即可,有些需要在某个议程才去请求接口做逻辑处理的,可以写在 watch 里。

抽奖

请答题
等待开奖
中奖名单

//监听当前议程开关
loadAdminConfig(cb) {
  let that = this
  const db = wx.cloud.database()
  that.globalData.adminWatch = db.collection('adminConfig').watch({
    onChange: function (result) {
      let adminData = result.docChanges[0].doc
      if(adminData.agenda_id > 108){
      }
    },
    onError: function (err) {
      console.error('the watch closed because of error', err)
    }
  })
}

发布会环节开始才放开弹幕互动入口。

议程有抽奖,才会出现抽奖入口,并且展示的是提供当前抽奖环节奖品的产品 logo。

主持人口播:“查看 Spark 幸运鹅中奖结果吧!”的时候,会充满仪式感的全屏弹窗展示中奖名单,这也是通过管理端的议程开关控制的。

实时监听除了议程,还有答题环节。整个发布会有 5 个答题抽奖环节,每个题目在停止答题后,会进行后台抽奖。品牌和产品验证名单没问题后,即可展示中奖名单。

发布会或者线下项目必须要考虑周全,都是一次性短时间高并发活动,没有机会给你查漏补缺。

所以我们还给 watch 想了一个备案:监听失败(onError)的时候就用上面提到的第二个方案开始每秒轮询同步更新的 json 文件,json 里的数据和结构跟 watch 的一样,所以整体交互流程方面是不需要做额外修改的。

结果也证明云开发数据库的 watch 是非常靠谱的,轮询都没用上~

总结

作为承载腾讯游戏年度发布会首次线上举办、首次 toC、首次进行实时互动的小程序,它也算是良好完成了自己的任务。特别要感谢云开发提供的好用、易用、靠谱的实时数据推送能力 watch,让我们的创意能更好的落地。

产品介绍

云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为开发者提供高可用、自动弹性扩缩的后端云服务,包含计算、存储、托管等 serverless 化能力,可用于云端一体化开发多种端应用(小程序,公众号,Web 应用,Flutter 客户端等),帮助开发者统一构建和管理后端服务和云资源,避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
开通云开发:https://console.cloud.tencent.com/tcb?tdl_anchor=techsite
产品文档:https://cloud.tencent.com/product/tcb?from=12763
技术文档:https://cloudbase.net?from=10004
技术交流加 Q 群:601134960
最新资讯关注微信公众号【腾讯云云开发】