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

简介: 如何使用 Serverless 架构实现全双工通信的应用,Serverless 架构中数据库是如何使用的,本篇文章将为您揭开答

作者 | 寒斜(阿里云云原生中间件前端负责人)

微信搜索关注 Serverless 公众号,后台回复 学习 获取技术资源包!


Serverless 的理念是即时弹性,用完即走。服务并非长时间运行,这也就意味着像 websocket 这种长链接的请求模式看起来并不适合 Serverless。

是否有其它的办法即可以满足长连接模式请求,又能够利用 Serverless 本身特性呢?


答案是肯定的,上一篇文章我们谈及了网关的关键作用,所以这次也是通过网关来解决全双工通信的问题。本次将以弹幕场景为例,为大家展开我们是怎么使用 Serverless 架构来实现这个场景的。


应用效果预览

弹幕应用的实用场景比较多,比如运营推广,年会活动等。但是通常实现一套带管控的流程,且部署发布的话,一般会花费比较长的时间。本篇实战则可以让你在 2 分钟之内就部署好自己的弹幕应用。同时做到支持炫彩和弹幕内容管控,你可以用它来丰富公司年会的形式。文末也会贴上源码,可以供大家参考和二次定制。

架构一览

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


流程说明

弹幕应用总工由大屏幕, 个人用户,管理员三个客户端,以及一个注册设备的服务 & api 服务组成。客户端跟服务端的长链接由网关来承载,每次客户端连接到网关的时候,网关都会存储设备编号,并且触发一次注册函数,设备编号存储到 tablestore。

当用户发起弹幕的时候经网关到 api 服务,api 服务会做一次查询先判断弹幕是否被管制,如果无管制则直接查找当前的大屏幕设备 id,并且进行网关的下行调用,网关在发到前端页面,显示数据。如果被管制,则查询在线的管理员设备,将弹幕下行通知到网关,网关发送给管理员前端页面。


数据表设计

  • equipment(设备)


字段

类型

说明

id

string

设备表主键

deviceld

string

设备id

docld

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

过滤字段


1、准备工作


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

  • 云解析 DNS
  • API 网关
  • 函数计算
  • 对象存储 OSS
  • Tablestore

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


2、操作步骤


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

1)秘钥配置

可参考密钥获取文档:

http://www.serverless-devs.com/zh-cn/docs/provider-config/alibabacloud.html


2)初始化


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

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


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


3)构建部署


初始化之后,我们重新进入配置页面,对项目进行部署。配置信息 -> 全量操作 -> deploy 点击后其他的就交给 Serverless Devs了,它会帮助我们完成:


  1. 大屏幕,管理后台和玩家的前端部署;
  2. 注册函数以及 api 函数的部署
  3. 以及网关的路由设置和网关的域名绑定


4) 部署效果查看


  • 网关



  • 函数计算



  • Oss



  • DNS



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




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

2、数据库明细

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

1)数据库配置传递

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

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

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


  • 函数服务授权配置如下:


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


2)数据库初始化

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


exports.initializer = (context, callback) => {

 try {

   const ak = context.credentials.accessKeyId;

   const sk = context.credentials.accessKeySecret;

   const stsToken = context.credentials.securityToken;

   SAT.init(endpoint, instance, ak, sk, stsToken);

   internal = { tableClient: SAT, TableStore };

   callback();

 } catch (err) {

   callback(err.message);

 }

}

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


3)CRUD

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

// 单主键查询

const getInterceptor = async (ctx) => {

 const { tableClient } = ctx.req.requestContext.internal;

 const res = await tableClient.table('interceptor').get(1, cols = []);

 return res;

}


// 查询全部

const getAllEquipment = async (tableClient,TableStore) => {

 const res = await tableClient.table('equipment').getRange(TableStore.INF_MIN, TableStore.INF_MAX, cols = [])

 return Object.keys(res).map((key)=> res[key]);

}

// 双主键(一个分区键,一个自增键)的插入

