人人都是Serverless架构师之弹幕应用开发实战

本文涉及的产品
函数计算FC,每月15万CU 3个月
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: 如何使用serverless架构实现全双工通信的应用,serverless架构中数据库是如何使用的,本篇文章将为您揭开答案。

serverless的理念是即时弹性,用完及走。服务并非长时间运行,这也就意味着像websocket这种长链接的请求模式看起来并不适合serverless,但是否有其他的办法即能满足长连接模式请求,也能够利用serverless本身特性呢?答案是肯定的,从前面的一篇文章我们看到了网关的关键作用,所以这次也是通过网关来解决全双工通信的问题。本次以弹幕场景为例来为大家展开我们是怎么使用serverless架构来实现这个场景的。

应用效果预览

image.png

弹幕应用的实用场景比较多,比如运营推广,年会活动等。本次弹幕应用演示的源码均已放至github,大家可以自行修改使用

架构一览

image.png

整体架构依然采用dns解析->网关-> oss|fc 。不一样的是分了3个静态资源的工程,函数部分则采用事件驱动和http相结合,并且 api 部分采用tablestore进行数据的持久化。

流程说明

image.png

弹幕应用总共由大屏幕个人用户管理员三个客户端,以及一个注册设备的服务和一个api服务。客户端跟服务端的长链接由网关来承载,每次客户端连接到网关的时候,网关都会存储设备编号,并且触发一次注册函数,设备编号存储到tablestore。当用户发起弹幕的时候经网关到api服务,api服务会做一次查询先判断弹幕是否被管制,如果无管制则直接查找当前的大屏幕设备id,并且进行网关的下行调用,网关在发到前端页面,显示数据。如果被管制,则查询在线的管理员设备,将弹幕下行通知到网关,网关发送给管理员前端页面。

数据表设计

equipment(设备)

字段

类型

说明

id

string

设备表主键

deviceId

string

设备id

docId

string

备用字段

type

string

设备类型(screen|admin)

barrage(弹幕)

字段

类型

说明

gid

string

分区键

id

integer

主键自增

fromId

string

弹幕作者id

fromName

string

来源作者名称

color

string

弹幕颜色

fontSize

string

弹幕字体大小

checkStatus

integer

弹幕状态0(未处理)1(审批通过)2(审批未过)

sendTime

string

弹幕发送时间

checkTime

string

弹幕更新时间

message

string

弹幕内容

interceptor (过滤器)

字段

类型

说明

id

integer

主键/分区键

status

integer

拦截状态0不拦截 1拦截 2拦截加过滤

filterWords

string

过滤字段

准备工作

同前篇《人人都是Serverless架构师之现代化Web应用开发实战》文章一样需要准备域名,以及安装安装好Serverless devs开发者工具,还有下面的产品

这次我们引入了tablestore的数据库记性数据的持久化,同样需要创建好数据库实例备用。

操作步骤

为了更好的展示效果,本次演示使用ServerlessDesktop来给大家演示一下如何2分钟部署一个这样复杂的弹幕应用。你可以根据自身需要选择Serverless Devs Cli  或者 Serverless Desktop对弹幕应用进行初始化和部署构建。

秘钥配置

初始化

www5.gif

本次初始化除了将应用模板下载到本地之外,还会帮忙初始化tablestore的表及数据,所以需要预配置几个参数

  • 秘钥别名 - 对应你的阿里云账号
  • 域名 - 自定义域名
  • bucketName - oss的bucket名称
  • endpoint - 对应tablestore 实例的公网访问地址
  • instance - 对应tablestore 的实例名

预配置参数写好后点击“确定”,接下来的工作就叫给Serverless Devs,他会帮我们初始化弹幕应用的表。

构建部署

初始化之后,我们重新进入配置页面,对项目进行部署。配置信息->全量操作->deploy 点击后其他的就交给Serverless Devs了,他会帮助我们完成 大屏幕,管理后台和玩家的前端部署,注册函数以及api函数的部署以及网关的路由设置和网关的域名绑定


