随着以函数即服务(Function as a Service)为表明的无服务器计算(Serverless)的普遍使用,不少用户遇到了涉及多个函数的场景,须要组合多个函数来共同完成一个业务目标,这正是微服务“分而治之,合而用之”的精髓所在。本文以阿里云函数计算为例,试图全面介绍函数组合的常见模式和使用场景,但愿有助于选择合适的解决方案。html
虽然本文主要介绍的是函数组合,可是基本思想也可用于服务组合。git
在这种模式里,函数直接调用 InvokeFunction 同步 API 执行一个或者多个函数,等待被调用函数返回结果,而后继续执行。这是一个有些争议的模式,不使用同步调用一般有如下缘由:github
上面的理由是在有些场景下成立的,可是微服务最经典最多见的组合方式就是同步调用,函数做为微服务的一种实现方式,这种同步调用的需求是不可回避的,在有些场景下采用同步调用模式是值得考虑的,这些场景包括:数据库
在这种模式里,调用者一般不须要作复杂的计算,主要时间花在调用函数和等待返回上,所以调用者函数能够设置较小的内存,以减小费用;调用者还能够根据业务需求缓存调用结果,减小对其它函数的调用,从而节约费用和加强容错性。api
与函数直接调用函数不一样,这里被调用函数在 API 网关后面,使它看起来更像一个微服务。这种模式的限制和使用场景跟上面的直接调用模式相似,不一样之处是 API 网关提供了一些额外的能力,好比认证和限流等。若是被调用者要根据某些业务信息对请求作处理,则使用 API 网关是一个好的选择。固然,使用 API 网关也带来了额外的延迟和费用,若是不须要使用 API 网关提供的能力,则让函数直接调用函数是一个更好的选择。数组
在这种模式里,函数执行完自身业务逻辑后,调用 InvokeFunction 异步 API 通知其它函数执行并退出,它不关心被调用函数是否执行完成。函数计算的 InvokeFunction 异步 API 是经过队列实现的,异步请求首先被写入队列,而后有一个组件从队列里消费请求,执行相应函数。这种模式的优点和使用场景有:缓存
这种模式有以下局限性:安全
与上面的模式须要指定被调用函数不一样,基于事件触发模式让调用者只须要发布消息,不关心谁去消费消息。在消息服务(MNS)中,主题是发布消息的目的地,发布者能够经过 PublishMessage API 向主题发布消息, 主题的订阅者会接收到发布到主题上的消息,MNS 与函数计算服务的集成让函数能够直接做为订阅者,简化了消息处理应用的开发和运维代价。服务器
和上面的异步调用模式相比,基于消息主题的调用模式有如下优点:网络
这种模式的局限性跟异步调用函数相似:
函数计算服务除了集成了消息主题之外,还集成了对象存储服务 (OSS),表格存储等其它事件源,这些事件源服务一样能够做为链接函数的渠道。好比,一个非函数应用对 OSS 对象操做(建立,删除等)后,一般须要其它渠道(好比消息服务)通知其它应用作后续处理,而因为 OSS 和函数计算的集成,只需简单配置,这些事件就能够直接传递给自定义函数,而不须要额外渠道再传递信息,简化了数据处理流水线的开发和运维代价。
日志服务的日志库是一个流(Stream)存储,生产者写入数据到日志库,消费者读出数据并处理。日志服务和函数计算的集成,使得消费者能够是函数,从而实现了经过流存储来协调函数调用。上面全部模式都是调用者显式或者隐式的触发一个或多个被调用函数执行,而这里生产者函数写入的数据不必定会马上被消费者函数处理,日志服务会根据用户配置将多个数据批量推送给消费者函数。
这种模式有如下优点:
函数工做流(Function Flow,简称 FnF)是一个用来协调多个分布式任务执行的全托管 Serverless 云服务,简化了开发和运行业务流程所须要的任务协调、状态管理以及错误处理等繁琐工做,让用户更好的专一业务逻辑开发。能够说函数工做流是转为函数组合而生,有效的解决了上面几种异步组合模式的局限性。
上面的全部模式都是经过点对点的方式来组合函数,而函数工做流是一个集中的协调者,函数以前再也不直接或者间接通讯,全部的触发都是由函数工做流发起,不一样函数的输入和输出是经过函数工做流来传递。所以,这种方式下的函数代码全是业务逻辑相关,没有上面模式里的发送主题消息,或者调用其它函数的逻辑,实现更加清晰。
函数工做流有如下优点:
函数工做流目前还不支持同步调用方式,若是您有同步调用需求,欢迎联系咱们(见文章最后钉钉客户群)。
总的来讲,上面的组合模式能够分为同步和异步两种,在场景适合的状况下优先选择异步模式,享受异步模式带来的松耦合,高容错等特性,不然使用同步模式。在异步模式中,若是须要编写复杂的组合逻辑,支持可靠的重试,把控整个流程,则推荐使用函数工做流,不然使用消息主题或者其它事件源服务来组合函数。
上面的模式也不是割裂的,它们在有些场景下能够搭配使用,好比有时候基于对象存储服务的调用须要触发多个函数,这就能够结合使用 OSS 的事件触发和函数工做流;又好比函数工做流经过消息队列将任务发送给更普遍的消费者,触达函数计算没法触达的地方。
最后,欢迎加入函数工做流和函数计算客户群。
“阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,作最懂云原生开发者的技术圈。”