FaaS,未来的后端服务开发之道
说 FaaS 先要说说 PaaS
平台即服务(Platform as a Service)是一种云计算服务,提供运算平台与解决方案堆栈即服务。在云计算的典型层级中,平台即服务层介于软件即服务与基础设施即服务之间。 平台即服务提供用户能将云基础设施部署与创建至客户端,或者借此获得使用编程语言、程序库与服务。用户不需要管理与控制云基础设施,包含网络、服务器、操作系统或存储,但需要控制上层的应用程序部署与应用托管的环境。
引用自维基百科
简单来说,PaaS 就是把计算能力放在线上,你只管写代码就行了,目的也是为了减少后端维护的成本,让开发者更关注到开发本身。国内有 Sina App Engine,国外有 Heroku、Google App Engine、Amazon Web Services,但是这类服务被真正用来做产品的并不多,大多是当作开发的试验田跑一下,而且跑起来的成本比独立部署个服务器也差不多,你要理解很多服务的相关性,应用运行时还有提供各种服务的桥接,就造成你需要去理解一大堆东西才能把他们五花大绑到一起,所以这类服务并没有成为真正的主流,更多的是还是用原生的计算能力,比如 Amazone EC2、AWS 这类 IaaS 平台,国内的阿里云、UCloud 等。
PaaS 有不少缺点。
1、对计算能力不可掌控
PaaS 将自己的运行时封装成了一个黑盒子,你要用他你就要基于这些黑盒子的约束和条件去自行判断,需要了解每个模块或者函数的可用性和限制是什么,才能更好的开发,为了避免应用有太高的权限造成安全问题,服务商往往的做法是裁剪,将限制的能力来提供给你,那么如果你要开发一个应用,本地能用,部署了可能会有各种兼容问题。
一个完整的应用,在基于 PaaS 去开发的时候,势必会有服务的依赖,对于这些服务的依赖,你也是没有掌控能力的,你只能基于给出的环境变量是去配置,但是往往在复杂应用中,对于服务的依赖非常深入,可能会有比较深入的使用和调优,这个只能束手无策。
2、线上开发调试模型复杂
一个完整的应用就是一个功能集合,开发调试起来是很麻烦的,想象一下如果一个很庞大的网站,有一大堆的功能,你依赖可能十几个甚至二十几个服务,跑在你不太知道的黑盒子,你的调试该多麻烦。如果是你自己的环境,你可以随意的开启 DEBUG 参数、去查看系统调用栈、去看硬件参数、去看系统优化参数、去分析运行时的细小问题、而在 PaaS 你能做的仅仅是通过服务商提供的一个后台来做一些简单的查看,日志的分析。这个决定了 PaaS 不适合一个有规模的产品去使用。
FaaS - 函数即服务
FaaS 最终目的和 PaaS 类似,让开发者关注在开发本身,服务由服务商提供。那 FaaS (Function as a Service)是什么呢?我为什么觉得它是未来开发的一个趋势。现在 FaaS 的说法还不太一致,但是可以明确的是** FaaS 是 PaaS 能力的一种缩放,缩放到 Function 级别**。FaaS 可以将函数作为一个线上服务、远程计算服务,可以通过 API 执行、通过邮件执行、通过 Iot 执行,通过队列执行。你只需要写统一的函数就行了。FaaS 的入口是事件,下面是 AWS Lambda 的事件流图。

我认为 FaaS 有以下几个特点:
1、函数粒度小易于调试
对于 FaaS 来说,你要写的就是一个个函数,它就是一个功能。你要做的只是写下如下这样的函数,然后再用配置文件告诉服务器如何让他运行,就完事了,你的所有工作都在这个函数内完成。而函数本身只需要负责处理输入和输出。(输入和输出是基于事件而不同的。)

在 FaaS 中函数的执行是无状态的,函数运行时本身是封装在一个容器内,执行完后所有的的状态都会被销毁(当然为了优化,可能会缓存一段时间),但是最终不要期望通过有状态的方式来运行函数,这是对于函数本身的限制。试想只需要定义好输入,就能来调试函数了,测试来说会非常方便,而 PaaS 是一个复杂的合集,你的调试的方便性由你的写法决定。
2、函数可配置性
每个函数都是一个功能,这个功能如何执行,依赖是什么,是可以通过配置文件来完的成,如果一个函数可配置如何执行,那么就可以让他达到共享的目的。试想一下,你写了一个视频处理的功能,传入的是一个视频地址或者URL,传出的是一个 GIF,那么这个函数你只需要先写好功能,然后用配置文件定义如何运行,如果这是个 API 服务,那么定义出来 HTTP 请求什么路径,什么方法来实现它;如果他需要基于队列去执行,那我只需要定义用什么队列来执行。

