QCon全球软件开发大会8折优惠倒计时,购票立减¥1760!了解详情 >>> 了解详情
写点什么

Mike Roberts: 什么是无服务器架构?

2016 年 6 月 27 日

无服务器架构是最近一个比较热的话题。我们也看到有很多的书籍、开源框架和大量的产品在不断涌现,在一些技术大会上也有专门的主题。6 月 17 日, Mike Robers 在 Martin Fowler 的博客网站上发布了一篇题为“无服务器架构”的文章,引起了业界的诸多关注。在该文章中,他认为无服务器是后端即服务 (BaaS) 和函数即服务 (FaaS) 的结合,并以 AWS Lambda 产品为例探讨了 FaaS 的特点、什么不是无服务器及需要考虑的其他相关问题。他指出:

就像很多软件发展趋势一样,业界并没有对“无服务器”有一个明确的说法,即使它真的表示以下两个不同而又重叠的领域也不会对此有所帮助:

  1. 无服务器先用来描述那些显著或完全依赖于第三方应用或服务(“在云端”)的应用程序。这些应用程序依赖于第三方来管理服务器端逻辑和状态,它们都是典型“富客户端”的应用程序(你可以想象为单一页面的 Web 应用程序或移动应用),并采用云平台提供的生态系统,包括可访问的数据库(如 Parse、Firebase)、认证服务(Auth0、AWS Cognito)等。这些类型的服务以前被描述为“(移动)后端即服务”。我在文中会用“BaaS”缩写来代替这样的服务。
  2. 无服务器还表示那些有服务器端逻辑的应用仍然需要由开发者来编写。不同于传统的架构,它运行在无状态计算的容器中,这些容器由事件触发的、是短暂的(也许仅仅只是一次调用)、并且完全由第三方管理。(感谢 ThoughtWorks 在他们最近的技术雷达的定义。)理解这个观点的另一种方式是“函数即服务(FaaS)”,其中 AWS Lambda 是目前最流行的 FaaS 实现之一。

Mike 主要分析了第二个领域,并用 FaaS 作为文中“无服务器”的代言词。他认为第二个领域相对较新,并且它和我们平常如何考虑技术架构的方式有显著的区别,也推动了无服务概念周边很多的炒作。他也提到了其实这些概念是相互关联的,并在不断合并。文中他给出了 UI 驱动的应用和消息驱动的应用两个例子解释了无服务架构的设计以及不同。

通过解读 AWS Lamda 产品描述,Mike 在文中分享了他对于 FaaS 的几个理解:

  1. 从根本上说,FaaS 是关于无需管理自己的服务器系统或者服务器应用,就能够运行后端代码的。
  2. FaaS 不需要基于一个特定的框架或类库进行编码。
  3. 无服务器应用程序的运行部署与传统系统非常不同 - 我们将代码上传到 FaaS 服务提供商,它会帮我们做所有其他事情。
  4. 水平扩展是完全自动的、弹性的,并且由服务提供商进行管理。
  5. FaaS 中的函数是由服务提供商定义的事件类型触发的。
  6. 大多数服务提供商还允许函数被 HTTP 请求响应触发,通常在某种 API 网关里。

他同时也探讨了 FaaS 在状态、执行时长、启动延时、API 网关、工具和开源等方面的表现。他提到了 FaaS 在本地状态的显著约束,并可以这样简单来理解:

对于任何的函数调用,你所创建的进程或者主机状态不会有一个对随后的调用可用,这包含了你写到内存和硬盘上的状态。换句话说,从部署单元角度来看,FaaS 的函数是无状态的。这对应用架构产生了巨大的影响。

这通常意味着 FaaS 要么是纯粹无状态的,即提供输入的纯函数转换;要么是利用数据库、跨应用缓存(如 Redis)或者网络文件存储(如 S3)的方式来存储跨请求的状态或处理请求需要的进一步输入。

而对于执行时间而言,

FaaS 函数的每次调用是有时间限制的。当前 AWS Lamda 函数不允许超过 5 分钟,超过就会被中断。这意味着长任务并不适合 FaaS,除非重新设计架构。

另外,FaaS 函数的响应时长取决于很多的因素,也许会从 10 毫秒到 2 分钟。Mike 认为如果你编写一个低延迟交易应用,那么不管你使用什么语言实现,可能都无法使用 FaaS 系统。

那么 Paas 是无服务器吗?在文中 Mike 引用了 Adrian Cockcroft 的回答

如果您的 PaaS 能够高效地在 20 分钟内启动运行半秒的实例,那么你可以称它为无服务器。

Mike 认为:

绝大多数 PaaS 应用并不是着眼于将整个应用的每个请求都来回切换,而 FaaS 平台做的正是这一点。FaaS 和 PaaS 之间的主要操作差异在于扩展。对于大多数的 PaaS 来说,你仍然需要考虑规模,例如在 Heroku 你想运行多少 Dynos。而如果是 FaaS 的应用,这完全是透明的。即使你将你的 PaaS 应用程序设置为自动扩展,你也不会对单个请求进行同样的配置(除非你有一个非常特殊的流量描述文件),所以当涉及到成本的时候,FaaS 应用会更高效。

