生成式AI领域的最新成果都在这里!抢 QCon 展区门票 了解详情
写点什么

Serverless 现状研究报告

  • 2020-03-24
  • 本文字数:3582 字

    阅读完需:约 12 分钟

Serverless现状研究报告

本文最初发表于Datadog站点,授权 InfoQ 中文站翻译分享。


现在“Serverless”可能是一个流行术语,但是它并非空洞的存在。AWS Lambda 推出还不到 5 年的时间,就已经被近一半使用 AWS 基础设施的公司所采用。在本报告中,我们分析了数千家公司的 Serverless 使用情况,以了解在现实中他们是如何使用 Serverless(以及使用到了什么程度)。


Serverless 消除了提供和管理基础设施组件(例如,服务器、数据库、队列,甚至容器)的必要性,能够允许团队专注于代码,同时最小化他们的运维开销。本报告将关注 Serverless 领域的一个子集,即所谓的“函数即服务”(functions-as-a-service, FaaS),它提供了与公共云相同的即付即用模型,但处于“函数”级别,而不是基础设施组件级别。函数只是简单的代码片段,在用户请求或其他事件调用时执行离散的业务逻辑。


对于本报告来说,我们会关注 AWS Lambda,它在 2020 年初是我们的用户群中最成熟和被广泛采用的 Serverless 平台。在该报告的未来版本中,我们可能会研究来自其他提供商的 Serverless 产品,比如 Google Cloud Platform 和 Microsoft Azure。

一半的 AWS 用户已经采用了 Lambda

在 2020 年初,Lambda 已经不再是小众的技术。使用 Amazon Web Services 的 Datadog 客户中有近一半已经采用了 Lambda。(参见文末的方法论章节以了解我们是如何定义采用 Lambda 和使用 AWS 的。)这样的采用率,再结合下面章节所讨论的根据环境分解的 Lambda 使用情况,表明 Lambda 并不局限于云原生的早期采用者和小众使用场景。相反,在采用 AWS 基础设施的各种各样的公司中,serverless 函数得到了广泛的应用。


Lambda 在大型环境中更为普遍

令人意外的是,Lambda 的广泛采用并不是由更新、更小的公司所驱动的。相反,我们看到 Lambda 的采用情况与公司基础设施环境的大小有着明显的相关性,无论环境指的是主服务器、容器,还是 serverless 函数均是如此。(参见文末的方法论章节以了解我们规模区分的详细信息。)在基础设施规模最大的那些公司中,超过四分之三的公司都采用了 Lambda。


使用容器的用户已经大面积采用 Lambda

在 AWS 中运行容器的公司特别中意于 Lambda。截至 2020 年 1 月,在 AWS 运行容器的组织中有近 80%都采用了 Lambda。尽管 serverless 函数和容器是两个非常不同的环境,但是它们似乎基于类似的原因而被众人所接受,比如为了简化运维而抽象出基础设施的关注点。在一些使用场景中,Lambda 和容器基础设施是直接连接的(例如,使用Lambda函数来触发 Amazon Elastic Container Service 的任务),但是更多的组织可能正在分别运行它们,以满足不同的需求。例如,某家公司可能在一个容器集群中运行其大部分的应用程序,同时将突发的、短期运行的任务(例如支付处理)转移到 serverless 的函数中。


Amazon SQS、DynamoDB 与 Lambda 是绝配

在将函数连接至基础设施和应用程序组件时,Lambda 用户有大量可选的技术。当函数被触发时,它通常会将自己所产生的数据发送给消息队列,而消息队列可以将数据路由至其他的 Lambda 函数、基于服务器的应用程序或者云服务。消息队列能够让组织采用“仅为真正使用的内容服务”的 serverless 模式。相对于调用其他的函数并一直等待响应(占用可计费的调用时间),serverless 可以通过消息队列的方式进行异步调用。由于函数是临时的和无状态的,所以它们通常会对单独的持久化数据存储进行读写操作。


在与 Lambda 函数相同的请求中所调用或查询的服务里面,Amazon DynamoDB 名列前茅。键值和文档存储非常适合 Lambda 函数,因为它是一个托管的、可自动伸缩的数据存储,可以保证低延迟。在使用 Lambda 的场景中,数据存储方面另一个最流行的选择是 SQL 数据库(无论是 Amazon RDS 实例还是自管理数据库)和 Amazon S3。Amazon SQS(Simple Queue Service)是 Lambda 请求中消息队列的首选,其次是 Amazon Kinesis 和 Amazon SNS(Simple Notification Service)。SQS 在逻辑上非常适合 serverless 架构:它易于搭建和扩展,成本相对较低,并且提供与 Lambda 的紧密集成。


