热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

开发者不骗开发者,你跟我说这只要100块?

导语2021腾讯游戏年度发布会在线上举行。今年,发布会以“超级数字场景”战略理念为核心,传递对游戏认知、产业边界的建设性思考,并通过60余款游戏产品与内容集中发布,展现腾讯游戏为玩

导语

2021腾讯游戏年度发布会在线上举行。今年,发布会以“超级数字场景”战略理念为核心,传递对游戏认知、产业边界的建设性思考,并通过60余款游戏产品与内容集中发布,展现腾讯游戏为玩家带来的丰富体验与多元价值。

本次发布会再次选择了云开发 CloudBase 作为技术选型之一,以极低的成本实现了实时弹幕系统,并保障稳定运行,为游戏爱好者带来了优质互动体验。下文将重点介绍项目组使用云开发实现弹幕功能的全过程。

“各部门注意,前方高能!”


一、业务背景

2021腾讯游戏年度发布会开发了专属小程序,包含直播、抽奖、观看回放等功能,其中所有的弹幕功能均基于云开发的实时数据推送实现。

图片

在进行弹幕功能的技术选型前,开发同学梳理了业务场景:



  • 弹幕实时互动

  • 允许少量的弹幕丢失

  • 仅发布会直播当晚使用

  • 敏感信息/关键字过滤

在综合考虑成本、稳定性、与小程序适配性等多个方面后,项目最终选择了云开发的实时数据推送功能,早在去年的发布会里,项目组就使用了云开发的实时数据推送来实现直播节目单进度提醒等功能,在此基础上,把弹幕也统一搬上云开发。


二、技术实践


开发思路

一开始想直接把全部用户的弹幕集合直接监听,但官方限制单次监听数据不能大于5000条,且监听数据条越多初始化性能越差,超出上限会抛错并停止监听。最后设计为:用户弹幕插入集合a,监听数据集合b,使用云函数的定时器定期合并弹幕,并更新到对应的正在监听的数据记录上(如图)。

图片

这样保证了用户监听的数据记录为恒定数量,这里采用10条记录(循环数组)汇总弹幕数据,每秒更新当前时间戳的所有弹幕到 index = timestamp%10 的数据记录上,同时弹幕刷新频率固定为1s,减轻前端由于数据频繁改动而不断 callback/ 渲染的性能消耗。


代码演示

用户发送弹幕部分代码:

exports.main = async (event, context) => {
// ...省略部分鉴权/黑名单/校验内容安全逻辑
let time = Math.ceil(new Date().getTime() / 1000);
// 插入弹幕
let res = await db.collection('danmu_all').add({
data: {
openid,
content,
time,
},
});
return {err: 0, msg: 'ok'};
};

弹幕合并处理:

exports.main = async (event, context) => {
// ....省略一部分非关键代码
// 只取其中100条弹幕,可动态调整
let time = Math.ceil(new Date().getTime() / 1000) - 1;
const result = await db
.collection('danmu_all')
.where({time}).limit(100).get();
let msg = [];
for (let i of result.data) {
msg.push({
openid: i.openid,
content: i.content,
});
}
// 更新循环数组的对应位置
db
.collection('watch_collection')
.where({index: time % 10})
.update({
data: {msg,time},
});
return msg;
}

前端处理消息通知,注意不要重复 watch。其中如果打开了云开发的匿名登录,那 H5 端的页面同样可以使用同步弹幕功能:

this.watcher = db.collection('watch_collection').watch({
onChange: function(snapshot) {
for (let i of snapshot.docChanges) {
// 忽略非更新的信息
if (!i.doc || i.queueType !== 'update') {
continue;
}
switch (i.doc.type) {
// ...省略其他类型的消息处理
case 'danmu':
// 弹幕渲染
livePage.showServerBarrage(i.doc.msg);
break;
}
}
},
});

至此,整个弹幕的核心功能已经完全实现。


二次优化

跑了一段时间后发现偶现丢弃几秒内的弹幕,后面查看执行日志,发现即使配置定时器为每秒执行一次,实际生产中也不是严格每秒执行一次,有时候会跳过1-3秒去执行,这里另外使用了 redis 去标记当前处理的进度,即使有跳过的秒数,也能往前回溯未处理的时间进行补录。其中云函数使用 redis 的教程可以查看官方云函数使用 redis 教程

图片

用户发送弹幕部分代码添加标记代码:

exports.main = async (event, context) => {
// ...省略部分鉴权跟校验内容安全代码
// ...省略插入代码
// 标记合并任务
await redisClient.zadd('danmu_task', time, time+'')
};

弹幕合并处理,注意:要 redis5.0 以上的才支持 zpopmin 命令,如需购买,需要选对版本。

exports.main = async (event, context) => {
//当前秒
let time = Math.ceil(new Date().getTime() / 1000) - 1;
while (true) {
// 弹出最小的任务
let minTask = await redisClient.zpopmin('danmu_task');
// 当前无任务
if (minTask.length <= 0) {
return;
}
// 当前秒的任务,往回塞,并结束
if (parseInt(minTask[0]) > time) {
redisClient.zadd('danmu_task', minTask[1], minTask[0]);
return;
}
// 执行合并任务
await danmuMerge(time);
}
};

安全逻辑上也做了一定的策略,如本地先渲染发送的弹幕,客户端收到弹幕推送时,判断 openid 为自己时候不渲染,这样即使用户的弹幕被过滤掉也能在本地展现,保留一定的用户体验。

