写点什么

Serverless 比你预期要贵得多

  • 2021 年 4 月 06 日
  • 本文字数:2186 字

    阅读完需:约 7 分钟

Serverless比你预期要贵得多

在运营一个持续集成(CI)公司多年后,你会发现架构决策中的许多隐藏成本。在本文,我想谈谈 Serverless 和它的主要替代方案——微服务(容器化)架构,它们之间的实际区别。

架构介绍:Serverless 和容器+CDN

我们在过去几年看到的新产品中的绝大多数后端架构都属于这两者之一。

Serverless

serverless 核心思想是指定一个策略来创建新的 Web 服务器,而不是自己启动它们。这样一来,如果你的产品在某个地方出彩,获得巨大的流量爆发,你的云提供商可以启动许多 Web 服务器副本,然后在流量减少时关闭这些 Web 服务器。



serverless 通常与其 AWS 商标名 Lambda 互用


当然,serverless 最终还是会使用 Web 服务器。关键是你不必自己去创建这些服务器。你所要做的只是指定构建它们的方法,然后你的云提供商会随着并发请求数量的增加或减少来创建 Web 服务器的副本。即使对于用户很少的小项目,你也可以通过在夜间没有人访问你的网站时关闭 Web 服务器来节省资金。

容器 + CDN

你可以将托管网站的计算成本最高的部分包给其他人,而非指定一个方法来创建 Web 服务器。这就是 CDN 的思路。当一个 Web 服务器的运行速度变慢,通常是由数百个请求要获取相同的不怎么变的资源。CDN 会为你负责这些常见的请求,例如静态图片。



容器(左)和 CDN(中间)处理来自用户的数百个请求


在这种架构中,你的网站用户会从 CDN 请求资源,CDN 将响应大部分(大约 90%)请求。只有那些不能明显缓存的请求会被转发到你的容器。

概述:serverless vs 容器

  • serverless“Web 服务器”通常是如何创建真正的 Web 服务器的方法,然后你的云服务商会在一个访问者首次请求某些东西时启动一个 Web 服务器。

  • 容器通常启动速度慢得多,因此你需要保持至少一台 Web 服务器 24/7 运行,以防有人访问你的网站。

Serverless 理论上看起来更便宜

当 AWS Lambda 在 2014 年推出时,它听起来不可思议:1GB 内存,每毫秒 0.0000000167 美元的计算量。一个典型的 API 请求可能是 20ms,因此你需要为每个请求支付 0.000000334 美元。


由于大多数工作负载都非常“火爆”,因此即使是用 Lambda 托管一个非常流行的服务,你也只需要支付不到 100 美元每年。


相比之下,对大多数产品来说,一个类似的容器+CDN 架构可能耗费每年 500 美元。


当然,这是一个非常简单的比较(弹性负载均衡、CDN 入口/出口、serverless 也可以使用 CDN 等...),但对于今天的大多数在线产品来说是正确的。在其它同等的情况下,serverless Web 服务器的成本是类似的容器的 10%-20%。

开发者工资是 serverless 的隐藏成本

基础设施成本是一个很好的指标——很容易预测,是比较一个“好架构”与一个“坏架构”的便捷方法。


然而,基础设施成本与开发人员的工资相比却相形见绌。每年 500 美元的容器会由一名每年 75000 美元的开发者维护。


实际上,人力成本是很多公司低估的。如果你有一个本地无法复现的 bug,开发人员使用一个闭源的 AWS 账户会很难复现和调试它。


三个因素结合在一起让用 serverless 进行开发变得异常困难:


  • 你不能本地模拟 serverless 实例,只能在云上模拟。

  • 很少有公司能创建它们的生产环境的基础设施的副本。开发人员通常会花几个小时来申请合适的环境,并确保没有其他人同时使用这个环境。

  • 开发人员很少能访问生产环境资源,因此它们不得不花费数个小时协调一个编程会话才能在生产环境调试。



世界各地的 slack 工程频道的一个常见场景


如果单个开发人员每周修复一个 bug,并且由于上述因素,修复每个 bug 所需的时间延长一个小时,那么你的公司每年会为单个开发人员的生产力损失支付 1872 美元。这个数字已经是最初成本差异的 4 倍。


相反,一个容器架构可能完全运行在一个开发人员的电脑上,因此每个开发人员都可以在他们自己的笔记本上重现 bug,而不必使用一个演示(staging)环境。

另一项成本:serverless 会给客户带来更多 bugs

出于与前一点相似的原因,使用一个持续集成/持续部署系统自动测试一个 serverless 架构要困难得多。


容器化架构更容易进行测试,因为你可以在单个 VM 中运行它。想要运行持续集成,serverless 架构需要请求你的云服务商为每次更改进行部署。



