logo

鱼肚的博客

Don't Repeat Yourself

Serverless浅浅谈

Serverless近几年上升趋势比较快,这里简单介绍下它。

什么是Serverless

顾名思义,就是把后端干掉。

后端同学不要紧张。

那为什么要把后端干掉呢?当然是因为少了一半的人力成本(大雾……)


Serverless并不是真的没有Server,毕竟无论如何还是需要有地方存储数据的。它指的是将后端服务“外包”出去,交给一些云服务商来维护。

Serverless分为两种主要的方向,一是BaaS(Backend as a Service),二是FaaS(Function as a Service)。一般来说,我们常听到的Serverless指的都是FaaS。

  • BaaS: 后端完全委托给一个云服务商,不写任何后端代码
  • FaaS: 后端代码自己控制,但是部署和运维都交给云服务商

BaaS

后端完全委托给云服务商,只专注于前端逻辑。

比较常见于移动应用开发,如Firebase,和一些前端单页应用中。

比如说开发一个工具类的移动应用,用户验证等功能可以交给Auth0来管理,可以直接实现对各种第三方服务的接入(如Google登录,微软账号登录等),并且还是按使用量收费的(且有免费额度)。

FaaS

BaaS的好处是使用简单,但是它的定制性比较低,只适用于一些通用的场景,如上面提到的用户验证等。

FaaS在这个方面则更加强大,用户可以编写自己的代码(支持Node.js、Python、Java、Go等),并上传到云服务商。它和传统的后端的区别在于:

  1. 不需要关心应用的部署、伸缩,10个用户和10万个用户,都由云服务商处理。开发者只需要保证业务逻辑正确即可。
  2. 按使用量付费。
  3. 事件驱动

那Serverless究竟有什么好处呢?

PS,各种XaaS的区别

  • IaaS,基础设施为服务。即租赁主机,如vps、aws ec2等都属于此范围。付钱租远程虚拟机,省去机房维护成本和固定资产。
  • PaaS,平台即服务。如使用别人搭建好的K8s平台、云数据库等,各种半成品,省去一部分运维成本。
  • FaaS,函数即服务,直接上传代码,不关心部署细节。省去一部分运维成本和后端研发成本。
  • BaaS,后台即服务,直接使用别人搭建好的后台,解决特定领域的问题。省去一部分后端研发成本。
  • SaaS,软件即服务。直接使用现成的软件,如各种App、网站。

越往下外包的部分越多,可灵活控制的部分越少。

后面介绍的时候,主要以FaaS为主,不特指的情况下,Serverless均指的FaaS。

Serverless的好处

聚集业务

当你有一个极棒的点子,准备开发一个App时,你的状态:

我要改变世界!

img

然而实际上,你可能很快就在开发一些周边功能(如上面提到的用户注册)时,慢慢分散了精力。

img

使用Serverless时,不需要关心这些部署运维上的细节,直接开发逻辑即可。可参考微信小程序中的“小程序·云开发”,即是这种模式。

降低成本

虽然Serverless表面上降低了后端的运维成本(部署、伸缩等),但是它作为一种新模式,同时也带来了一些挑战,需要一批新的人掌握新的技术和架构,所以这方面的成本降低短时间内并不明显。

它的核心成本优势,在于按使用量付费,不用就不付费。

假如一个公司的主要用户都在一个时区内,如中国大陆。那它必然会面临白天业务访问量远大于夜晚的情况,为了能在白天服务好用户不出错,必须要使用足够多的服务器,但是到了晚上没有这么多需求了,这部分机器是不是就闲置了呢?

当然有些公司会利用起来这些闲置的资源:

  1. 晚上做线上压测
  2. 晚上处理批处理任务,如一些报表的导出
  3. 挖矿?

但是大多数的小公司还是做不到这样精细的控制的。

而使用Serverless的时候,它在白天业务量多时,会自动增加实例个数,而在晚上业务量少时,又会自动释放资源。这样成本自然就降低了,不需要绞尽脑汁榨干云服务商了。

从这个方面延伸考虑,部署多套测试环境的成本可能也很低了,可以实现Git中的每一个 branch 或 tag,都能随时建立和销毁一套环境,且成本极低,速度极快。

避免技术掣肘

互联网时代,一个产品的兴起可能是极快速的,如前一段时间特别流行的clubhouse,不到一年有时间,用户增长了1000倍。

image-20210311121451331

面对这样的增长时,业务会不会被技术掣肘呢?