这是一个通过队列读取 S3 的 ZIP 文件解压缩成 PNG 并上传 S3 的例子,源代码可以点原文看
对于 AWS Lambda 来说,可以抽象为以下配置(这是一个基于 AWS Lambda 的一个框架的配置)。正是这种机制,可以真正的实现函数级别的共享。
3、初始化非常容易
如果要写一个简单的 API 服务,就写一个函数就够了,省去了以前去折腾框架,弄路由、搞一大堆配置,这还不够简单么。
4、FaaS 不确定的缺点:基础和 PaaS 是一致的
如果真算缺点,就是和 PaaS 是类似的:FaaS 对资源的掌控是不够的。但是,PaaS 的缺点导致掌控性是一个较大的问题;而 FaaS 本身函数运行是比较独立的,所有的成本都涵盖在一个函数内,复杂性就大大降低。
还有一个缺点,如果开发一个复杂的应用,函数之间的调用和管理是一个棘手的问题,现在已经有框架在着手解决这些问题,可以看下面相关资源的推荐。
相关资源
现在已经有不少知名服务商提供此类服务,大家的实现各不相同,但是思路是一致的。比如最著名的 AWS Lambda、Azure Functions、Google Cloud Functions、IBM OpenWhisk。
如果觉得平台本身复杂性略高,可以通过以下几个框架去玩:APEX、Serverless 等
FaaS,未来的后端服务开发之道的更多相关文章
- Android Studio快速开发之道
概述 现如今开发越来越追求效率和节奏,节省出时间做更多的事情,除了开发技术上的封装等,开发工具的使用技巧也是很重要的,今天就根据自己的经验来给大家介绍一下Android Studio快速开发之道. P ...
- iOS_高效开发之道
iOS_高效开发之道 话不多说, 总结一下个人感觉有利于提高iOS开发效率的几个小技巧. 本文将从下面几方面介绍: Xcode经常使用快捷键 Xcode调试技巧 Objc经常使用代码片段 Xcode插 ...
- 后端系统开发之gflags使用规范
任何好用的工具如果使用不当都会带来不好的后果,gflags也是一样.我遇到过一些gflags的“坑”,还从领导和同事那里获得一些好的想法,整理成7条gflags使用规范.有意识的遵循这些规范,对项目的 ...
- iOS敏捷开发之道,经常使用的宏定义总结
iOS开发中,直接在pch文件里导入宏定义. 在做项目的时候,直接拿过来使用,能够大幅度提高开发速度. 以下是 个人总结的一些宏定义. 假设大家有其它的经常使用的宏定义.欢迎加入.我会定期更新这个bl ...
- [置顶] Android开发之MediaPlayerService服务详解(一)
前面一节我们分析了Binder通信相关的两个重要类:ProcessState 和 IPCThreadState.ProcessState负责打开Binder 驱动,每个进程只有一个.而 IPCThre ...
- Cocos2d-x 3.x游戏开发之旅
Cocos2d-x 3.x游戏开发之旅 钟迪龙 著 ISBN 978-7-121-24276-2 2014年10月出版 定价:79.00元 516页 16开 内容提要 <Cocos2d-x ...
- iOS开发之Socket通信实战--Request请求数据包编码模块
实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...
- JavaEE开发之SpringBoot整合MyBatis以及Thymeleaf模板引擎
上篇博客我们聊了<JavaEE开发之SpringBoot工程的创建.运行与配置>,从上篇博客的内容我们不难看出SpringBoot的便捷.本篇博客我们继续在上篇博客的基础上来看一下Spri ...
- Liferay7 BPM门户开发之10: 通用流程实现从Servlet到Portlet(Part1)
开发目的: 实现通用流程自动化处理(即实现不需要hardcode代码的bpm统一处理后台,仅需要写少量前端html form代码和拖拽设计BPM定义) 既可独立运行或可依托于Liferay或依托其它门 ...
随机推荐
- 2020年的UWP(4)——UWP和等待Request的Desktop Extension
上一篇我们讨论了UWP和Desktop Extension交互中,Desktop Extension执行后立即退出的场景.下图是提到的四种场景分类: 执行后立即退出 等待request,处理完后退出 ...
- 汇编中的inc和dec
原文链接:https://www.cnblogs.com/whzym111/p/6370198.htmlinc 加1指令 dec 减1指令 一.加一指令inc inc a 相当于 add a,1 // ...
- 第5章函数进阶 第5.1节 Python函数的位置参数、关键字参数精讲
前面第二章简单介绍了函数定义的语法,经过后面一系列的学习,函数有必要再次介绍一下相关内容. 一. 关于函数的语法 1. 语法 def 函数名([参数]): 函数文档字符串 函数体 ...
- 【面试】关于get和post两种方法的不同。
最近在面试题和笔试题中经常会看到这道题,所以打算系统的整理一下. 一般标准的答案是这样的. GET在浏览器回退时是无害的,而POST会再次提交请求(浏览器应该告知用户数据会被重新提交). GET产生的 ...
- WebRequest抓取网页数据出现乱码问题
今天项目里突然有个功能用不起来了,本机确实好的 ,这个很无语 不知道为啥 经过写日志发现html 变成了这样的东西,很是头疼,刚开始各种编码转换,发现这并不是编码的问题 后面观察目标网站多了一个gzi ...
- 半夜删你代码队 Day4冲刺
一.每日站立式会议 1.站立式会议 成员 昨日完成工作 今日计划工作 遇到的困难 陈惠霖 做了新规划 开始双人合作 无 侯晓龙 写了第一个例子 开始双人合作 无 周楚池 准备合作 开始双人合作 无 胡 ...
- 理解js浅拷贝和深拷贝
理解深拷贝和浅拷贝之前先了解下js中的基本类型和引用类型 1.基本类型: 在js中,数据的基本类型undefined,null,string,number,boolean,在变量中赋的实际值,基本类型 ...
- 题解-Words
题面 Words 有 \(n\) 天,每天插入一个字符集大小为 \(c\) 长度为 \(l\) 的字符串,求每一天建立 \(\tt Trie\) 树的期望节点数(根节点不算)模 \(998244353 ...
- 前端js实现九宫格模式抽奖(多宫格抽奖)
介绍: 前端九宫格是一种常见的抽奖方式,js实现如下,掌握其原理,不论多少宫格,都可以轻松应对.(代码可复制直接运行看效果). 该案例以四宫格入门,可扩展多宫格,奖品模块的布局可自由设置. <! ...
- Java NIO网络编程demo
使用Java NIO进行网络编程,看下服务端的例子 import java.io.IOException; import java.net.InetAddress; import java.net.I ...