Lambda 用户中,Node.js 和 Python 占据了主导地位

在 Lambda 用户可用的语言和框架中,我们看到有两个明显占据了主导地位:Python 和 JavaScript(借助 Node.js)。在当前所有已部署的 Lambda 中,有 47%在运行 Python,另外还有 39%在运行 Node.js 应用。Python 3 与 Python 2 的比例是 2 比 1(Python 2 在 2020 年 1 月正式结束了其生命)。


Python 和 Node.js 的 Lambda 运行时的流行程度反映了最近应用程序开发的趋势以及 Lambda 服务本身的发展。AWS 在 2014 年首次发布 Lambda 预览版,其中 Node.js 就是第一个得到支持的运行时,2015 年又增加了对 Java 和 Python 支持。对 C#(借助.NET


Core)、Go 和 Ruby 的支持则是在 2018 年新增的。


Lambda 函数运行时间的中位数是 800 毫秒

Lambda 函数运行时间的中位数约是 800 毫秒,这是在所有调用中取平均值得到的,但是延迟分布曲线的尾部很长。四分之一的 Lambda 函数平均执行时间超过 3 秒,12%的函数执行时间超过 10 秒。一些 Lambda 函数的持续时间很长,这是值得注意的,因为 serverless 的延迟不仅影响应用程序的性能,还会影响云计算的成本。Lambda 定价是基于计算时间的“GB-seconds”:分配给函数的内存(详细信息如下图所示),并乘以其调用的持续时间。



我们将函数持续时间的分布放大一下可以发现,将近五分之一的函数在 100 毫秒内执行完成,大约三分之一在 400 毫秒内执行完成。


一半的 Lambda 函数具有最小的内存分配

如前所述,Lambda 调用的成本是根据持续时间和函数内存的乘积计算出来的。因此,鼓励运行 Lambda 的公司限制其函数的内存分配(这是一个可配置的设置,因此比函数的持续时间更容易控制)。实际上,47%的函数被配置为使用最小的内存运行,即 128 MB,而只有 14%的函数的内存分配大于 512 MB,用户可以为每个函数最多分配 3,008 MB。


三分之二的超时时间定义都在 1 分钟以下

每个 Lambda 函数都有一个可配置的超时设置,时间从 1 秒到 15 分钟不等,这是 Lambda 调用所允许的最长持续时间。大多数函数都使用了较短的超时:三分之二的超时时间配置为 60 秒或更少。(创建函数时的默认超时时间为 3 秒。)


通常来讲,建议的做法是使用较短的超时时间,因为挂起函数会增加云成本,而且 Lambda 应用程序架构经常需要快速响应。Amazon API Gateway 通常用于在 Lambda 函数前提供 REST 接口,它的最大超时设置为 29 秒。因此,API 网关后面的任何 Lambda 函数如果响应时间超过 29 秒的话,都将会导致一个错误,即使 Lambda 最终成功地完成了它的工作也是如此。尽管有这些考虑因素,但是依然有许多函数都配置为所允许超时的最大设置:当前的 900 秒限制以及之前的 300 秒限制(有效期到 2018 年 10 月)。


仅有 4%的函数定义了并发限制

默认情况下,在每个 region 中,Lambda 客户的所有函数会有 1000 个并发执行的限制。用户可以设置每个函数的并发限制,这样的话,就能够为特定函数在总并发池中预留一部分。如果函数超过了它的并发限制,就会进行节流。


如今,在所有的函数中,尽管大多数组织都知道有这个可选限制,但是只有 4.2%的函数配置了并发性限制。实际上,88.6%运行 Lambda 的公司在其环境中至少为一个函数使用了并发限制。定义了并发限制的函数更有可能被限流。在 5 天的评估窗口中,具有并发限制的函数中有 8.3%至少被限制一次,而只有 0.3%的函数仅受到 region 的限制,而不是每个函数本身的限制。


方法论

样本

在本报告中,我们收集了 Datadog 客户群中数千家公司的使用数据。虽然 Datadog 的客户涵盖了各个公司规模和行业范围,但他们确实有一些共同的特点。首先,他们往往对软件基础设施和应用程序的性能非常重视。他们比一般的人群更倾向于采用云平台和服务。本文中的所有结果都存在偏见,因为数据来自我们的客户群,这是一个庞大但不完美的全球市场样本。