const addBarrage = async (ctx) => {

 const { tableClient, TableStore } = ctx.req.requestContext.internal;

 const { fromId, fromName, color, fontSize = '28px', checkStatus = 0, message } = ctx.request.body;

 const currentTime = Date.now().toString();

 const newData = Object.assign({}, { fromId, fromName, color, fontSize, checkStatus: parseInt(checkStatus), message }, { sendTime: currentTime, checkTime: currentTime });

 const res = await tableClient.table('barrage', ['gid', 'id']).put([1, TableStore.PK_AUTO_INCR], newData, c = 'I');

 return res;

}

// 更新

const updateBarrage = async (ctx) => {

 const { tableClient } = ctx.req.requestContext.internal;

 const { checkStatus } = ctx.request.body;

 const { id } = ctx.request.params;

 const currentTime = Date.now().toString();

 const res = await tableClient.table('barrage', ['gid', 'id']).update([1, parseInt(id)], { checkStatus: parseInt(checkStatus), checkTime: currentTime }, c = 'I')

 return res;

}

// 条件查询

const getBarrageByCondition = async (ctx) => {

 const { tableClient, TableStore } = ctx.req.requestContext.internal;

 const res = await tableClient.table('barrage').search('index', ['checkStatus', 0])

 return res;

}


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


总结


这个项目本身是对 Serverless 如何使用 websocket 的一个展示示例。你可以把它变成任意相近形态的应用,比如聊天室,多人协作平台等。

应用本身也还有很多改进空间,比如增加点赞效果,管控部分可以加上管理员的登录注册等。总之你可以根据自身需求定制更高级的功能,相关的源码已经提供出来供大家参考。下个篇章我会继续跟大家聊一聊 Serverless 和低代码的场景,并分享一个我们最近做的实践。




