文章图片
作者| 阿里云Serverless技术专家 澈尔
当前阿里云函数计算支持两种类型的函数:事件函数和 HTTP 函数。其中 HTTP 函数结合 HTTP 触发器,能够支持用户直接通过 HTTP 请求利用 Restful API 的方式发起函数调用;通过这种方式,用户无需集成函数计算提供的 SDK 就能实现函数调用,更好地同已有系统的组件及 WEB 服务进行集成。
考虑到 HTTP 函数最初设计的目的,面向 Web 场景,HTTP 函数并未支持异步调用,随着用户使用 HTTP 函数的场景增加,HTTP 函数无法支持异步调用的限制,对于用户更广泛的使用 HTTP 函数带来了诸多的限制。
不支持异步调用,用户有多难?
目前,已经有很多客户咋使用函数计算 HTTP 触发器搭建 WEB 服务,其中很多人有通过 WEB 服务进行文件(视频、图片等)处理转码,投递任务,进行压测的需求。这些需求则往往具有长执行,流量不均匀等特性。具有这些特征的函数在同步执行的场景下有以下缺点:
长执行函数增加函数错误的风险,提升机器开销。
- 客户端需要保持长链接,网络波动、客户由于函数执行耗时较长失去耐心自主断开连接等,都增加了函数错误发生的几率。
- 场景:视频网站用户上传视频转码,耗时长刷新页面导致连接中断,转码失败。
- 保持长链接增加了客户端的机器开销,降低了客户端机器资源的利用率。
面对突增流量无法平滑处理和接收。 - 对于有并发限制的场景,客户的突增流量在同步调用的场景下会被限流,从而在客户不做错误处理的时候造成一定请求失败。
- 场景1:脉冲式压测场景。
- 场景2:限时线上促销活动。
HTTP 触发器不支持异步调用时,为了满足需求,客户往往需要通过函数转跳的方式间接实现 HTTP 触发异步调用。具体流程如下:
文章图片
客户可以创建两个函数,函数 A 为 HTTP 函数,通过 HTTP 同步调用,函数 B 为事件函数,可以由 HTTP 函数通过 SDK 进行异步调用。但是该方案的缺点也很明显:
- 成本高:每次异步调用都需要两次触发。
- 无法实现流控全托管:第一层函数为同步调用,面对突增流量被流控,需要客户自行做自适应,从而无法享受异步调用的流控全托管。
- 增加客户开发维护成本:需要开发和维护两个函数来使用异步功能。
新功能:HTTP 触发器支持异步调用函数计算当前上线支持了 HTTP 触发器进行异步调用的功能。使用本功能,客户需要准备好一个 HTTP 函数和一个 HTTP 触发器。
HTTP 触发器需要通过请求头 X-Fc-Invocation-Type 来选择触发方式,默认为同步触发,如果需要进行异步触发,则可以在请求头中添加 _{"X-Fc-Invocation-Type":"Async"} _从而实现异步触发。
HTTP 异步调用测试
- 通过控制台进行测试
文章图片
在测试函数侧可以通过勾选我想通过异步的方式进行调用实现异步调用测试。
文章图片
- 通过 cURL 进行测试
curl -v -H "X-Fc-Invocation-Type: Async" https://http-***.cn-shenzhen.fcapp.run/$path
- 测试结果查看
可以通过请求ID 在控制台进行执行结果日志的查询:
文章图片
对于开通异步任务的请求,可以通过异步任务列表进行状态监测和查询:
文章图片
对于异步执行结果的回调可以参考函数回调文档:https://help.aliyun.com/document_detail/422720.html
最佳实践 此处以 HTTP 触发视频转码为例,介绍如何通过结合 Serverless Devs 与控制台,实现 HTTP 触发异步任务。
前提条件:
- 安装Serverless Devs
- 配置Serverless Devs
- 创建 OSS 存储空间,以便后续测试用例中对 OSS 存储空间进行访问和内容变更。
- 【函数计算 HTTP 触发器支持异步,解放双手搭建 Web 服务】创建RAM角色,并授予 OSSFullAccess 权限策略,您也可以直接使用AliyunFCDefaultRolePolicy策略。关于权限策略的详细信息,请参见创建RAM角色。
操作步骤:1、初始化项目
s init http-video-transcode -d http-video-transcode
cd http-video-transcode && s deploy
3、通过 HTTP 触发器发起异步调用
curl -v -H "X-Fc-Invocation-Type: Async" -H "Content-Type: application/json" -d '{"bucket":"my-bucket", "object":"480P.mp4", "output_dir":"a", "dst_format":"mov"}' -X POST https://http-***.cn-shenzhen.fcapp.run/
4、登陆控制台查询任务状态,并对任务进行管控
文章图片
5、函数回调
您可以根据需求在 dest-fail 或 dest-succ 增加处理逻辑,作为转码函数执行结果的回调函数,感知和获取函数执行结果。
函数回调相关文档:
https://help.aliyun.com/document_detail/422720.html
文章图片
总结 HTTP 触发支持异步调用,为用户搭建 WEB 服务使用函数计算作为全托管平台打通了最后一公里,让 HTTP 触发器的使用者也可以一样感受到异步调用开箱即用的便捷体验。
更多内容关注 Serverless 微信公众号(ID:serverlessdevs),汇集 Serverless 技术最全内容,定期举办 Serverless 活动、直播,用户最佳实践。
推荐阅读
- 钉钉机器人自动关联 GitHub 发送 approval prs
- 异步任务处理系统,如何解决业务长耗时、高并发难题()
- 如何在GitHub正确地使用 Curl 下载文件()
- Java进阶之路|一条 Git 命令减少了一般存储空间,我的服务器在偷着笑
- 2022 开源之夏 | Serverless Devs 陪你“变得更强”
- Git|Git命令行提交
- 每个开发人员都需要使用的15大GitHub替代品(软件开发托管服务)
- 拥抱开放,Serverless 时代的下一征程
- 精品推荐|编程实用工具大全(二)(前后端皆可用,不来看看())