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

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
函数计算FC,每月15万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 架构模式
目录
相关文章
|
3月前
|
运维 监控 测试技术
深入理解微服务架构及其在现代应用开发中的应用
【10月更文挑战第6天】深入理解微服务架构及其在现代应用开发中的应用
130 1
|
2月前
|
监控 Java 持续交付
深入理解微服务架构及其在现代应用开发中的应用
深入理解微服务架构及其在现代应用开发中的应用
58 1
|
2月前
|
Android开发 Swift iOS开发
深入探索iOS与Android操作系统的架构差异及其对应用开发的影响
在当今数字化时代,移动设备已经成为我们日常生活和工作不可或缺的一部分。其中,iOS和Android作为全球最流行的两大移动操作系统,各自拥有独特的系统架构和设计理念。本文将深入探讨iOS与Android的系统架构差异,并分析这些差异如何影响应用开发者的开发策略和用户体验设计。通过对两者的比较,我们可以更好地理解它们各自的优势和局限性,从而为开发者提供有价值的见解,帮助他们在这两个平台上开发出更高效、更符合用户需求的应用。
|
16天前
|
人工智能 运维 Devops
CAP:Serverless + AI 让应用开发更简单
对于众多开发者而言,Serverless 架构的核心优势在于其能够无缝集成多种云产品与组件,从而使得开发者可以更加专注于核心业务逻辑和创新。此外,Serverless 架构还提供了按量付费的灵活计费模式,进一步降低了资源成本。使用云应用开发平台 CAP,在 AI 领域,企业就可以专注于模型训练、算法优化等关键任务,让 AI 应用的开发、部署以及全生命周期的管理更加简单。可以预见 Serverless 技术将催生一系列创新且有趣的应用,而这些应用将不断拓展 AI 技术的边界。
|
2月前
|
监控 持续交付 API
深入理解微服务架构及其在现代应用开发中的应用
深入理解微服务架构及其在现代应用开发中的应用
31 4
|
3月前
|
安全 Android开发 iOS开发
深入解析:安卓与iOS的系统架构及其对应用开发的影响
本文旨在探讨安卓与iOS两大主流操作系统的架构差异,并分析这些差异如何影响应用开发的策略和实践。通过对比两者的设计哲学、安全机制、开发环境及性能优化等方面,本文揭示了各自的特点和优势,为开发者在选择平台和制定开发计划时提供参考依据。
76 4
|
4月前
|
人工智能 运维 Serverless
Serverless + AI 让应用开发更简单,加速应用智能化
2024 云栖大会开幕,在大会第一天,阿里云正式发布全新产品——云应用开发平台 CAP。CAP 拥有丰富的场景化应用模板,可以极速体验,并且具备更低的成本优势以及灵活组装等特点,成为广大开发者与企业必备的一站式应用开发平台,让应用开发更简单。
210 12
|
3月前
|
Kubernetes 监控 持续交付
深入理解微服务架构及其在现代应用开发中的应用
【10月更文挑战第15天】深入理解微服务架构及其在现代应用开发中的应用
42 0
|
4月前
|
消息中间件 弹性计算 关系型数据库
体验函数计算:高效处理多媒体文件的真实感受与实战总结
该方案在引导和文档方面做得较为详尽,仅在事件驱动机制部分略显简略。部署和代码示例实用,但需注意内存配置以避免超时。使用体验方面,函数计算表现出色,尤其在高并发场景下,显著提升了应用稳定性和成本效益。云产品如OSS、MNS等与函数计算配合流畅,ECS和RDS表现稳健。总体而言,这套方案弹性好、成本低,特别适合应对高并发或流量不确定的场景,值得推荐。
81 24
|
3月前
|
人工智能 运维 Serverless
Serverless + AI 让应用开发更简单
随着云计算和人工智能(AI)技术的飞速发展,企业对于高效、灵活且成本效益高的解决方案的需求日益增长。本文旨在探讨 Serverless 架构与 AI 技术的结合,如何通过 Serverless 函数计算和 AI 开发平台,助力企业简化应用开发流程,减少企业 AI 业务试错成本,加速业务创新,为企业业务发展提供无限可能。

相关产品

  • 函数计算
  • 下一篇
    开通oss服务