增长时,或者还可以靠不断地追加服务器来支撑。但更可怕的是,万一衰落也快,那公司能否快速截断成本投入,大赚一笔跑路,准备下一个热点呢?

这时Serverless的极强伸缩性就体现出来了,增长无非就是多付点钱,衰落也无非就是少付点钱,不需要人为干预很多,可能只需要配置下使用上限。

从这一点上来说,Serverless可以快速地拥抱变化,适应业务。

Serverless的坏处

凡事有利必有弊,Serverless也有不小的坏处。

开发模式的变更

在Serverless之前,技术上无论怎么变,其实始终都没有摆脱“应用部署在一个服务器上”这种概念。

  • 有了IaaS之后,服务从本地的机房迁移到了云端的虚拟机,但是ssh还是可以用,运维还可以控制主机。
  • 有了PaaS之后,数据库、消息队列等各种服务换成了云端服务,但是使用上和本地没太大区别,只是换个参数地址。服务本身运行在Docker中,但是Docker也是一种特殊的“虚拟机”,所有的一切,在本地系统上还是能够模拟出来的。

但是在FaaS中,事情开始变得不一样了,本地根本没有能力构建一套等同于云服务商的环境出来,最多也只能是部分模拟一部分环境出来。开发和调试,都必须建立在云服务商的系统之上了。

如下的问题就会开始涌现了:

  • 怎么调试我的应用呢?
  • 昨天还好好的,今天怎么就不行了,是云服务商的问题,还是我的问题,怎么排查?
  • 在哪收集日志呢?
  • 怎么看系统监控呢?

种种问题,亟待解决。

与云服务商的绑定

在IaaS、PaaS产品中,云服务商提供的产品是类似的,可平滑迁移的。

假如阿里云的MySQL收费变高了,可以考虑切换到腾讯云,都是用MySQL,没什么不同。

但是在Serverless领域中,没有什么标准化的产品,各个云服务商百花齐放。如AWS中的Lambda、DynamoDB等,都是自家产品,跟其他厂商不兼容,与这些产品相配套的,各个厂商的开发套件,也不尽相同。

这样会给产品带来很大的风险:

  • 云厂商涨价了,要怎么办?
  • 云厂商恶意中止合作,要怎么办?
  • 云厂商开展了和本公司的业务竞争要怎么办?

当然这个问题也在改善,一些平台无关的开发框架,如serverless,逐渐繁荣起来了。另外一些开源的faas服务也在兴起,如openfaas、kubeless等,大的公司可以选择自己搭建faas服务。

如果大量使用Serverless云服务,会不会在以后面临断供的风险?

不会面临华为当前面临的状况。

原因如下:

  1. 有开源的替代品,如openfaas,openwhisk,kubeless等,大公司可自己搭建基础服务。
  2. 国内有多家厂商提供服务,如阿里云、腾讯云都有类似服务

程序分散

使用faas开发的话,产品可能会变得更加分散,比之前的微服务更加散,这会对软件的on-premises带来更大的挑战。如果是开发一些将来需要支持私有化部署的B端产品,就更需要注意了。

新的机遇

尽管Serverless自身有很多缺点,甚至有些是从原理中自带,只能想办法减轻,无法彻底克服的,但是瑕不掩瑜,它的优点还是很让人动心的。

从一个产品的初期到高峰期及至衰败期,技术上无需做大的架构调整,且始终按照使用量付费,这对于小微企业的吸引力是巨大的。目前最大的落地问题,是相关框架和解决方案不够成熟,但是这些是时间能够克服的。

Serverless势必能够在未来大放异彩,承接大量的业务。

那Serverless会带来哪些的机遇和挑战呢?

业务层面

Serverless使得一个人也可以轻松部署一套成熟的应用,而且成本很低。

小微企业在做业务时,可以抹去前端、后端开发的边界,前端直接堆逻辑,后端就写简单的CRUD。

小微企业创业时的技术成本将大大降低。

技术层面

Serverless大规模应用后,会将技术人才重新分类。业务后端开发难度降低,之前的后端人员有一部分会和运维一起开发和维护云服务,另一部分则会和前端一起做业务。后端和前端的边界变得模糊。

这会带来两方面的技术成长机会:

  1. Serverless后端开发,基于一些开源项目,一般使用Go语言。
  2. Serverless应用端框架及解决方案,如serverless 和 serverless components等,以及一些工具库,如DynamoDB中使用的dynamoose等,都是新的机会。