看看顶级互联网公司都在研究的无服务器架构,看完收获满满( 二 )

  • FaaS 不需要代码基于特定的库或框架,从语言或环境的层面来看 FaaS 就是一个普通的应用程序 。例如 AWS Lambda 支持 JavaScript、Python 以及任意 JVM 语言(Java、Clojure、Scala 等),并且你的 FaaS 函数还可以调用任何一起部署的程序,也就是说实际上你可以用任何能编译为 Unix 程序的语言(稍后我们会讲到 Apex) 。FaaS 也有一些不容忽视的局限,尤其是牵涉到状态和执行时长问题,这些我们稍后详谈 。再次回顾一下点击处理的例子——代码迁移到 FaaS 唯一需要修改的是 main 方法(启动)的部分,删掉即可,也许还会有一些上层消息处理的代码(实现消息监听界面),不过这很可能只是方法签名上的小改动 。所有其他代码(比如那些访问数据库的)都可以原样用在 FaaS 中 。
  • 既然我们没有服务器应用要执行,部署过程也和传统的方式大相径庭——把代码上传到 FaaS 平台,平台搞定所有其他事情 。具体而言我们要做的就是上传新版的代码(zip 文件或者 jar 包)然后调用一个 API 来激活更新 。
  • 横向扩展是完全自动化、弹性十足、由 FaaS 平台供应商管理的 。如果你需要并行处理 100 个请求,不用做任何处理系统可以自然而然地支持 。FaaS 的“运算容器”会在运行时按需启动执行函数,飞快地完成并结束 。回到我们的点击处理应用,假设某个好日子我们的客户点击广告的数量有平日的十倍之多,我们的点击处理应用能承载得住么?我们写的代码是否支持并行处理?支持的话,一个运行实例能够处理这么多点击量吗?如果环境允许多进程执行我们能自动支持或者手动配置支持吗?以 FaaS 实现你的代码需要一开始就以并行执行为默认前提,但除此之外就没有其他要求了,平台会完成所有的伸缩性需求 。
  • FaaS 中的函数通常都由平台指定的一些事件触发 。在 AWS 上有 S3(文件)更新、时间(定时任务)、消息总线(Kinesis)消息等,你的函数需要指定监听某个事件源 。在点击处理器的例子中我们有个假设是已经采用了支持 FaaS 订阅的消息代理,如果没有的话这部分也需要一些代码量 。
  • 大部分的 FaaS 平台都支持 HTTP 请求触发函数执行,通常都是以某种 API 网关的形式实现(如 AWS API Gateway,Webtask) 。我们在宠物商店的例子中就以此来实现搜索和购买功能 。
  • 状态
    当牵涉到本地(机器或者运行实例)状态时 FaaS 有个不能忽视的限制 。简单点说就是你需要接受这么一个预设:函数调用中创建的所有中间状态或环境状态都不会影响之后的任何一次调用 。这里的状态包括了内存数据和本地磁盘存储数据 。从部署的角度换句话说就是 FaaS 函数都是无状态的(Stateless) 。
    这对于应用架构有重大的影响,无独有偶,“Twelve-Factor App” 的概念也有一模一样的要求 。
    在此限制下的做法有多种,通常这个 FaaS 函数要么是天然无状态的——纯函数式地处理输入并且输出,要么使用数据库、跨应用缓存(如 redis)或者网络文件系统(如 S3)来保存需要进一步处理的数据 。
    执行时长
    FaaS 函数可以执行的时间通常都是受限的,目前 AWS Lambda 函数执行最长不能超过五分钟,否则会被强行终止 。
    这意味着某些需要长时间执行的任务需要调整实现方法才能用于 FaaS 平台,例如你可能需要把一个原先长时间执行的任务拆分成多个协作的 FaaS 函数来执行 。
    启动延迟
    目前你的 FaaS 函数响应请求的时间会受到大量因素的影响,可能从 10 毫秒到 2 分钟不等 。这听起来很糟糕,不过我们来看看具体的情况,以 AWS Lambda 为例 。
    如果你的函数是 JavaScript 或者 Python 的,并且代码量不是很大(千行以内),执行的消耗通常在 10 到 100 毫秒以内,大函数可能偶尔会稍高一些 。
    如果你的函数实现在 JVM 上,会偶尔碰到 10 秒以上的 JVM 启动时间,不过这只会在两种情况下发生:
    你的函数调用触发比较稀少,两次调用间隔超过 10 分钟 。
    流量突发峰值,比如通常每秒处理 10 个请求的任务在 10 秒内飙升到每秒 100 个 。
    前一种情况可以用个 hack 来解决:每五分钟 ping 一次给函数保持热身 。
    这些问题严重么?这要看你的应用类型和流量特征 。我先前的团队有一个 Java 的异步消息处理 Lambda 应用每天处理数亿条消息,他们就完全不担心启动延迟的问题 。如果你要写的是一个低延时的交易程序,目前而言肯定不会考虑 FaaS 架构,无论你是用什么语言 。


    推荐阅读