另外,单个云函数的实例上限是1000,如果确定当晚流量比较大,可以考虑用多个云函数分摊流量。


管理后台的实现

同时,利用 watch 功能可以做到管理后台同步实时刷新客户端的弹幕,达到管理的目的,同一份代码前端和管理端都能复用:

图片

节选部分管理后台代码:

methods: {
stop() {
this.watcher.close();
},
},
beforeDestroy() {
this.watcher.close();
},
mounted() {
this.app = this.$store.state.app;
this.db = this.app.database();
let that = this;
this.watcher = this.db.collection('danmu_merge').watch({
onChange(snapshot) {
for (let d of snapshot.docChanges) {
for (let v of d.msg) {
that.danmu.unshift(v);
}
}
if (that.danmu.length > 500) {
that.danmu = that.danmu.slice(0, 499);
}
},
});

集合的读权限设置在实时数据推送里同样生效,如果权限是设置为仅可读用户自己的数据,则监听的时候无法监听到非用户自己创建的数。


Tips

当时没注意到 watch 对数据库权限限制的问题,数据库权限默认为仅创建者可读写,循环数组第一次初始化是开发过程中在客户端创建,默认添加了当前用户的openid,导致其他用户无法读取到 merge 的数据,解决方法:删除 openid 字段或设置权限为全部人可读。

集合的读权限设置在实时数据推送里同样生效,如果权限是设置为仅可读用户自己的数据,则监听的时候无法监听到非用户自己创建的数。


三、项目成果与价值

基于云开发的云函数、实时数据推送、云数据库等能力,项目全程平稳运行,即便在发布会当晚流量峰值的时候,弹幕的写入运行稳定。在监听方面(读),watch 的性能能够稳定支持百万级同时在线。

最终,2名研发仅用2天就完成了弹幕系统的开发和调试。而在费用方面,支撑整个项目弹幕系统运行的总费用仅为100元左右,主要集中在数据库读写和云函数调用(目前监听数据库实时数据功能处于免费阶段,不会计算到数据库读取费用上),抛去其他模块的费用,实际弹幕模块可能仅消耗了小几十块钱,费用大大低于预期,相对比传统即时通讯等方案节省超过数十倍。

总体上,项目采用云开发,具备以下优势:



  • 自带弹性扩缩容,可以抗住瞬时高并发流量,保障直播顺利进行;

  • 费用便宜,只收取云函数调用和数据库读写费用,实时数据推送免费使用,非常适合项目;

  • 安全稳定,项目的访问都基于云开发自带的微信私有链路实现,保证安全性;

  • 自由度高,能够契合其他开发框架和服务。


原文链接:https://www.cnblogs.com/CloudBase/p/15597548.html



推荐阅读
  • 20211101CleverTap参与度和分析工具功能平台学习/实践
    1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • GAMETECH腾讯云游戏行业技术沙龙成都站圆满落幕
    11月13日,由腾讯云主办、游戏茶馆协办的2020年首场GAME-TECH腾讯云游戏行业技术沙龙在成都圆满落幕。本次沙龙邀请了腾讯云游戏行业解决方案总监宋永周、腾讯云游戏行业高级解决方案架构师曾梓恩、腾讯云游戏行业高级产品架构师郑晓曦、腾讯云游戏行业高级解决方案架构师温球良和天美L1(王者荣耀)服务器技术副总监杨光,为参会同行们带来了干货满满的技术建议。本文介绍了腾讯云游戏云的优势和为不同游戏研运场景提供的服务。腾讯云在中国游戏云服务市场领跑,成为众多游戏开发者的合作伙伴。 ... [详细]
  • Google在I/O开发者大会详细介绍Android N系统的更新和安全性提升
    Google在2016年的I/O开发者大会上详细介绍了Android N系统的更新和安全性提升。Android N系统在安全方面支持无缝升级更新和修补漏洞,引入了基于文件的数据加密系统和移动版本的Chrome浏览器可以识别恶意网站等新的安全机制。在性能方面,Android N内置了先进的图形处理系统Vulkan,加入了JIT编译器以提高安装效率和减少应用程序的占用空间。此外,Android N还具有自动关闭长时间未使用的后台应用程序来释放系统资源的机制。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了腾讯最近开源的BERT推理模型TurboTransformers,该模型在推理速度上比PyTorch快1~4倍。TurboTransformers采用了分层设计的思想,通过简化问题和加速开发,实现了快速推理能力。同时,文章还探讨了PyTorch在中间层延迟和深度神经网络中存在的问题,并提出了合并计算的解决方案。 ... [详细]
  • IT方面的论坛太多了,有综合,有专业,有行业,在各个论坛里混了几年,体会颇深,以前是论坛哪里人多 ... [详细]
  • 小程序自动授权和手动接入的方式及操作步骤
    本文介绍了小程序支持的两种接入方式:自动授权和手动接入,并详细说明了它们的操作步骤。同时还介绍了如何在两种方式之间切换,以及手动接入后如何下载代码包和提交审核。 ... [详细]
  • 华为鸿蒙系统官网2.0报名方法及适用设备
    本文介绍了华为鸿蒙系统官网2.0报名的适用设备、报名方法以及三种方式,包括在应用商店下载开发者联盟app、在官网中进行报名、在微信公众号中申请体验HarmonyOS 2.0 手机开发者Beta版本。同时提醒错过测试机会的用户可以等待后续的正式版发布。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
author-avatar
喂_早安学院_703
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有