www6.gif


部署效果查看

网关

image.png

image.png

函数计算

image.png

Oss

image.png

DNS

image.png

此时访问barragego.serverless-developer.com发现访问不同,检查发现是 apigateway 的域名和oss 域名都未绑定成功,我们手动处理一下

image.png

image.png

image.png

接下来再访问barragego.serverless-developer.com 即可看到效果

www7.gif


数据库明细

数据库方面想拿出来说一下,主要本次用的数据库确实比较新,也就是tablestore

数据库配置传递

可以看到,我们在初始化应用的时候是填写了数据库的公网访问地址和实例名称信息的,初始化的时候会把用户的输入配置写入到s.yaml中,这里如果是比较敏感的信息建议从s.yaml提取出来放到.env环境中,并且ignore掉这个文件,减少数据库信息被泄露到代码仓库的风险。

最终devs 会把这两个基本信息放到函数计算的环境变量中然后各运行时可以通过环境变量取到这些值,比如这里是nodejs 的运行环境,则通过process.env.instance获取。

除了实例名称和公网访问地址外数据库的初始化还需要 用户的秘钥信息。鉴于秘钥信息的敏感性比较高,不建议直接把秘钥信息配置到s.yaml里,而是通过给函数服务授权tablestore角色权限,让函数内置临时秘钥信息

函数服务授权配置如下:

image.png

函数内获取秘钥信息如下:

image.png

数据库初始化

为了减少数据库初始化次数,我们可以在函数的 initializer方法中初始化,当函数未被释放的时候可以直接使用数据库的实例而不必重新连接。这样可以降低请求响应时间。单实例多并发的情况下比较实用。

exports.initializer= (context, callback) => {
try {
constak=context.credentials.accessKeyId;
constsk=context.credentials.accessKeySecret;
conststsToken=context.credentials.securityToken;
SAT.init(endpoint, instance, ak, sk, stsToken);
internal= { tableClient: SAT, TableStore };
callback();
  } catch (err) {
callback(err.message);
  }
}

数据库实例初始化之后,我们通过赋值给全局变量来从其他的方法中取得实例,进行后续的操作

CRUD

tablestore 原生的api 去做CRUD操作用户体验不够友好,这里借助tablestore社区提供了一个很好的封装SAT我们用它来做基础的增删改查会非常的方便,代码看起来也非常整洁。

// 单主键查询constgetInterceptor=async (ctx) => {
const { tableClient } =ctx.req.requestContext.internal;
constres=awaittableClient.table('interceptor').get(1, cols= []);
returnres;
}
// 查询全部constgetAllEquipment=async (tableClient,TableStore) => {
constres=awaittableClient.table('equipment').getRange(TableStore.INF_MIN, TableStore.INF_MAX, cols= [])
returnObject.keys(res).map((key)=>res[key]);
}
// 双主键(一个分区键,一个自增键)的插入constaddBarrage=async (ctx) => {
const { tableClient, TableStore } =ctx.req.requestContext.internal;
const { fromId, fromName, color, fontSize='28px', checkStatus=0, message } =ctx.request.body;
constcurrentTime=Date.now().toString();
constnewData=Object.assign({}, { fromId, fromName, color, fontSize, checkStatus: parseInt(checkStatus), message }, { sendTime: currentTime, checkTime: currentTime });
constres=awaittableClient.table('barrage', ['gid', 'id']).put([1, TableStore.PK_AUTO_INCR], newData, c='I');
returnres;
}
// 更新constupdateBarrage=async (ctx) => {
const { tableClient } =ctx.req.requestContext.internal;
const { checkStatus } =ctx.request.body;
const { id } =ctx.request.params;
constcurrentTime=Date.now().toString();
constres=awaittableClient.table('barrage', ['gid', 'id']).update([1, parseInt(id)], { checkStatus: parseInt(checkStatus), checkTime: currentTime }, c='I')
returnres;
}
// 条件查询constgetBarrageByCondition=async (ctx) => {
const { tableClient, TableStore } =ctx.req.requestContext.internal;
constres=awaittableClient.table('barrage').search('index', ['checkStatus', 0])
returnres;
}

