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或依托其它门 ...
随机推荐
- 新手上路之JDK8的下载、安装与PATH环境变量的配置
有些东西不常用总是会忘记,所以想把它写下来,方便以后自己想用的时候找得到:同时也进一步加深自己的记忆.接触JAVA的时间不长,言语或内容有不当之处,欢迎大佬们指正. 每一个学习JAVA的人都会经历的过 ...
- CentOS下Python尝试
打印一个爱心 #猴赛雷 print'\n'.join([''.join([('AndyLove'[(x-y)%8]if((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2 ...
- java42
1.Random类 随机生成某个整数 Random r = new Random(); System.out.println(r.nextInt()); 伪随机数:第一次打印为随机,再次运行,数字将保 ...
- vue绑定用户页面
1.vue微博回调空页面 微博回调空页面为: http://127.0.0.1:8888/oauth/callback/ 1.1 页面路径 components\oauth.vue <templ ...
- C#数据结构-二叉树-顺序存储结构
什么是二叉树:每个树的节点只有两个子树的树形结构. 为什么使用顺序存储结构:使用数组存放满二叉树的各结点非常方便,可以根据一个结点的索引号很容易地推算出它的双亲.孩子.兄弟等结点的编号,从而对这些结点 ...
- 区块链学习7:超级账本项目Hyperledger与Fabric以及二者的关系
☞ ░ 前往老猿Python博文目录 ░ 一.超级账本(hyperledger) 超级账本(hyperledger)是Linux基金会于2015年发起的推进区块链数字技术和交易验证的开源项目,成员包括 ...
- 第十一章 Python 支撑正则表达式处理的re模块
re模块是Python中支持正则表达式处理的模块,老猿学了之后,发现这部分内容太多,要表述清楚需要开单章才能写清楚,但老猿觉得re模块的使用对多数人来说要通过教程学习去熟练掌握很难,需要经常接触练习加 ...
- PyQt(Python+Qt)学习随笔:model/view架构中支持QListView列表中展示图标的两种方法
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在QListView列表视图中的项不但可以展示文字,也可以展示图标和复选框,同时可以指定项是否可以拖 ...
- element ui中表单循环项的校验
注意:prop是动态的
- js数组去重方法集合
//第一种方法,新建一个空数组,将原来的数组循环逐个与新数组的成员做比较,如果新数组没有该元素就push进来 var arr = ['a', 1, 1, 1, 2, 4, 4, 'b', 'c', ' ...