系统的最终测试是端到端(end-to-end,E2E)测试:通过创建一个假用户,然后像一个真用户一样与整个应用程序进行交互,来验证通用工作流程。如果可以根据需要创建架构副本,这些测试就能针对提出的更改自动运行。


在许多公司中,demo 演示中的一个 bug 可能意味着损失 6-7 位数的销售额。这些 bug 通常是影响不同组件交互的看似无害的更改结果。如果开发人员不在每次更改后测试这些流程是否继续生效,那么就很容易损坏一个“立即支付(pay now)”按钮或者登入。


如果整个堆栈能运行在单个机器上,那么它就可以不怎么麻烦地运行在一个持续集成服务商上。相比之下,一个 serverless 栈可能需要为每个更改在你的云服务商中从头创建整个环境,这会花费 10 倍更长的时间。

解决方案

显然,对于服务器的解决方案是让供应商采用一个通用标准(AWS kubeless 或 AWS OpenFAAS)。只要 serverless 与闭源云产品同名,那么就会因为开发人员的生产力的损失而大大增加成本。


实际上,最好的解决方案是完全避免使用 AWS Lambda 或 Cloudflare Workers 这样的平台作为核心基础设施,直到能自行托管它们进行问题复现和测试。


对于几乎每一个架构决策,托管成本都比开发者行动缓慢的成本要重要得多。在考虑到需要使用基础设施工作的开发人员的时间成本之前,不要因为价格来进行架构决策。


原文链接:


https://layerci.com/blog/the-hidden-costs-of-serverless/

2021 年 4 月 06 日 14:281987
用户头像

发布了 151 篇内容, 共 50.0 次阅读, 收获喜欢 288 次。

关注

评论

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

JavaScript 深拷贝与浅拷贝

梁凤波

如何进行冥想?给大脑来场清新的SPA!

金龟换酒

自我管理 App 冥想

Python 为什么没有 void 关键字?

Python猫

Python 编程

一个在交流群里讨论过两轮的问题,答案竟然跟一个 PEP 有关

Python猫

Python 编程

Python 为什么要在 18 年前引入布尔类型?且与 C、C++ 和 Java 都不同?

Python猫

Python 编程

Flink保存点-17

小知识点

scala 大数据 flink

持续集成有什么好处?快来看鸭

清菡

jenkins

[翻译]Defer,Panic,and Recover

卓丁

Go defer panic recover

职场求生攻略答疑篇之 3 —— 数据是土地

臧萌

数据 职场成长

Docker 搭建 Redis Cluster 集群环境

哈喽沃德先生

redis Docker 容器 集群 redis cluster

Python 为什么能支持任意的真值判断?

Python猫

Python 编程

Elasticsearch之mapping

北漂码农有话说

Google鼓励的13条代码审查标准 [建议收藏]

简爱W

凤凰交易所 全球首个多元化生态交易平台震撼来袭

InfoQ_967a83c6d0d7

商业通识 : 商业到底是什么?

Walker

学习 得到 个人成长 商业

首个数字银行卡明年发行,广州出台区块链措施支持大湾区

Geek_987812

区块链 金融科技 社会

智能商业时代的思考(一)从在线化到网络化

刘旭东

拼多多 淘宝 智能商业 网络协同

LeetCode题解:239. 滑动窗口最大值,双循环暴力,JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

区块链技术应用于链接智慧医疗

Geek_987812

区块链 社会保险 智能医疗

java安全编码指南之:声明和初始化

程序那些事

安全编码 java安全编码 编码指南 对象初始化

妈妈,今天您几点下班?

脑极体

SpringBoot 缓存之常用注解

hepingfly

Java 缓存 springboot 注解

【MySQL】我这样分析MySQL中的事务,面试官对我刮目相看!!

冰河

MySQL 面试 事务 隔离级别 冰河

从每秒6000写请求谈起

架构师修行之路

程序员 架构师 高并发系统设计

Python 中的数字到底是什么?

Python猫

Python 翻译 PEP

区块链技术破解数字版权保护难题

Geek_987812

区块链 版权保护 数字技术

Flink从保存点启动应用-18

小知识点

scala 大数据 flink

学习笔记丨结构体中的内存管理

Liuchengz.

c Linux 学习

实战中学习浏览器工作原理 — 之 HTTP 请求与解析

三钻

CSS Java 前端 浏览器

Python 函数为什么会默认返回 None?

Python猫

Python 编程

oeasy教您玩转linux010206toilet

o

聊聊IO夯的那些事

聊聊IO夯的那些事

Serverless比你预期要贵得多-InfoQ