相关实践学习
【玩转ComfyUI】基于函数计算一键部署AI生图平台ComfyUI
本次实验将带大家通过使用阿里云产品函数计算FC,快速使用ComfyUI实现更高质量的图像生成。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
相关文章
|
人工智能 运维 Kubernetes
Serverless 应用引擎 SAE:为传统应用托底,为 AI 创新加速
在容器技术持续演进与 AI 全面爆发的当下,企业既要稳健托管传统业务,又要高效落地 AI 创新,如何在复杂的基础设施与频繁的版本变化中保持敏捷、稳定与低成本,成了所有技术团队的共同挑战。阿里云 Serverless 应用引擎(SAE)正是为应对这一时代挑战而生的破局者,SAE 以“免运维、强稳定、极致降本”为核心,通过一站式的应用级托管能力,同时支撑传统应用与 AI 应用,让企业把更多精力投入到业务创新。
1168 30
|
存储 人工智能 Serverless
函数计算进化之路:AI 应用运行时的状态剖析
AI应用正从“请求-响应”迈向“对话式智能体”,推动Serverless架构向“会话原生”演进。阿里云函数计算引领云上 AI 应用 Serverless 运行时技术创新,实现性能、隔离与成本平衡,开启Serverless AI新范式。
1168 12
|
SQL 分布式计算 Serverless
鹰角网络:EMR Serverless Spark 在《明日方舟》游戏业务的应用
鹰角网络为应对游戏业务高频活动带来的数据潮汐、资源弹性及稳定性需求,采用阿里云 EMR Serverless Spark 替代原有架构。迁移后实现研发效率提升,支持业务快速发展、计算效率提升,增强SLA保障,稳定性提升,降低运维成本,并支撑全球化数据架构部署。
1712 56
鹰角网络:EMR Serverless Spark 在《明日方舟》游戏业务的应用
|
人工智能 开发框架 安全
Serverless MCP 运行时业界首发,函数计算让 AI 应用最后一公里提速
作为云上托管 MCP 服务的最佳运行时,函数计算 FC 为阿里云百炼 MCP 提供弹性调用能力,用户只需提交 npx 命令即可“零改造”将开源 MCP Server 部署到云上,函数计算 FC 会准备好计算资源,并以弹性、可靠的方式运行 MCP 服务,按实际调用时长和次数计费,欢迎你在阿里云百炼和函数计算 FC 上体验 MCP 服务。
1314 31
|
存储 编解码 Serverless
Serverless架构下的OSS应用:函数计算FC自动处理图片/视频转码(演示水印添加+缩略图生成流水线)
本文介绍基于阿里云函数计算(FC)和对象存储(OSS)构建Serverless媒体处理流水线,解决传统方案资源利用率低、运维复杂、成本高等问题。通过事件驱动机制实现图片水印添加、多规格缩略图生成及视频转码优化,支持毫秒级弹性伸缩与精确计费,提升处理效率并降低成本,适用于高并发媒体处理场景。
|
人工智能 运维 安全
聚焦 AI 应用基础设施,云栖大会 Serverless AI 全回顾
2025 年 9 月 26 日,为期三天的云栖大会在杭州云栖小镇圆满闭幕。随着大模型技术的飞速发展,我们正从云原生时代迈向一个全新的 AI 原生应用时代。为了解决企业在 AI 应用落地中面临的高成本、高复杂度和高风险等核心挑战,阿里云基于函数计算 FC 发布一系列重磅服务。本文将对云栖大会期间 Serverless+AI 基础设施相关内容进行全面总结。
|
人工智能 Kubernetes 安全
重塑云上 AI 应用“运行时”,函数计算进化之路
回顾历史,电网的修建,深刻地改变了世界的经济地理和创新格局。今天,一个 AI 原生的云端运行时的进化,其意义也远不止于技术本身。这是一次设计哲学的升华:从“让应用适应平台”到“让平台主动理解和适应智能应用”的转变。当一个强大、易用、经济且安全的 AI 运行时成为像水电一样的基础设施时,它将极大地降低创新的门槛。一个独立的开发者、一个小型创业团队,将有能力去创造和部署世界级的 AI 应用。这才是技术平权的真谛,是激发全社会创新潜能的关键。
|
Cloud Native Serverless 流计算
云原生时代的应用架构演进:从微服务到 Serverless 的阿里云实践
云原生技术正重塑企业数字化转型路径。阿里云作为亚太领先云服务商,提供完整云原生产品矩阵:容器服务ACK优化启动速度与镜像分发效率;MSE微服务引擎保障高可用性;ASM服务网格降低资源消耗;函数计算FC突破冷启动瓶颈;SAE重新定义PaaS边界;PolarDB数据库实现存储计算分离;DataWorks简化数据湖构建;Flink实时计算助力风控系统。这些技术已在多行业落地,推动效率提升与商业模式创新,助力企业在数字化浪潮中占据先机。
986 12
|
人工智能 开发框架 运维
Serverless MCP 运行时业界首发,函数计算让 AI 应用最后一公里提速
Serverless MCP 运行时业界首发,函数计算支持阿里云百炼 MCP 服务!阿里云百炼发布业界首个全生命周期 MCP 服务,无需用户管理资源、开发部署、工程运维等工作,5 分钟即可快速搭建一个连接 MCP 服务的 Agent(智能体)。作为云上托管 MCP 服务的最佳运行时,函数计算 FC 为阿里云百炼 MCP 提供弹性调用能力。
 Serverless MCP 运行时业界首发,函数计算让 AI 应用最后一公里提速
|
人工智能 Serverless API
Serverless 加 AI 让应用开发更简单
本文介绍了 Serverless 技术在 AI 领域的应用及 FunctionAI 平台的功能与优势。首先探讨了 Serverless 解决的核心问题,包括降低成本和提升效率。接着分析了构建 AI 应用的阻碍因素,如技术积累不足、大模型迭代快及算力资源有限。FunctionAI 平台通过按需模型托管、一键部署、流程式开发工具和灵活组装能力,帮助企业降低试错成本并提高开发效率。平台架构分为四层,涵盖模型层、开发层、服务层和部署层。实际应用场景包括图像生成、外部开发者支持及大流量处理等。最后,通过客户案例展示了平台在弹性扩展与成本优化方面的价值。

相关产品

  • 函数计算