Lambda 的采用情况

在这个报告中,我们认为如果某家公司一个月里至少运行五个不同的 Lambda 函数,那么我们就认为他们采用了 Lambda。Datadog Forwarder 函数会将 S3 和 CloudWatch 日志等数据发送到 Datadog,该函数不包含在计数中。

关于对 AWS 的使用

如果一个公司在一个月内至少运行 5 个不同的 Lambda 函数或 5 个不同的 EC2 实例,那么我们就认为该公司在使用 AWS。通过这种方式,我们可以捕获 AWS 用户的基本信息,从而将它们分为专门运行 EC2 实例的公司、专门运行 serverless 函数的公司或同时运行这两种功能的公司。

环境的规模

为了评估公司基础设施环境的相对规模,我们检查了公司的 serverless 函数、容器、物理服务器、云实例和其他基础设施服务的使用情况。虽然类别(如“中型”和“大型”)之间的界限必然是人为定义的,但类别之间的趋势是明显的。


原文链接:


https://www.datadoghq.com/state-of-serverless/


2020-03-24 09:002934

评论

发布
暂无评论
发现更多内容

一文解开java中字符串编码的小秘密

程序那些事

java安全编码 java编码指南 UTF编码

week11--作业

Geek_165f3d

企业中台化落地:从战略分析到战术实践及架构演进过程

Barry的异想世界

架构设计 策略模式 模板方法模式 中台架构 领域驱动设计DDD

基于Goc的Golang代码VSCode实时染色方案

大卡尔

测试覆盖率 精准测试 Go 语言

藏在Java数组的背后,你可能忽略的知识点

Java架构师迁哥

区块链赋能市场监管 浙江上线“黑科技”清除取证固证难题

CECBC

区块链 市场监管 取证难题

为什么每个微服务要有自己独立的数据库?

码猿外

数据库 架构 微服务

我们该怎么保护手机屏幕前的父母?

徐说科技

手机 短视频

从新浪数字化转型,窥见互联网的“懂行”新十年

脑极体

TOGAF认证课由2天变化为5天的思考

周金根

企业架构 TOGAF

LeetCode题解:232. 用栈实现队列,使用两个栈 入队 - O(n), 出队 - O(1),JavaScript,详细注释

Lee Chen

大前端

【高并发】Redis如何助力高并发秒杀系统,看完这篇我彻底懂了!!

冰河

多线程 高并发 秒杀 电商超卖 签约计划第二季

面试必问亿级流量优化策略之JVM调优,文档视频面试,还不收藏

小Q

Java 程序员 架构 JVM jvm调优

宅家三个月玩转算法,再战字节跳动,字节跳动面试官朝我比了个“ok”

编程 字节跳动 面试 算法

Java四种引用类型:强引用、软引用、弱引用、虚引用

简爱W

Golang领域模型-实体

奔奔奔跑

架构 微服务 领域驱动设计 DDD Go 语言

[翻译]Scalable Go Scheduler Design Doc[Go可扩展调度设计文档]

卓丁

golang scheduler Go scheduler Go 语言

LeetCode题解:232. 用栈实现队列,使用两个栈 入队 - O(1),出队 - 摊还复杂度 O(1),JavaScript,详细注释

Lee Chen

大前端 LeetCode

阿里培训官给新入职程序员的25条建议

Java架构师迁哥

区块链技术发展的十大趋势

CECBC

区块链 金融 安全问题

业务架构学习内容有哪些?

周金根

BIZBOK 业务架构

LeetCode 169. Majority Element

liu_liu

算法 LeetCo

SpringCloud轻松集成Dubbo实现RPC调用

Barry的异想世界

微服务 dubbo nacos RPC spring cloud alibaba

澳门金沙玩赢了钱提现不了异常注单未更新有什么办法处理?

丛林里的余光

异常检测 澳门金沙 提现不了

Dubbo-go应用维度注册模型

apache/dubbo-go

dubbo dubbo-go dubbogo

央行数研所推出贸易金融区块链平台

CECBC

区块链 金融

一点 Go Web 编程实践经验

Garfield

Go web Go 语言

架构师课作业 - 第十三周

Tulane

我理解的面向对象(ObjectiveSql 实践)

Braisdom

Java ORM框架 ORM

不草率,你只管下载资料,剩下的交给「哇哦」

小Q

Java 学习 架构 面试 分布式

oeasy教您玩转 linux 010212 管道 pipe

o

Serverless现状研究报告_软件工程_Datadog_InfoQ精选文章