作者| 阿里云Serverless技术专家 澈尔

当前阿里云函数计算支持两种类型的函数:事件函数和 HTTP 函数。其中 HTTP 函数结合 HTTP 触发器,能够支持用户直接通过 HTTP 请求利用 Restful API 的方式发起函数调用;通过这种方式,用户无需集成函数计算提供的 SDK 就能实现函数调用,更好地同已有系统的组件及 WEB 服务进行集成。

考虑到 HTTP 函数最初设计的目的,面向 Web 场景,HTTP 函数并未支持异步调用,随着用户使用 HTTP 函数的场景增加,HTTP 函数无法支持异步调用的限制,对于用户更广泛的使用 HTTP 函数带来了诸多的限制。

不支持异步调用,用户有多难?

目前,已经有很多客户咋使用函数计算 HTTP 触发器搭建 WEB 服务,其中很多人有通过 WEB 服务进行文件(视频、图片等)处理转码,投递任务,进行压测的需求。这些需求则往往具有长执行,流量不均匀等特性。具有这些特征的函数在同步执行的场景下有以下缺点:

长执行函数增加函数错误的风险,提升机器开销。

  • 客户端需要保持长链接,网络波动、客户由于函数执行耗时较长失去耐心自主断开连接等,都增加了函数错误发生的几率。

    • 场景:视频网站用户上传视频转码,耗时长刷新页面导致连接中断,转码失败。
  • 保持长链接增加了客户端的机器开销,降低了客户端机器资源的利用率。

面对突增流量无法平滑处理和接收。

  • 对于有并发限制的场景,客户的突增流量在同步调用的场景下会被限流,从而在客户不做错误处理的时候造成一定请求失败。

    • 场景1:脉冲式压测场景。
    • 场景2:限时线上促销活动。

在这些场景下,客户可以通过异步调用将 HTTP 触发和函数执行进行解耦,提升执行效率和执行成功率,降低开销。异步调用 at least once 的保证, 目标投递的能力,以及具有可观测性和可管控能力的异步任务模式能更好地让客户享受到函数托管服务的便利,解放客户双手。

HTTP 触发器不支持异步调用时,为了满足需求,客户往往需要通过函数转跳的方式间接实现 HTTP 触发异步调用。具体流程如下:

客户可以创建两个函数,函数 A 为 HTTP 函数,通过 HTTP 同步调用,函数 B 为事件函数,可以由 HTTP 函数通过 SDK 进行异步调用。但是该方案的缺点也很明显:

  • 成本高:每次异步调用都需要两次触发。
  • 无法实现流控全托管:第一层函数为同步调用,面对突增流量被流控,需要客户自行做自适应,从而无法享受异步调用的流控全托管。
  • 增加客户开发维护成本:需要开发和维护两个函数来使用异步功能。

新功能:HTTP 触发器支持异步调用

函数计算当前上线支持了 HTTP 触发器进行异步调用的功能。使用本功能,客户需要准备好一个 HTTP 函数和一个 HTTP 触发器。

客户可以通过函数计算控制台、SDK和Serverless Devs 工具来进行 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
  • 测试结果查看

触发完成后会立即返回函数计算接收请求的结果。其中状态码202表示请求成功,其余表示请求出现错误。请求ID 也会在请求头中一并返回,您可以通过返回的请求 ID 追踪异步请求的执行状态。为了更好地观测请求请求执行状态,增加对函数执行的管控,您可以开通异步任务

可以通过请求ID 在控制台进行执行结果日志的查询:

对于开通异步任务的请求,可以通过异步任务列表进行状态监测和查询:



对于异步执行结果的回调可以参考函数回调文档:https://help.aliyun.com/document_detail/422720.html

最佳实践

此处以 HTTP 触发视频转码为例,介绍如何通过结合 Serverless Devs 与控制台,实现 HTTP 触发异步任务。

前提条件:

  • 安装Serverless Devs
  • 配置Serverless Devs
  • 创建 OSS 存储空间,以便后续测试用例中对 OSS 存储空间进行访问和内容变更。
  • 创建RAM角色,并授予 OSSFullAccess 权限策略,您也可以直接使用AliyunFCDefaultRolePolicy策略。关于权限策略的详细信息,请参见创建RAM角色

操作步骤:

1、初始化项目

s init http-video-transcode -d http-video-transcode

2、进入项目并部署

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 活动、直播,用户最佳实践。

