Trigger实际上就是触发器的意思。触发器是触发函数执行的方式,在事件驱动的计算模型中,事件源是事件的生产者,函数是事件的处理者,而触发器提供了一种集中、统一的方式来管理不同的事件源。在事件源中,当事件发生时,如果满足触发器定义的规则,事件源会自动调用触发器所对应的函数。
不同云厂商中都会根据自己的业务纬度,为FaaS平台提供多种类的触发器,这其中比较常见的触发器包括API网关触发器,对象存储触发器,定时触发器等。以阿里云函数计算为例:
- 事件函数:对象存储触发器、API网关触发器、日志服务触发器、MNS触发器、定时触发器、表格存储触发器、消息队列Kafka版Connector触发器、IoT触发器、云监控触发器、CDN触发器以及事件总线EventBridge触发器等;
- HTTP函数:HTTP触发器;
当我们完成一个函数之后,我们更希望他在我们的业务中发挥一定的作用,这个时候如何来让函数所要处理的业务逻辑,在我们的业务中发挥作用,要看我们如何配置触发器了。
除此之外,触发器还可以按照函数的同步调用与异步调用来进行划分,通常情况下,函数被调用会有同步和异步的说法,而函数是由事件驱动的,所以很多时候也将一些触发器区分为“同步触发器”和“异步触发器”。
所谓的同步调用,或者说由同步触发器来触发函数,所具有的特性是,客户端期待服务端立即返回计算结果。请求到达函数计算时,会立 即分配执行环境执行函数。
以 API 网关为例,API 网关同步触发函数计算,客户端会一直等待服务端的执行结果, 如果执行过程中遇到错误, 函数计算会将错误直接返回,而不会对错误进行重试。这种情 况下,需要客户端添加重试机制来做错误处理。
所谓的异步调用,或者由异步触发器触发函数,其通常是是客户端不急于立即知道函数结果,函数计算将请求丢入队列中即可返 回成功,而不会等待到函数调用结束。
函数计算会逐渐消费队列中的请求,分配执行环境,执行函数。如果执行过程中遇到错 误,函数计算会对错误的请求进行重试,对函数错误重试三次,系统错误会以指数退避方式 无限重试,直至成功。 异步调用适用于数据的处理,比如 OSS 触发器触发函数处理音视频、日志触发器触 发函数清洗日志,都是对延时不敏感,又需要尽可能保证任务执行成功的场景。如果用户需 要了解失败的请求并对请求做自定义处理,可以使用 Destination 功能。
定时触发器
定时触发器是非常常见的一个触发器,也是绝大部分厂商所支持的触发器之一,它存在的意义就是在某个时间来执行当前函数,例如每隔一段时间执行函数、每天几点执行函数、或者每月/每周的某一天执行函数等。常见的应用场景有:
- 批量数据的定时处理,例如每1小时收集全量数据并生成报表。
- 日常行为的调度,例如整点发送优惠券。
- 与业务解耦的异步任务,例如每天0点清理数据。
对象存储触发器
函数计算是可以主动“激发”对象存储上的资源,例如下载,上传,覆盖等操作,但是如果对象存储的资源发生了变化,又如何告知函数计算呢?这个时候就可以通过对象存储触发器来进行实现。通常情况下对象存储触发器的规则都会有两个部分:
- 行为:所谓的行为则是上传操作、复制操作等,例如阿里云函数计算的对象存储触发器提供的行为包括:oss:ObjectCreated:PutObject(调用PutObject接口上传文件)、oss:ObjectCreated:PutSymlink(调用PutSymlink接口针对OSS上的TargetObject创建软链接)、oss:ObjectCreated:PostObject(调用PostObject接口使用HTML表单上传文件到指定的Bucket)、oss:ObjectCreated:CopyObject(调用CopyObject接口拷贝一个在OSS上已经存在的对象)等在内的13个基本行为;
- 规则:所谓的规则就是在行为基础上进一步进行限制,例如如果用户上传的是MP4格式的视频则转换成AVI格式视频,如果上传的是其他格式视频则不做操作,那么此时就可以使用创建行为(oss:ObjectCreated:*)与后缀.mp4进行组合,实现只有上传MP4格式后缀的视频到指定存储桶,才会触发对应的函数进行转码操作;
对象存储触发器的用处有很多,常见的场景有:
- 图像的压缩、转换
- 音视频的转码、压缩
- 大数据的处理
- 文件解压等
API网关触发器
API网关触发器实际上是和函数计算结合最近迷的触发器之一,通过该触发器可以快速实现传统的API服务,客户端通过API网关,将事件传递到函数计算,经过处理之后再返回,整个过程用户只需要关注业务逻辑即可,无需再像传统Web应用一样,需要关注包括Nginx等在内的各种软件。同时API网关等通常会提供相对完善的、更简单的配置能力,例如白名单、黑名单、请求方法、请求参数、鉴权等,据有关组织统计,Serverless架构中,FaaS+API网关的搭配,占调研应用的76%以上,这也足可以看到API网关在函数计算中重要作用。
在阿里云函数计算中,可以认为是有两种API网关触发器,虽然这种说可能并不是十分准确,但是API网关触发器和HTTP触发器在一定程度上,确实在解决同样的问题。
HTTP触发器
在阿里云函数计算中,HTTP触发器仅在HTTP函数中可以使用,相对API网关触发器而言,在一定程度上是有功能的减少,例如暂时没有提供黑名单、白名单等能力,但是相对API网关而言他有一个非常强大的优势:他可以让使用者非常快速的将传统的Web项目迁移到函数计算上。
通常情况下,API网关和函数计算所规约的数据结构是一个JSON对象,这就意味着传统的Web框架可能没办法很好的识别这个对象,需要将这个JSON对象转换成为框架可识别的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网关HTTP触发器的优势还有:
- 简化了开发人员的学习成本和调试过程,帮助开发人员快速使用函数计算搭建Web service和API。
- 支持选择您熟悉的HTTP测试工具验证函数计算侧的功能和性能。
- 减少请求处理环节,HTTP触发器支持更高效的请求、响应格式,不需要编码或解码成JSON格式,性能更优。
- 方便对接其他支持Webhook回调的服务,例如CDN回源、MNS等。
API网关触发器
包括AWS、阿里云等在内的绝大多数云厂商的FaaS产品,都是支持API网关触发器的。API网关触发器与HTTP触发器类似,可应用于搭建Web应用。相较于HTTP触发器,使用者可以使用API网关进行IP白名单或黑名单设置等高级操作。API网关调用函数计算服务时,会将API的相关数据转换为Map形式传给函数计算服务。函数计算服务处理后,按照Output Format格式返回statusCode、headers、body等相关数据。API网关再将函数计算返回的内容映射到statusCode、header、body等位置返回给客户端:
CDN触发器
除了定时触发器、API网关触发器以及对象存储触发器之外,CDN触发器也是比较常见的一种触发器。该触发器的作用是当CDN系统捕获到指定类型的、满足过滤条件的事件后,通过CDN事件触发器触发函数执行。
CDN是建立并覆盖在承载网之上、由分布在不同区域的边缘节点服务器群组成的分布式网络。通常情况下CDN可以替代传统以Web Server为中心的数据传输模式,将源站资源缓存到云厂商所提供的全国各地的边缘服务器,供应用就近快速获取,提升用户体验,降低源站压力。在函数计算中通过配置内容分发网络事件触发器,集成CDN服务可以实现对CDN的各类事件进行自定义处理。例如,使用者可以设置函数和对应的CDN触发器来处理www.anycodes.cn域名下的资源刷新事件,当该域名下有资源刷新事件时,CDN事件触发器会自动触发函数执行。
CDN事件触发器可以实现函数计算与CDN服务的集成,集成的使用场景如下:
- CDN在预热(CachedObjectsPushed)和刷新(CachedObjectsRefreshed)用户数据后,通过触发器执行函数。用户可以及时得知资源预热刷新的状态并进行下一步处理,避免不断轮询列表查询最新状态。
- 当在CDN上发现违禁内容(CachedObjectsBlocked)时,通过触发器执行函数直接去源站删除资源。您不需要等待CDN团队响应,可以及时去源站删除资源。
- 日志文件生成后(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可以作为中心接收所有应用的状态变化,然后将这些应用状态变化分别路由到需要感知这些变化的服务。
“创造”新的触发器
在我们的实际生产中,是可以发挥想象力自己“创造新的触发器”,其实与其说是创造新的触发器,不如说是在已有的触发器基础上进行灵活应用。例如Github支持WebHooks:
我们只需要在函数计算侧创建一个HTTP函数,绑定一个HTTP触发器,然后在Payload URL处填写设置好HTTP触发器后返回给我们的地址即可。当Github出现指定的行为,会触发好书进行相关的提醒。例如我在设置Webhooks时选择了Issues和Issue comments:
此时,当有人在当前仓库下进行Issue相关操作,就会通过HTTP触发器触发指定函数。当我的函数逻辑是触发钉钉机器人,并将信息发送到指定群聊中