同时他也指出这并不意味着没有运维。这里要考虑两个重要的事情:

  • 首先,“运维”不仅仅意味着服务器管理。它也意味着监控、部署、安全、网络,也意味着一定的产品问题诊断和系统规模扩展。这些问题在无服务器应用中仍然存在,你依旧需要应对的策略。
  • 其次,即使仍然发生系统管理的工作,你也仅仅是将它们外包给无服务器平台而已。

最后 Mike 对存储过程即服务的另一话题也进行了探讨,他认为:

这可能来自于一个事实,即 FaaS 函数的许多例子(包括一些我在本文中使用的)都是少量访问数据库的代码。如果这就是我们可以使用 FaaS 的所有场景,那么我认为这个名字是有帮助的。然而它实际上只是 FaaS 能力的一个子集。如果仅仅因为这个原因就形成这样观点的话,那这限制是不合理的。

同时他也提到了值得去考虑 FaaS 是否也有存储过程的一些问题,包括 Camille 在 tweet 中提到的技术债,也值得在 FaaS 的上下文去探讨一下存储过程中已经得到的经验教训,并是否适用 FaaS。


感谢夏雪对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016 年 6 月 27 日 19:004934

评论

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

阿里P8整理出SQL笔记:收获不止SOL优化抓住SQL的本质

Java架构之路

Java 程序员 架构 面试 编程语言

为极客时间增加自动提醒功能,督促用户回来上课

克比

关于ReentrantReadWriteLock,首个获取读锁的线程单独记录问题讨论(firstReader和firstReaderHoldCount)

徐同学呀

AQS Java源码 JUC

干货来袭!阿里巴巴面试指南(华山版)强势开源,上线7天已获百万推荐!

程序员小毕

Java 编程 程序员 架构 面试

极客架构模块2作业-朋友圈高性能架构分析

Geek_649372

架构实战营

探索区块链Baas平台的奥秘,源中瑞公共服务平台开发技术

源中瑞-龙先生

区块链 源中瑞 Baas

聪明人的训练(十七)

Changing Lin

4月日更

TcaplusDB君 · 行业新闻汇编(4月17日)

TcaplusDB

数据库 nosql 数据 TcaplusDB

Anolis OS 8.2 RC2 发行,支持飞腾、海光、兆芯、鲲鹏等芯片

阿里云基础软件团队

阿里高工熬夜18天码出Java150K字面试宝典,却遭Github全面封杀

Java架构之路

Java 程序员 架构 面试 编程语言

ThreadPoolExecutor源码解读(二)execute提交任务,Worker详解。如何执行任务?如何回收空闲线程?

徐同学呀

线程池 Java源码 JUC ThreadPoolExecutor

ScheduledThreadPoolExecutor源码解读(二)ScheduledFutureTask时间调度执行任务(延迟执行、周期性执行)

徐同学呀

线程池 Java源码 ScheduledThreadPool JUC

苏州园区:面向全国“发帖”聚力 加快创建区块链技术应用高地

CECBC区块链专委会

阿里高工熬夜14天码出这份Java10w字的面试手册!却遭GitHub封杀

Java架构之路

Java 程序员 架构 面试 编程语言

史上最强的:京东北极星商业系统权限管控实践

Java架构师迁哥

阿里架构师如是说:权限系统就该这么设计

Java架构师迁哥

HarmonyOS开发者日再现上海,生态最新进展、核心代码解析、创新案例分享

Geek_283163

程序员3年CRUD从8K涨到20K,这4个月我到底经历了什么?

码农之家

编程 程序员 互联网 面试 职场

FutureTask源码解读,阻塞获取异步计算结果(阻塞、取消、装饰器、适配器、Callable)

徐同学呀

Java源码 JUC Future

华为帐号服务学习笔记(四):Authorization Code模式服务端开发

Coding狙击

Java android

ThreadPoolExecutor源码解读(三)如何优雅的关闭线程池(shutdown、shutdownNow、awaitTermination)

徐同学呀

线程池 Java源码 JUC ThreadPoolExecutor

【腾讯阿里最全面试题】Redis持久化RDB和AOF 的区别

Linux服务器开发

面试题 面经 后端开发 Linux服务器开发 BAT面试题

读懂「数据」在区块链网络中流动的3种范式?

CECBC区块链专委会

区块链

架构实战营 - 模块 2- 作业

请弄脏我的身体

架构实战营

架构师实战营 模块二总结

代廉洁

架构实战营

ThreadPoolExecutor源码解读(一)重新认识ThreadPoolExecutor(核心参数、生命周期、位运算、ThreadFactory、拒接策略)

徐同学呀

线程池 Java源码 JUC ThreadPoolExecutor

ScheduledThreadPoolExecutor源码解读(一)DelayedWorkQueue高度定制延迟阻塞优先工作队列

徐同学呀

线程池 Java源码 ScheduledThreadPool JUC

Github霸榜数月!原来是阿里大牛最新的Java性能优化实战笔记

钟奕礼

Java 编程 程序员 架构 面试

CopyOnWriteArrayList源码解读之CopyOnWrite思想的利与弊

徐同学呀

Java源码 JUC CopyOnWriteArrayList

ThreadPoolExecutor源码解读(四)如何正确使用线程池(总结坑点+核心参数调优)

徐同学呀

ThreadPoolExecutor

openLooKeng如何应对“野蛮零散”的大数据

openLooKeng

大数据 开源 openLooKeng

移动应用开发的下一站

移动应用开发的下一站

Mike Roberts: 什么是无服务器架构?-InfoQ