FaaS触发器

触发器(Trigger)用于触发函数执行。不同云厂商会根据自己的业务,为FaaS平台提供多种触发器。其中比较常见的触发器包括API网关触发器、对象存储触发器、定时触发器等。阿里云函数计算提供的触发器如下。

  • 对于事件函数,其提供的触发器包括对象存储触发器、API网关触发器、日志服务触发器、MNS触发器、定时触发器、表格存储触发器、消息队列Kafka版Connector触发器、IoT触发器、云监控触发器、CDN触发器以及事件总线EventBridge触发器等。
  • 对于HTTP函数,其提供的触发器包括HTTP触发器。

当创建一个函数之后,我们更希望它在业务中发挥一定的作用。这时,如何让函数在业务中发挥作用,就要看配置的触发器了。

除此之外,触发器还可以按照函数的同步调用与异步调用来划分。通常情况下,函数调分为同步和异步调用。而函数是由事件驱动的,所以很多时候也将一些触发器区分为同步触发器和异步触发器。

所谓同步调用,即由同步触发器来触发函数,其所具有的特性是客户端期待服务端立即返回计算结果。请求到达函数计算时,会立即分配执行环境执行函数,如下所示。

 

同步触发器示例

API网关为例,API网关同步触发函数计算,客户端会一直等待服务端的执行结果。如果执行过程中遇到错误,函数计算会将错误直接返回,而不会进行重试。这种情况下,客户端需要添加重试机制来做错误处理。

所谓异步调用,即由异步触发器触发函数,其通常是指客户端不急于立即知道函数结果,函数计算将请求丢入队列中即可返回成功,而不会等到函数调用结束,如下所示。

 

 异步触发器示例

函数计算会逐渐消费队列中的请求,并分配执行环境和执行函数。如果执行过程中遇到错误,函数计算会进行重试。系统会以指数退避方式无限重试,直至成功。异步调用适用于数据处理,比如OSS触发器触发函数处理音视频、日志触发器触发函数清洗日志,都是对延时不敏感又需要尽可能保证任务执行成功的场景。如果用户需要了解失败的请求并对请求做自定义处理,可以使用目的端功能。

1 定时触发器

定时触发器是非常常见的一种触发器,也是绝大部分厂商所支持的触发器之一。它存在的意义就是在某个时间执行当前函数,例如每隔一段时间执行函数、每天定点执行函数或者每月/每周的某一天执行函数等。常见的应用场景如下。

  • 批量数据的定时处理,例如每1小时收集全量数据并生成报表。
  • 日常行为的调度,例如整点发送优惠券。
  • 与业务解耦的异步任务,例如每天0点清理数据。

2 对象存储触发器

函数计算可以主动激发对象存储上的资源,但是如果对象存储的资源发生了变化,又如何告知函数计算呢?这时,我们就可以通过对象存储触发器来实现。通常情况下,对象存储触发器的规则包含两个部分。

  • 行为:所谓的行为,是指上传、复制等操作,例如阿里云函数计算的对象存储触发器提供的行为包括:oss:ObjectCreated:PutObject(调用PutObject接口上传文件)、oss:ObjectCreated:PutSymlink(调用PutSymlink接口针对OSS上的TargetObject创建软链接)、oss:ObjectCreated:PostObject(调用PostObject接口使用HTML表单上传文件到指定的存储桶)、oss:ObjectCreated:CopyObject(调用CopyObject接口复制一个在OSS上已经存在的对象)等在内的13个基本行为。
  • 规则:所谓的规则,是指在行为基础上进一步进行限制,例如如果用户上传的是MP4格式的视频,则转换成AVI格式,如果上传的是其他格式的视频,则不做操作,此时就可以使用创建行为(oss:ObjectCreated:*)与后缀.mp4进行组合,实现只有上传MP4格式的视频到指定存储桶,才会触发对应的函数进行转码操作。

对象存储触发器的用处有很多,常见的场景有:

  • 图像的压缩、转换
  • 音视频的转码、压缩
  • 大数据的处理
  • 文件解压等

3 API网关触发器

API网关触发器实际上是和函数计算结合最紧密的触发器之一。通过该触发器,我们可以快速实现传统的API服务。客户端通过API网关,将事件传递到函数计算,经过处理之后再返回。整个过程中,用户只需要关注业务逻辑即可,无须关注包括Nginx等在内的各种软件。同时,API网关通常会提供相对完善、更简单的配置能力,例如白名单、黑名单、请求方法、请求参数、鉴权等。据有关组织统计,在Serverless架构中,FaaS+API网关的搭配占调研应用的70%以上。这足可以表明API网关在函数计算中的重要作用。

在阿里云函数计算中,我们可以认为有两种API网关触发器。虽然这种说法可能并不是十分准确,但是API网关触发器和HTTP触发器在一定程度上确实在解决同样的问题。

HTTP触发器

在阿里云函数计算中,HTTP触发器仅在HTTP函数中可以使用。相对于API网关触发器而言,其在一定程度上是有功能的减少,例如暂时没有提供黑名单、白名单等,但是有一个非常强大的优势:可以让使用者非常快速地将传统的Web项目迁移到函数计算上。

通常情况下,API网关和函数计算所规约的数据结构是JSON类型。这就意味着传统的Web框架可能没办法很好地识别这个对象,需要将JSON对象转换成Web框架可识别的Request对象。但是HTTP触发器传递给函数的本身就是一个Request对象,这样用户可以非常简单、方便、快速地将传统的Web框架迁移到函数计算上。以Python的Bottle框架为例,我们只需要把入口方法设置为index.app,并在函数计算中初始化app对象即可:

