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

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

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


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


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


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


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

image.gif

1.png

应用效果预览


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


image.gif2.png

架构一览


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


image.gif3.png

流程说明


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


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


数据表设计


  • equipment(设备)


4.pngimage.gif


  • barrage(弹幕)


5.pngimage.gif


  • interceptor (过滤器)


6.pngimage.gif


准备工作


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


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


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


操作步骤


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


1)秘钥配置


可参考密钥获取文档:

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


2)初始化


7.gif


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


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


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


3)构建部署


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


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


8.png

image.gif

4) 部署效果查看


  • 网关


9.png

image.gifimage.gif

  • 函数计算


10.png

image.gif

  • Oss


11.png

image.gif

  • DNS


12.png

image.gif

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

image.gif

image.gif13.png14.png15.png

image.gif

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


16.gif

image.gif

数据库明细


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


1)数据库配置传递


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


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


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


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


17.png


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


18.png


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 和低代码的场景,并分享一个我们最近做的实践。


相关链接


1)Serverless Devs:

https://github.com/Serverless-Devs


2)云解析DNS:

https://wanwang.aliyun.com/domain/dns


3)API网关:

https://www.aliyun.com/product/apigateway


4)函数计算:

https://www.aliyun.com/product/fc


5)对象存储 OSS:

https://www.aliyun.com/product/oss


6)ServerlessDesktop:

http://www.serverless-devs.com/zh-cn/desktop/index.html


7)Serverless Devs Cli:

http://www.serverless-devs.com/zh-cn/cli/index.html


8)Serverless Hub:

https://serverlesshub.resume.net.cn/#/hubs/specialview


9)Tablestore表格存储:

https://www.aliyun.com/product/ots


10)官网文档:

https://help.aliyun.com/document_detail/27304.html?spm=5176.54465.J_7985555940.4.15942e0c3qkHbU


11)源码:

https://github.com/devsapp/start-barrage


作者介绍:


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


2016 年加入阿里中间件从事云产品企业控制台研发工作,负责中间件 20 多款云产品前端研发工作,主要技术栈为大前端通用技术,目前专注在 Serverless 开发者工具链的建设,是云原生 Serverless Devs 研发负责人之一。

image.gif
此处,跳转至 Serverless Devs~

相关实践学习
【AI破次元壁合照】少年白马醉春风,函数计算一键部署AI绘画平台
本次实验基于阿里云函数计算产品能力开发AI绘画平台,可让您实现“破次元壁”与角色合照,为角色换背景效果,用AI绘图技术绘出属于自己的少年江湖。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
相关文章
|
弹性计算 Ubuntu 安全
阿里云服务器可选操作系统汇总(公共镜像类型)
本文介绍了阿里云服务器公共镜像类型可选系统汇总,可供新手用户了解当前选择公共镜像类镜像时有哪些可选的操作系统。
1683 0
阿里云服务器可选操作系统汇总(公共镜像类型)
|
Oracle 关系型数据库 数据库
Oracle Dataguard 下块自动修复技术
在Oracle11gr2版本之后,若搭建实时应用日志的物理备库,那么在主库数据文件少量坏块的情况下,可以利用ABCR技术快速修复坏块
3044 0
|
iOS开发
Xcode常用快捷键
xcode相关:关于xcode  可设偏好设置 command+,清空缓存 可设隐藏xcode command+h隐藏其它 command+option+h显示全部 可设退出xcode command+q       文件相关:新建项目 command+shift+n新建文件 co...
1148 0
|
6天前
|
人工智能 自然语言处理 Shell
🦞 如何在 Moltbot 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
🦞 如何在 Moltbot 配置阿里云百炼 API
|
4天前
|
人工智能 JavaScript 应用服务中间件
零门槛部署本地AI助手:Windows系统Moltbot(Clawdbot)保姆级教程
Moltbot(原Clawdbot)是一款功能全面的智能体AI助手,不仅能通过聊天互动响应需求,还具备“动手”和“跑腿”能力——“手”可读写本地文件、执行代码、操控命令行,“脚”能联网搜索、访问网页并分析内容,“大脑”则可接入Qwen、OpenAI等云端API,或利用本地GPU运行模型。本教程专为Windows系统用户打造,从环境搭建到问题排查,详细拆解全流程,即使无技术基础也能顺利部署本地AI助理。
5734 12
|
3天前
|
人工智能 机器人 Linux
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI智能体,支持飞书等多平台对接。本教程手把手教你Linux下部署,实现数据私有、系统控制、网页浏览与代码编写,全程保姆级操作,240字内搞定专属AI助手搭建!
2842 7
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
|
5天前
|
人工智能 JavaScript API
零门槛部署本地 AI 助手:Clawdbot/Meltbot 部署深度保姆级教程
Clawdbot(Moltbot)是一款智能体AI助手,具备“手”(读写文件、执行代码)、“脚”(联网搜索、分析网页)和“脑”(接入Qwen/OpenAI等API或本地GPU模型)。本指南详解Windows下从Node.js环境搭建、一键安装到Token配置的全流程,助你快速部署本地AI助理。(239字)
3562 19
|
10天前
|
人工智能 API 开发者
Claude Code 国内保姆级使用指南:实测 GLM-4.7 与 Claude Opus 4.5 全方案解
Claude Code是Anthropic推出的编程AI代理工具。2026年国内开发者可通过配置`ANTHROPIC_BASE_URL`实现本地化接入:①极速平替——用Qwen Code v0.5.0或GLM-4.7,毫秒响应,适合日常编码;②满血原版——经灵芽API中转调用Claude Opus 4.5,胜任复杂架构与深度推理。
7050 11
|
2天前
|
存储 人工智能 机器人
OpenClaw是什么?阿里云OpenClaw(原Clawdbot/Moltbot)一键部署官方教程参考
OpenClaw是什么?OpenClaw(原Clawdbot/Moltbot)是一款实用的个人AI助理,能够24小时响应指令并执行任务,如处理文件、查询信息、自动化协同等。阿里云推出的OpenClaw一键部署方案,简化了复杂配置流程,用户无需专业技术储备,即可快速在轻量应用服务器上启用该服务,打造专属AI助理。本文将详细拆解部署全流程、进阶功能配置及常见问题解决方案,确保不改变原意且无营销表述。
2799 2
|
2天前
|
存储 安全 数据库
2026年使用Docker部署OpenClaw(原Clawdbot/Moltbot)完整步骤教程
OpenClaw(原Clawdbot/Moltbot)是一款开源的本地运行个人AI助手,支持WhatsApp、Telegram、Slack等十余种通信渠道,兼容macOS、iOS、Android系统,还可渲染实时Canvas界面。本文提供基于Docker Compose的生产级部署指南,涵盖环境准备、源码获取、配置、构建、启动及运维等关键环节,补充生产环境必需的安全配置、数据持久化、备份与监控建议,与官方配置无冲突,适用于希望通过Docker快速部署的用户。需说明的是,OpenClaw暂无官方预构建Docker镜像,需通过源码+Dockerfile本地构建,这也是官方推荐的最稳定部署方式。
1943 0

热门文章

最新文章

相关产品

  • 函数计算