函数计算 HTTP 触发器支持异步,解放双手搭建 Web 服务的更多相关文章

  1. 一元建站-基于函数计算 + wordpress 构建 serverless 网站

    前言 本文旨在通过 快速部署一个 wordpress 网站到阿里云函数计算平台 这个示例来展示 serverless web 新的开发模式, 包括 FUN 工具一键初始化 NAS, 同步网站到 NAS ...

  2. 阿里云函数计算发布新功能,支持容器镜像,加速应用 Serverless 进程

    我们先通过一段视频来看看函数计算和容器相结合后,在视频转码场景下的优秀表现.点击观看视频 >> FaaS 的门槛 Serverless 形态的云服务帮助开发者承担了大量复杂的扩缩容.运维. ...

  3. 让 Serverless 更普惠,阿里云函数计算 FC 宣布全面降价,最大幅度达 37.5%

    11月5日,2022 杭州 · 云栖大会上,阿里云宣布函数计算 FC 开启全面降价,vCPU 单价降幅** 11%,其他的各个独立计费项最高降幅达 37.5%**. 本次云栖大会上,阿里云智能总裁张建 ...

  4. 从零入门 Serverless | 一文搞懂函数计算及其工作原理

    作者 | 孔德慧(夏莞) 阿里云函数计算开发工程师 什么是函数计算 大家都了解,Serverless 并不是没有服务器,而是开发者不再需要关心服务器.下图是一个应用从开发到上线的对比图: 在传统 Se ...

  5. 从函数计算到 Serverless 架构

    前言 随着 Serverless 架构的不断发展,各云厂商和开源社区都已经在布局 Serverless 领域,一方面表现在云厂商推出传统服务/业务的 Serverless 化版本,或者 Serverl ...

  6. 开发函数计算的正确姿势 —— 使用 Fun Local 本地运行与调试

    前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算 ...

  7. 从函数计算架构看 Serverless 的演进与思考

    作者 | 杨皓然  阿里巴巴高级技术专家 导读:云计算之所以能够成为 DT 时代颠覆性力量,是因为其本质是打破传统架构模式.降低成本并简化体系结构,用全新的思维更好的满足了用户需求.而无服务器计算(S ...

  8. 从零入门 Serverless | 函数计算如何粘合云服务,提供端到端解决方案

    作者 | 西流 阿里云技术专家 导读:阿里云 Serverless 产品函数计算可以作为粘合剂,串联其他云服务提供端到端解决方案,从而简化编程模型,快速实现最上层的业务目标. 传统单体应用的拆解 首先 ...

  9. 从零入门 Serverless | 函数计算的开发与配置

    导读:在本篇文章中,"基本概念"部分主要对函数计算最核心的概念进行详细介绍,包括服务.函数.触发器.版本.别名以及相关的配置:"开发流程"部分介绍了基于函数计算 ...

  10. TNetHttpClient支持异步访问(Delphi 10.1 Berlin,红鱼儿的博客)

    Delphi 10.1进一步改进自Delphi 10带来的Http访问控件TNetHttpClient,支持异步访问,同时增加ConnectionTimeout及ResponseTimeout两个超时 ...

随机推荐

  1. HDU-2159 二维背包

    最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务.久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级.现在的问题是,xhd升掉最后一级还需n的经 ...

  2. flask蓝图(这玩意就是django的子应用)

    蓝图的概念类似django的子应用,作用就是分模块开发,有关联的都放在一起. 蓝图的创建步骤: 新建一个包(一个包就是一个模块.等同于一个子应用) 在包的__init__.py中创建蓝图对象 . 蓝图 ...

  3. Mongo 数据库备份和恢复命令

    转载请注明出处: 在MongoDB中,使用mongodump和mongorestore命令来备份和恢复数据库 mongodump 1.使用方法: 使用 mongodump 命令可以备份MongoDB数 ...

  4. SpringBoot对象拷贝

    目录 概述 定义实体类 Car size carInfo 造测试数据 Spring BeanUtils Apache BeanUtils Cglib BeanCopier MapStruct 性能测试 ...

  5. 可视化大屏与GIS之间如何实现互补?

    在当今数字化时代,可视化大屏和地理信息系统(GIS)是两个在不同领域发挥重要作用的技术.可视化大屏以其生动.直观的图表.图像和动画展示方式,为数据可视化和信息展示提供了强大的工具.而GIS则通过地理空 ...

  6. 为什么Java中“1000==1000”为false,而”100==100“为true?

    在日常编程中,我们经常遇到一些看似简单却隐藏着复杂逻辑的问题. 比如,你是否想过为什么在 Java 中表达式1000==1000会返回 false,而 100==100 却返回 true 呢? Int ...

  7. Mybatis源码1JDBC->mybatis主要流程->mybatis Excutor简介

    === 一丶mybatis概述 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL.存储过程以及高级映射.MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作.My ...

  8. flutter弹窗

    AlertDialog: 优点:Material风格的弹窗,具有灵活的布局和样式自定义能力.易于使用,并提供了标题.内容和操作按钮的选项. 缺点:对于复杂的自定义布局和样式可能不够灵活. Bottom ...

  9. redis的基本数据类型测试

    依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spri ...

  10. 如何花“一点点小钱”突破华为云CCE服务的“防线”

    摘要:有没有方法绕开CCE的限制,自由的调用K8s的API呢?有还便宜,2.4元/集群/天. 申明:所有的一切都是为了使得华为云可以更好,而不是为了diss它. 通过华为云购买多个K8s集群,又想使用 ...