# index.py

import bottle

@bottle.route('/hello/<name>')

def index(name):    

  return "Hello world"

app = bottle.default_app()

if __name__ == '__main__':    

bottle.run(host='localhost', port=8080, debug=True)

API网关触发器

包括AWS、阿里云等在内的绝大多数云厂商的FaaS产品支持API网关触发器。API网关触发器与HTTP触发器类似,可用于搭建Web应用。相较于HTTP触发器,使用者可以使用API网关完成IP白名单或黑名单设置等高级操作。API网关调用函数计算服务时,会将API的相关数据转换为Map形式传给函数计算服务。函数计算服务处理后,按照Output Format格式返回statusCode、header、body等相关数据。API网关再将函数计算返回的内容映射到statusCode、header、body等位置并返给客户端,如下所示。

 

API网关与函数计算结合的流程

CDN触发器

CDN触发器也是比较常见的一种触发器。该触发器的作用是当CDN系统捕获到指定类型、满足过滤条件的事件后,通过CDN事件触发器触发函数执行。

CDN是建立并覆盖在承载网之上、由分布在不同区域的边缘节点服务器群组成的分布式网络。通常情况下,CDN可以替代传统的以Web服务器为中心的数据传输模式,将源站资源缓存到云厂商所提供的全国各地的边缘服务器,供应用就近快速获取,提升用户体验,降低源站压力。函数计算通过配置内容分发网络事件触发器、集成CDN服务实现对CDN的各类事件的处理。例如,使用者可以设置函数和对应的CDN触发器来处理www.anycodes.cn域名下的资源刷新事件。当该域名下有资源刷新事件时,CDN事件触发器会自动触发函数执行。

CDN事件触发器可以实现函数计算与CDN服务的集成,使用场景如下。

  • CDN在预热(CachedObjectsPushed)和刷新(CachedObjectsRefreshed)用户数据后,通过触发器触发执行函数。用户可以及时得知资源预热/刷新的状态并进行下一步处理,避免不断轮询列表查询最新状态。
  • 当在CDN上发现违禁内容(CachedObjectsBlocked)时,通过触发器触发执行函数直接去源站删除资源。
  • 日志文件生成后(LogFileCreated),通过触发器触发执行函数处理日志。用户不需要长时间等待日志,即可及时转存或处理日志。
  • 当某加速域名被停用(CdnDomainStopped)或者被启用(CdnDomainStarted),通过触发器触发执行函数及时做出相应的处理。

消息相关触发器

在实际生产过程中,消息相关的产品是避不开的。消息产生之后需要有服务来对它进行消费。FaaS平台中也会有消息相关的触发器,例如Kafka触发器等。这类触发器的触发条件通常有三部分。

  • 时间部分:所谓的时间部分是指,距离上次触发时间达到预定的阈值之后,即使队列中的消息数量没有达到触发条件,仍然会触发对应的函数。
  • 数量部分:当队列中消息达到一定数量时,会触发对应的函数。
  • 大小限制:所谓的大小限制是指,当队列中消息达到某个预定的大小之后,会触发对应的函数。

日志服务触发器

日志服务触发器也是非常常见的触发器。在日常生产中,应用会产生大量的日志。通过日志服务触发器触发函数可以消费增量的日志数据,并完成对数据的自定义加工。常见的日志服务触发器使用场景如下。

  • 数据清洗、加工场景:通过日志服务,快速完成日志采集、加工、查询、分析,如下所示。

 

日志触发器场景:数据清洗、加工场景

  • 数据投递场景:为数据的目的端落地提供支撑,构建云上大数据产品间的数据管道,如下所示。

 

日志触发器场景:数据投递场景

事件总线EventBridge

事件总线EventBridge是云厂商所提供的无服务器事件总线服务,通常情况下支持自身云产品、自定义应用、SaaS应用以标准化、中心化的方式接入。阿里云EventBridge能够以标准化的CloudEvents 1.0协议在应用之间路由事件,帮助用户轻松构建松耦合、分布式的事件驱动架构。

EventBridge通过事件连接应用程序。事件是系统状态发生变更的信号,例如客户支持TT的状态发生变更。要编写代码来响应事件,用户需要了解事件的Schema,包括各种事件数据的标题、格式和验证规则等信息。EventBridge Schema注册表可存储使用者组织的应用程序、云厂商服务或云厂商应用程序所生成的一系列Schema,以方便查找。除此之外,使用者还可以下载IDE注册表中任何Schema的代码绑定,从而在代码中以强类型的对象形式来表示事件。

事件总线EventBridge的典型应用场景如下。

  • 构建事件驱动型架构:借助事件总线EventBridge,用户无须了解事件源,就可以直接筛选并发布事件。
  • 微服务解耦:事件总线EventBridge可以实现不同系统之间的异步消息通信,从而将互相依赖的服务解耦。
  • 异步执行:事件总线EventBridge可以使执行逻辑异步运行,减少用户的等待时间,增加系统的吞吐量。
  • 状态变化追踪:事件总线EventBridge可以作为中心接收所有应用的状态变化,然后将这些应用状态变化分别路由到需要感知这些变化的服务。
posted @ 2023-01-26 11:13  muzinan110  阅读(125)  评论(0编辑  收藏  举报