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等),并上传到云服务商。它和传统的后端的区别在于:
- 不需要关心应用的部署、伸缩,10个用户和10万个用户,都由云服务商处理。开发者只需要保证业务逻辑正确即可。
- 按使用量付费。
- 事件驱动
那Serverless究竟有什么好处呢?
PS,各种XaaS的区别
- IaaS,基础设施为服务。即租赁主机,如vps、aws ec2等都属于此范围。付钱租远程虚拟机,省去机房维护成本和固定资产。
- PaaS,平台即服务。如使用别人搭建好的K8s平台、云数据库等,各种半成品,省去一部分运维成本。
- FaaS,函数即服务,直接上传代码,不关心部署细节。省去一部分运维成本和后端研发成本。
- BaaS,后台即服务,直接使用别人搭建好的后台,解决特定领域的问题。省去一部分后端研发成本。
- SaaS,软件即服务。直接使用现成的软件,如各种App、网站。
越往下外包的部分越多,可灵活控制的部分越少。
后面介绍的时候,主要以FaaS为主,不特指的情况下,Serverless均指的FaaS。
Serverless的好处
聚集业务
当你有一个极棒的点子,准备开发一个App时,你的状态:
我要改变世界!
然而实际上,你可能很快就在开发一些周边功能(如上面提到的用户注册)时,慢慢分散了精力。
使用Serverless时,不需要关心这些部署运维上的细节,直接开发逻辑即可。可参考微信小程序中的“小程序·云开发”,即是这种模式。
降低成本
虽然Serverless表面上降低了后端的运维成本(部署、伸缩等),但是它作为一种新模式,同时也带来了一些挑战,需要一批新的人掌握新的技术和架构,所以这方面的成本降低短时间内并不明显。
它的核心成本优势,在于按使用量付费,不用就不付费。
假如一个公司的主要用户都在一个时区内,如中国大陆。那它必然会面临白天业务访问量远大于夜晚的情况,为了能在白天服务好用户不出错,必须要使用足够多的服务器,但是到了晚上没有这么多需求了,这部分机器是不是就闲置了呢?
当然有些公司会利用起来这些闲置的资源:
- 晚上做线上压测
- 晚上处理批处理任务,如一些报表的导出
- 挖矿?
但是大多数的小公司还是做不到这样精细的控制的。
而使用Serverless的时候,它在白天业务量多时,会自动增加实例个数,而在晚上业务量少时,又会自动释放资源。这样成本自然就降低了,不需要绞尽脑汁榨干云服务商了。
从这个方面延伸考虑,部署多套测试环境的成本可能也很低了,可以实现Git中的每一个 branch 或 tag,都能随时建立和销毁一套环境,且成本极低,速度极快。
避免技术掣肘
互联网时代,一个产品的兴起可能是极快速的,如前一段时间特别流行的clubhouse,不到一年有时间,用户增长了1000倍。
面对这样的增长时,业务会不会被技术掣肘呢?
增长时,或者还可以靠不断地追加服务器来支撑。但更可怕的是,万一衰落也快,那公司能否快速截断成本投入,大赚一笔跑路,准备下一个热点呢?
这时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云服务,会不会在以后面临断供的风险?
不会面临华为当前面临的状况。
原因如下:
- 有开源的替代品,如openfaas,openwhisk,kubeless等,大公司可自己搭建基础服务。
- 国内有多家厂商提供服务,如阿里云、腾讯云都有类似服务
程序分散
使用faas开发的话,产品可能会变得更加分散,比之前的微服务更加散,这会对软件的on-premises带来更大的挑战。如果是开发一些将来需要支持私有化部署的B端产品,就更需要注意了。
新的机遇
尽管Serverless自身有很多缺点,甚至有些是从原理中自带,只能想办法减轻,无法彻底克服的,但是瑕不掩瑜,它的优点还是很让人动心的。
从一个产品的初期到高峰期及至衰败期,技术上无需做大的架构调整,且始终按照使用量付费,这对于小微企业的吸引力是巨大的。目前最大的落地问题,是相关框架和解决方案不够成熟,但是这些是时间能够克服的。
Serverless势必能够在未来大放异彩,承接大量的业务。
那Serverless会带来哪些的机遇和挑战呢?
业务层面
Serverless使得一个人也可以轻松部署一套成熟的应用,而且成本很低。
小微企业在做业务时,可以抹去前端、后端开发的边界,前端直接堆逻辑,后端就写简单的CRUD。
小微企业创业时的技术成本将大大降低。
技术层面
Serverless大规模应用后,会将技术人才重新分类。业务后端开发难度降低,之前的后端人员有一部分会和运维一起开发和维护云服务,另一部分则会和前端一起做业务。后端和前端的边界变得模糊。
这会带来两方面的技术成长机会:
- Serverless后端开发,基于一些开源项目,一般使用Go语言。
- Serverless应用端框架及解决方案,如serverless 和 serverless components等,以及一些工具库,如DynamoDB中使用的dynamoose等,都是新的机会。