当然如果你想做更高级的查询,就需要自己去查阅官网文档

更多

这个项目本身是对serverless 如何使用websocket的一个展示示例,你可以把他变成任意相近形态的应用,比如聊天室,多人协作平台等。应用本身可以拿过去做二次改进,比如增加点赞,管控部分可以加上管理员的登录注册等。总之你可以根据自身需求定制更高级的功能,相关的源码已经提供出来供大家参考,下个篇章会跟大家聊一聊serverless和低代码的场景,分享一个我们最近做的实践。


相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
1月前
|
运维 监控 负载均衡
深入理解无服务器架构:优势与挑战
【10月更文挑战第6天】深入理解无服务器架构:优势与挑战
|
24天前
|
监控 Serverless 数据库
探索 Serverless 架构:云计算的新浪潮
【10月更文挑战第18天】Serverless架构,即无服务器架构,是一种新兴的云计算模式,让开发者无需管理服务器即可构建和运行应用。本文探讨了其核心概念、优势、挑战及最佳实践,强调了按需付费、自动扩展和开发效率等优点,同时也指出了冷启动、状态管理和调试监控等挑战。
|
15天前
|
运维 NoSQL Java
后端架构演进:微服务架构的优缺点与实战案例分析
【10月更文挑战第28天】本文探讨了微服务架构与单体架构的优缺点,并通过实战案例分析了微服务架构在实际应用中的表现。微服务架构具有高内聚、低耦合、独立部署等优势,但也面临分布式系统的复杂性和较高的运维成本。通过某电商平台的实际案例,展示了微服务架构在提升系统性能和团队协作效率方面的显著效果,同时也指出了其带来的挑战。
55 4
|
16天前
|
机器学习/深度学习 监控 Serverless
探索Serverless架构:云计算的新前沿
【10月更文挑战第26天】本文探讨了Serverless架构作为新兴的云计算范式,如何改变应用的构建和部署方式。文章介绍了Serverless的核心概念、优势和挑战,并提供了开发技巧和实用工具,帮助开发者更好地理解和利用这一技术。
|
16天前
|
运维 Serverless 数据处理
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
51 1
|
19天前
|
监控 Serverless 数据库
探索 Serverless 架构:云计算的新浪潮
【10月更文挑战第23天】Serverless 架构是一种新兴的云计算范式,允许开发者构建和运行应用程序而无需管理服务器。本文深入探讨了 Serverless 的核心概念、优势、挑战及最佳实践,帮助开发者更好地理解和应用这一技术。
|
20天前
|
监控 安全 Serverless
"揭秘D2终端大会热点技术:Serverless架构最佳实践全解析,让你的开发效率翻倍,迈向技术新高峰!"
【10月更文挑战第23天】D2终端大会汇聚了众多前沿技术,其中Serverless架构备受瞩目。它让开发者无需关注服务器管理,专注于业务逻辑,提高开发效率。本文介绍了选择合适平台、设计合理函数架构、优化性能及安全监控的最佳实践,助力开发者充分挖掘Serverless潜力,推动技术发展。
49 1
|
20天前
|
运维 监控 Serverless
Serverless架构在图像处理等计算密集型应用中展现了显著的优势
Serverless架构在图像处理等计算密集型应用中展现了显著的优势
30 1
|
24天前
|
机器学习/深度学习 监控 Serverless
无服务器架构(Serverless)
无服务器架构(Serverless)
|
1月前
|
存储 消息中间件 人工智能
ApsaraMQ Serverless 能力再升级,事件驱动架构赋能 AI 应用
本文整理自2024年云栖大会阿里云智能集团高级技术专家金吉祥的演讲《ApsaraMQ Serverless 能力再升级,事件驱动架构赋能 AI 应用》。

热门文章

最新文章

相关产品

  • 函数计算