Serverless

Serverless(无服务器)架构

Serverless(无服务器架构)是指服务端逻辑由开发者实现,运行在无状态的计算容器中,由事件触发,完全被第三方管理,其业务层面的状态则存储在数据库或其他介质中。

Serverless 是云原生技术发展的高级阶段,可以使开发者更聚焦在业务逻辑,而减少对基础设施的关注。

下图来自谷歌云平台官网,是对云计算的一个很好的分层概括,其中 serverless 就是构建在虚拟机和容器之上的一层,与应用本身的关系更加密切。

下面将分别从简洁版和进阶版向您展示什么是 Serverless。

简洁版

就像无线互联网实际有的地方也需要用到有线连接一样,无服务器架构仍然在某处有服务器。开发者无需关注服务器,只需关注代码即可。

Serverless(无服务器架构)指的是服务端逻辑由开发者实现,运行在无状态的计算容器中,由事件触发, 完全被第三方管理,而业务层面的状态则记录在数据库或存储资源中。

进阶版

Serverless是由事件(event)驱动(e.g. http,pub/sub)的全托管计算服务。用户无需管理服务器等基础设施,只需编写代码和选择触发器(trigger),(比如rpc请求,定时器等)并上传。其余的工作(实例选择、 扩缩容、部署、容灾、监控、日志、安全补丁等)全部由serverless系统托管。用户只需要为代码实际运行消耗的资源付费——代码未运行则不产生费用。

Serverless相对于serverful,对业务用户强调noserver(serverless并不是说没有服务器,只是业务人员无需关注服务器了,代码仍然是运行在真实存在的服务器上)的运维理念,业务人员只需要聚焦业务逻辑代码。

Serverless相比serverful,有以下3个改变(from Berkeley的总结)

  • 弱化了存储和计算之间的联系。服务的储存和计算被分开部署和收费,存储不再是服务本身的一部分,而是演变成了独立的云服务,这使得计算变得无状态化,更容易调度和扩缩容,同时也降低了数据丢失的风险。
  • 代码的执行不再需要手动分配资源。不需要为服务的运行指定需要的资源(比如使用几台机器、多大的带宽、多大的磁盘等),只需要提供一份代码,剩下的交由serverless平台去处理就行了。当前阶段的实现平台分配资源时还需要用户方提供一些策略,例如单个实例的规格和最大并发数,单实例的最大cpu使用率。理想的情况是通过某些学习算法来进行完全自动的自适应分配。
  • 按使用量计费。Serverless按照服务的使用量(调用次数、时长等)计费,而不是像传统的serverful服务那样,按照使用的资源(ECS实例、VM的规格等)计费。

理解Serverless

许多年前,我们开发的软件还是C/S(客户端/服务器)和MVC(模型-试图-控制器)的形式,再后来有了SOA,最近几年又出现了微服务架构,更新一点的有Cloud Native(云原生)应用,企业应用从单体架构,到服务化,再到更细粒度的微服务化,应用开发之初就是为了应对互联网的特有的高并发、不间断的特性,需要很高的性能和可扩展性,人们对软件开发的追求孜孜不倦,希望力求在软件开发的复杂度和效率之间达到一个平衡。但可惜的是,NO SILVER BULLET!几十年前(1975年)Fred Brooks就在The Mythical Man-Month中就写到了这句话。那么Serverlss会是那颗银弹吗?

云改变了我们对操作系统的认知,原来一个系统的计算资源、存储和网络是可以分离配置的,而且还可以弹性扩展,但是长久以来,我们在开发应用时始终没有摆脱的服务器的束缚(或者说认知),应用必须运行在不论是实体还是虚拟的服务器上,必须经过部署、配置、初始化才可以运行,还需要对服务器和应用进行监控和管理,还需要保证数据的安全性,这些云能够帮我们简化吗?让我们只要关注自己代码的逻辑就好了,其它的东西让云帮我实现就好了。

弊端

Serverless 帮助用户脱离繁冗的开发配置工作,只需关注业务代码逻辑的编写,不用任何的基础设施建设、管理与运维开销。该服务模式降低了研发门槛,提升业务构建效率,获得了大量企业和开发者的支持。

Serverless 虽然是下一代云计算服务形态的趋势,但目前该服务模式并不能完全实现企业复杂的业务系统。其主要有以下几方面的原因:

  • 性能问题。例如同步业务的冷启动延时、高并发的函数实例扩缩容,大规模业务下函数实例的集群管理等。
  • 缺乏成熟的开发者生态。例如,企业和研发若采用无服务,需要用监控、Debug 调试、以及DevOps 等上下游的支持。
  • 学习门槛高。一方面用户需要按照云函数的逻辑对存量业务进行改造,另一方面 Event 数据模型对于 Web 场景不友好,用户更习惯于直接基于 HTTP Request、Response 编写业务代码。

针对目前行业遇到的问题,腾讯云持续探索研究,并发布了下一代无服务器计算平台:腾讯云 Serverless 2.0。

Serverless 2.0 除了解决以上所述的问题之外,还关注用户从本地开发、代码调试、到业务的持续集成、上线运维等整个软件开发生命周期。

围绕 Serverless 产品,腾讯云构建了全面的开发支持、DevOps、运维监控等能力,协助用户可以更好的向 Serverless 架构迁移,使用 Serverless 承载起企业核心业务奠定基石。

Low Latency、不限制运行时长

在 Serverless 2.0 中,我们不仅在控制流和数据流的模块、虚拟化层、网络层、调度层都做了彻底的重构优化,还在安全性、可用性以及性能方面也进行了全面升级。通过采用轻量级虚拟化技术、VPC Proxy 转发方案等多种优化手段使用统一的底层架构。针对实时自动扩缩容核心的能力进行优化,彻底规避了传统无服务器架构中饱受诟病的冷启动问题。

云函数不再限制运行时长,支持更丰富的应用场景。例如:

  • 服务型函数不限制单次请求的时长。当请求持续到来时,服务会保持一个长运行的模式,无温、冷启动时延。
  • 服务型函数支持 WebSocket 长连接。
  • Event Function(触发器函数)具备单次调用时长限制,但在请求持续到来时,服务是保持长运行模式,并无温、冷启动时延。

我的问题

请问 Serverless 起了个 rest api 服务,请求量很大的时候,云函数自动横向扩缩。是只在一个区域里扩缩的吗?还是说根据用户在不同的区域,就近扩缩在附近区域的机器里(例如华南地区、华东地区等)

固定区域

如果去其他区域了,我代码里面配置了内网服务地址会怎么样呢?

– 解决方法 –

云解析 DNS : 分省,多地域部署 serverless

https://cloud.tencent.com/document/product/302/8643

参考