Serverless(无服务器架构)是最近两年云计算领域的热门概念,很多公司都在尝试,面试的时候也经常被问到。
我最近换工作,面试了几家公司,被问到了很多关于Serverless的问题,从基础概念,到优缺点,到适用场景,到实际问题,都有涉及。今天来整理一下,分享给大家,希望对正在准备面试的朋友有帮助。
一、什么是Serverless
第一个问题,也是最基础的问题:什么是Serverless?
这个问题,看起来简单,但是要回答好,并不容易。很多人会说,Serverless就是没有服务器,不需要管理服务器。但是这个回答,不够准确,也不够全面。
准确地说,Serverless(无服务器架构)是一种云计算架构模式,开发者不需要管理服务器,只需要编写业务逻辑代码,部署到云平台上,云平台会自动分配资源、运行代码、弹性扩展、按需计费。
这里要注意,Serverless不是真的没有服务器,而是开发者不需要关心服务器,服务器由云平台来管理,开发者只需要关心业务逻辑。
Serverless主要包含两部分:FaaS(Function as a Service,函数即服务)和BaaS(Backend as a Service,后端即服务)。
FaaS,就是把业务逻辑封装成一个个函数,部署到云平台上,每个函数独立运行,独立扩展,按需执行,按需计费。比如AWS Lambda、阿里云函数计算、腾讯云SCF、Azure Functions等,都是FaaS平台。
BaaS,就是把后端的通用功能,封装成服务,直接调用,不需要自己开发和运维。比如数据库服务、存储服务、消息队列服务、用户认证服务、API网关等,都是BaaS。开发者可以直接调用这些服务,不需要自己搭建和维护,大大提高了开发效率。
所以,完整的Serverless架构,是FaaS+BaaS,函数负责业务逻辑,BaaS负责后端通用服务,两者结合,构成完整的无服务器架构。
回答这个问题的时候,要把Serverless的定义、核心组成(FaaS和BaaS)、特点(不需要管理服务器、按需执行、弹性扩展、按需计费)都说清楚,这样才全面。
二、Serverless的核心概念
面试的时候,经常会问到Serverless的核心概念,比如FaaS、BaaS、事件驱动、冷启动、按需计费等。
1. FaaS(Function as a Service,函数即服务)
FaaS是Serverless的核心,就是把业务逻辑封装成一个个函数,部署到云平台上,每个函数独立运行,独立扩展,按需执行,按需计费。
FaaS的特点:
- 事件驱动:函数由事件触发执行,比如HTTP请求、消息队列消息、定时任务、文件上传等,没有事件的时候,函数不运行,不占用资源。
- 无状态:函数是无状态的,每次执行都是独立的,不保存状态,状态需要保存在外部的存储中,比如数据库、缓存等。
- 弹性扩展:云平台会根据请求量,自动扩展函数的实例数量,请求多的时候,自动增加实例,请求少的时候,自动减少实例,甚至缩减到零,不需要手动管理。
- 按需计费:按照函数的执行次数和执行时间计费,不执行不收费,成本很低,而且能精确到毫秒级计费。
- 多语言支持:支持多种编程语言,比如Node.js、Python、Java、Go、C#等,开发者可以用自己熟悉的语言开发。
2. BaaS(Backend as a Service,后端即服务)
BaaS,就是把后端的通用功能,封装成服务,直接调用,不需要自己开发和运维。
常见的BaaS服务:
- 数据库服务:比如AWS DynamoDB、阿里云表格存储等,NoSQL数据库,自动扩展,按需计费。
- 存储服务:比如AWS S3、阿里云OSS等,对象存储,用来存文件、图片、视频等。
- 消息队列服务:比如AWS SQS、阿里云消息队列等,用来做异步通信、解耦、削峰填谷。
- 用户认证服务:比如AWS Cognito、阿里云账号登录等,用来做用户注册、登录、认证、授权。
- API网关:比如AWS API Gateway、阿里云API网关等,用来做API的路由、鉴权、限流、监控等。
- 其他服务:比如邮件服务、短信服务、日志服务、监控服务等。
BaaS的特点:
- 开箱即用:不需要自己搭建和运维,直接调用,大大提高开发效率。
- 自动扩展:云平台自动管理资源,自动扩展,不需要关心容量和性能。
- 按需计费:按照使用量计费,用多少付多少,成本低。
- 高可用:云平台提供高可用的服务,有备份和容灾,不需要自己关心可用性。
3. 事件驱动
事件驱动是Serverless的核心特性之一,函数由事件触发执行,没有事件的时候,函数不运行,不占用资源。
常见的事件源:
- HTTP请求:通过API网关,把HTTP请求转化为事件,触发函数执行。
- 消息队列:消息队列收到消息,触发函数执行,做异步处理。
- 定时任务:按照设定的时间,定时触发函数执行,比如每天凌晨执行一次。
- 文件上传:对象存储收到文件上传,触发函数执行,比如图片上传后,自动生成缩略图。
- 数据库变更:数据库的数据发生变更,触发函数执行,比如数据插入后,自动做索引。
- 其他事件:比如IoT设备消息、日志事件、自定义事件等。
事件驱动的好处:
- 按需执行:只有事件发生的时候,函数才执行,没有事件不执行,不占用资源,成本低。
- 解耦:事件源和函数解耦,事件源只负责发布事件,不需要关心谁来处理,怎么处理,系统更灵活,更容易扩展。
- 异步:事件驱动天然支持异步,事件发布后,不需要等待处理结果,就能返回,系统响应更快,吞吐量更高。
4. 冷启动
冷启动是Serverless的一个重要概念,也是一个常见的问题。
冷启动,就是函数第一次被调用的时候,云平台需要创建函数的运行环境,下载代码,启动进程,初始化运行时,然后才能执行函数代码。这个过程,需要一定的时间,从几百毫秒到几秒不等,取决于函数的语言、代码大小、依赖库等。
冷启动会导致函数的第一次调用响应时间变长,影响用户体验。
和冷启动对应的是热启动,就是函数的运行环境已经创建好了,已经在运行了,再次调用的时候,直接执行代码,不需要创建环境,响应时间很短,和普通的服务差不多。
为了减少冷启动的影响,可以采取一些措施:
- 减少代码大小和依赖库,让函数的包更小,下载更快,启动更快。
- 选择启动快的语言,比如Node.js、Python,比Java、C#启动快。
- 预留实例,或者叫预热,定期调用函数,让函数的环境保持活跃,不被销毁。
- 用Provisioned Concurrency(预留并发),云平台提前创建好一定数量的函数实例,一直保持运行,避免冷启动,但是需要额外付费。
回答冷启动的问题的时候,要把冷启动的定义、原因、影响、解决方法都说清楚,这样才全面。
5. 按需计费
按需计费是Serverless的一个重要优势,按照函数的执行次数和执行时间计费,不执行不收费,成本很低。
计费的维度:
- 执行次数:每次函数执行,算一次,按照次数计费。
- 执行时间:函数的执行时间,精确到毫秒级,按照时间计费,时间越长,费用越高。
- 内存配置:函数配置的内存越大,费用越高,因为内存大,对应的CPU、网络等资源也多。
- 其他费用:比如数据传输费用、调用BaaS服务的费用等,另外计费。
按需计费的好处:
- 成本低:不执行不收费,而且能精确到毫秒级计费,成本很低,特别是对于流量小、波动大的应用,成本优势很明显。
- 没有闲置成本:不需要预留资源,不需要为闲置的服务器付费,用多少付多少。
- 可预测:成本和使用量成正比,能精确预测成本,不会超支。
但是也要注意,对于流量大、稳定的应用,Serverless的成本,可能比自己买服务器还高,因为按需计费的单价,比预留实例的单价高。所以,要根据应用的流量特点,来选择合适的架构。
三、Serverless的优缺点
面试的时候,Serverless的优缺点,是必问的问题,一定要准备好。
优点:
- 不需要管理服务器: 开发者不需要关心服务器的采购、部署、运维、扩展、安全补丁等,只需要关心业务逻辑,大大减轻了运维的负担,让开发者更专注于业务。
- 弹性扩展: 云平台自动根据请求量,弹性扩展函数的实例数量,请求多的时候,自动增加实例,请求少的时候,自动减少实例,甚至缩减到零,不需要手动管理,能应对突发的流量高峰。
- 按需计费,成本低: 按照函数的执行次数和执行时间计费,不执行不收费,成本很低,特别是对于流量小、波动大的应用,成本优势很明显。而且没有闲置成本,不需要为闲置的服务器付费。
- 开发效率高: FaaS+BaaS,函数负责业务逻辑,BaaS负责后端通用服务,开发者不需要自己开发和运维后端通用功能,比如数据库、存储、消息队列、用户认证等,直接调用BaaS服务,大大提高了开发效率,能快速上线。
- 高可用: 云平台提供高可用的服务,函数自动部署在多个可用区,有故障自动转移,BaaS服务也有备份和容灾,可用性很高,不需要自己关心高可用。
- 多语言支持: 支持多种编程语言,比如Node.js、Python、Java、Go、C#等,开发者可以用自己熟悉的语言开发,不需要学习新的语言。
- 易于集成: 能很方便地和云平台的其他服务集成,比如数据库、存储、消息队列、AI服务等,构建复杂的应用。
缺点:
- 冷启动问题: 函数第一次调用的时候,有冷启动,响应时间变长,影响用户体验。虽然可以通过一些措施减少冷启动的影响,但是不能完全消除。
- 执行时间限制: 函数的执行时间有限制,比如AWS Lambda最多执行15分钟,阿里云函数计算最多执行24小时(需要申请),不适合长时间运行的任务,比如大数据处理、视频转码等。
- 内存和资源限制: 函数的内存和资源有限制,比如AWS Lambda的内存最大是10GB,CPU和网络资源和内存成正比,不适合需要大量资源的任务,比如高性能计算、大内存应用等。
- 调试和测试困难: Serverless的调试和测试,比传统的应用困难,因为函数运行在云平台上,本地调试需要模拟云平台的环境,而且分布式的函数,调试起来更麻烦。虽然有一些工具和框架能帮助调试,但是还是不如传统应用方便。
- 厂商锁定: 不同的云平台,Serverless的实现和API不一样,函数、事件、BaaS服务,都有平台特定的东西,如果用了平台特定的功能,迁移到其他平台就很困难,存在厂商锁定的问题。虽然可以用一些跨平台的框架,比如Serverless Framework,来减少厂商锁定,但是还是不能完全消除。
- 不适合长连接和有状态的应用: Serverless的函数是无状态的,事件驱动,执行完就结束,不适合长连接的应用,比如WebSocket、实时通信等,也不适合有状态的应用,状态需要保存在外部的存储中,增加了复杂度。
- 监控和排错困难: Serverless的函数是分布式的,执行时间短,实例动态变化,监控和排错比传统应用困难,需要专门的监控和日志工具,而且问题定位起来也比较麻烦。
- 成本不一定低: 对于流量大、稳定的应用,Serverless的成本,可能比自己买服务器还高,因为按需计费的单价,比预留实例的单价高。而且如果函数执行时间长,调用次数多,成本也会很高。
回答优缺点的时候,要分点说,每个点要解释清楚,最好能结合实际的例子,这样更有说服力。
四、Serverless和微服务的区别
面试的时候,经常会问到Serverless和微服务的区别,这个问题,要回答清楚。
首先,Serverless和微服务,不是对立的,而是不同维度的概念。微服务是一种架构风格,把大型应用拆分成小型的、独立的服务,每个服务负责一个业务功能,独立部署,独立扩展。Serverless是一种云计算架构模式,不需要管理服务器,按需执行,弹性扩展,按需计费。
微服务,可以用传统的方式部署,比如用Docker容器,部署在Kubernetes集群上,自己管理服务器;也可以用Serverless的方式部署,每个微服务就是一个或者一组函数,部署在FaaS平台上,不需要管理服务器。
所以,Serverless可以是微服务的一种实现方式,微服务是架构风格,Serverless是部署和运行方式。
具体的区别:
- 粒度不同: 微服务的粒度,一般是一个业务功能,比如用户服务、订单服务、商品服务,每个服务可能包含多个接口,多个函数。Serverless的粒度,一般是一个函数,每个函数负责一个具体的功能,比如创建用户、获取用户信息、更新用户信息等,粒度更细。
- 部署方式不同: 微服务,一般是部署成一个长期运行的服务,比如一个Java进程,一个Node.js应用,一直运行,监听端口,处理请求。Serverless,是部署成一个个函数,事件触发执行,执行完就结束,不长期运行,没有请求的时候,不占用资源。
- 扩展方式不同: 微服务,一般是按照服务的维度扩展,整个服务一起扩展,扩展的单位是服务实例。Serverless,是按照函数的维度扩展,每个函数独立扩展,扩展的单位是函数实例,而且能自动扩展到零,没有请求的时候,不占用资源。
- 计费方式不同: 微服务,一般是按照服务器的资源计费,比如包年包月的服务器,或者按小时计费的云服务器,不管有没有请求,都要付费。Serverless,是按照函数的执行次数和执行时间计费,不执行不收费,成本更低,更精细。
- 运维负担不同: 微服务,需要自己管理服务器,包括部署、运维、扩展、安全补丁、监控等,运维负担重。Serverless,不需要管理服务器,云平台负责运维和扩展,运维负担轻,开发者只需要关心业务逻辑。
- 适用场景不同: 微服务,适合大型的、复杂的、长期运行的应用,特别是流量大、稳定的应用,需要长连接、有状态的应用。Serverless,适合事件驱动、流量波动大、执行时间短的应用,比如API后端、数据处理、定时任务、IoT后端等,不适合长时间运行、长连接、有状态的应用。
回答这个问题的时候,要先说明两者不是对立的,是不同维度的概念,然后再分点说区别,这样才全面。
五、Serverless的适用场景
面试的时候,经常会问到Serverless的适用场景,或者问"什么场景适合用Serverless,什么场景不适合",这个问题,要准备好。
适合的场景:
- API后端: 把API的每个接口,封装成一个函数,通过API网关暴露,处理HTTP请求,适合RESTful API、GraphQL API等。特别是流量波动大的API,Serverless的弹性扩展和按需计费,优势很明显。
- 数据处理: 比如图片处理(生成缩略图、水印、格式转换)、视频处理(转码、截图)、数据ETL(抽取、转换、加载)、日志处理等,事件触发,执行时间短,很适合Serverless。比如图片上传到OSS,触发函数,自动生成缩略图。
- 定时任务: 比如每天凌晨统计数据、生成报表、备份数据、发送邮件等,定时触发函数执行,很适合Serverless,不需要自己搭定时任务服务器,成本低,运维简单。
- IoT后端: IoT设备发送消息,触发函数处理,比如设备数据上报、告警、控制等,事件驱动,流量波动大,很适合Serverless。
- 聊天机器人和AI应用: 比如微信机器人、钉钉机器人、智能客服等,用户发送消息,触发函数处理,调用AI服务(比如语音识别、自然语言处理),返回结果,很适合Serverless。
- Webhooks: 比如GitHub Webhooks、支付回调、第三方系统回调等,第三方系统发送HTTP请求,触发函数处理,很适合Serverless,不需要自己搭服务器,成本低。
- 移动端和小程序后端: 移动端和小程序的后端,一般流量波动大,功能不复杂,很适合用Serverless,开发快,成本低,运维简单。比如微信小程序的后端,用云开发(基于Serverless),很方便。
- 原型和MVP: 做原型、MVP、内部工具的时候,用Serverless,开发快,成本低,不需要运维,能快速上线,验证想法,很适合。
不适合的场景:
- 长时间运行的任务: 函数的执行时间有限制,不适合长时间运行的任务,比如大数据处理、视频转码、深度学习训练等,这些任务,执行时间长,超过了函数的时间限制,而且成本也很高。
- 长连接和实时通信: Serverless的函数是事件驱动,执行完就结束,不适合长连接的应用,比如WebSocket、实时通信、游戏服务器等,这些应用,需要长期保持连接,不适合Serverless。
- 有状态的应用: Serverless的函数是无状态的,状态需要保存在外部的存储中,增加了复杂度和延迟,不适合有状态的应用,比如会话状态多、需要共享内存的应用。
- 流量大且稳定的应用: 对于流量大、稳定的应用,Serverless的成本,可能比自己买服务器还高,因为按需计费的单价,比预留实例的单价高。而且函数的冷启动、执行时间限制等,也会影响性能和体验。
- 需要底层资源控制的应用: 如果应用需要控制底层的资源,比如操作系统、网络、硬件等,Serverless不适合,因为Serverless抽象了底层资源,开发者不能控制。
- 复杂的单体应用: 大型的、复杂的单体应用,不适合直接迁移到Serverless,因为函数的粒度细,需要把应用拆分成很多函数,复杂度高,调试和排错困难,而且成本也可能很高。
回答适用场景的时候,要分适合和不适合,每个场景要解释清楚,为什么适合,为什么不适合,这样才全面。
六、Serverless的常见问题
面试的时候,还会问到Serverless的一些常见问题,比如冷启动、成本、安全、监控等,这里整理一下。
1. 冷启动问题怎么解决?
冷启动是Serverless最常见的问题,解决方法:
- 减少代码大小和依赖库,让函数的包更小,下载更快,启动更快。
- 选择启动快的语言,比如Node.js、Python,比Java、C#启动快。
- 预留实例,或者叫预热,定期调用函数,让函数的环境保持活跃,不被销毁。
- 用Provisioned Concurrency(预留并发),云平台提前创建好一定数量的函数实例,一直保持运行,避免冷启动,但是需要额外付费。
- 把初始化的逻辑,放在函数外面,全局变量里,只初始化一次,后续调用复用,减少每次执行的时间。
- 用更轻量的框架,减少启动时间,比如Node.js用Express,不用Sails.js这种重的框架。
2. Serverless的成本怎么控制?
Serverless的成本控制:
- 优化函数的执行时间,减少不必要的计算,让函数执行更快,成本更低。
- 合理配置内存,内存不是越大越好,因为内存大,费用高,根据函数的实际需求,配置合适的内存。
- 减少函数的调用次数,合并一些函数,减少不必要的调用。
- 用缓存,把常用的数据缓存起来,减少函数的执行和数据库的调用。
- 监控成本,用云平台的成本监控工具,查看函数的成本,优化成本高的函数。
- 对于流量大、稳定的函数,考虑用预留实例,或者传统的部署方式,降低成本。
3. Serverless的安全怎么保证?
Serverless的安全:
- 身份和访问管理(IAM),给函数分配最小权限的角色,只授予需要的权限,不要授予过大的权限。
- 代码安全,编写安全的代码,防止SQL注入、XSS、命令注入等常见的安全漏洞,和传统应用一样。
- 数据加密,敏感数据加密存储,传输过程加密,比如用HTTPS,数据库加密。
- 依赖库安全,定期检查和更新依赖库,防止有已知漏洞的依赖库。
- API网关鉴权,通过API网关暴露的API,要做鉴权,比如API Key、JWT、OAuth等,防止未授权访问。
- 网络安全,用VPC,把函数放在私有网络里,限制函数的网络访问,防止未授权的访问。
- 日志和监控,记录函数的日志,监控函数的运行状态,及时发现和处理安全问题。
4. Serverless的监控和排错怎么做?
Serverless的监控和排错:
- 用云平台的监控工具,比如AWS CloudWatch、阿里云云监控,监控函数的调用次数、执行时间、错误率、内存使用等指标,设置告警,及时发现问题。
- 用日志服务,收集函数的日志,比如AWS CloudWatch Logs、阿里云日志服务,支持搜索和分析,方便排错。
- 用分布式追踪工具,比如AWS X-Ray、阿里云链路追踪,追踪函数的调用链路,查看每个环节的耗时和错误,方便定位性能问题和错误。
- 结构化日志,在函数里打印结构化的日志,包含请求ID、用户ID、错误信息等,方便搜索和分析。
- 本地调试,用Serverless Framework、SAM等工具,在本地模拟云平台的环境,调试函数,减少线上调试的困难。
- 错误处理,在函数里做好错误处理,捕获异常,记录错误日志,返回友好的错误信息,方便排错。
5. 怎么避免厂商锁定?
厂商锁定是Serverless的一个问题,避免方法:
- 用跨平台的框架,比如Serverless Framework,支持多个云平台,用统一的配置和部署方式,减少平台特定的代码。
- 抽象平台特定的功能,把BaaS服务的调用,封装成统一的接口,底层可以切换不同的平台,比如存储服务,封装成统一的接口,底层可以用AWS S3,也可以用阿里云OSS。
- 尽量用标准的功能,少用平台特定的功能,比如用标准的HTTP接口,不用平台特定的事件源,这样迁移的时候,改动小。
- 容器化,把函数打包成容器镜像,用支持容器的Serverless平台,比如AWS Fargate、阿里云容器实例,这样迁移到其他平台,或者自己的Kubernetes集群,比较容易。
- 多云策略,同时用多个云平台,避免依赖单一平台,但是成本和复杂度会增加。
七、面试经验总结
最后,总结一下Serverless面试的经验:
- 基础概念要扎实: Serverless的定义、FaaS、BaaS、事件驱动、冷启动、按需计费等基础概念,要理解清楚,能准确地说出来,这是基础。
- 优缺点要全面: Serverless的优缺点,要分点说,每个点要解释清楚,最好能结合实际的例子,不要只说优点,不说缺点,也不要只说缺点,不说优点,要客观全面。
- 适用场景要清楚: 什么场景适合用Serverless,什么场景不适合,要清楚,能说出为什么,结合实际的业务场景,这样更有说服力。
- 常见问题要有解决方案: 冷启动、成本、安全、监控、厂商锁定等常见问题,要有自己的理解和解决方案,能说出怎么解决,这样显得有实际经验。
- 结合实际项目: 如果有实际的Serverless项目经验,一定要结合实际项目说,比如在项目中怎么用的,遇到了什么问题,怎么解决的,有什么收获,这样比空谈理论更有说服力。
- 了解主流的Serverless平台: 比如AWS Lambda、阿里云函数计算、腾讯云SCF、Azure Functions、Google Cloud Functions等,了解它们的特点和区别,面试的时候可能会问到。
- 了解相关的工具和框架: 比如Serverless Framework、SAM、Zappa等,了解它们的作用和用法,显得对Serverless生态比较熟悉。
- 保持学习的态度: Serverless是一个比较新的技术,发展很快,要表现出对新技术的热情和学习能力,即使有些问题不知道,也可以说自己的理解,以及怎么去学习和解决,不要不懂装懂。
写在最后
Serverless概念面试题:我被问到的那些问题。
以上就是我面试的时候,被问到的关于Serverless的问题,以及我的整理和回答,希望对正在准备面试的朋友有帮助。
Serverless是一个很有前景的架构模式,能让开发者更专注于业务逻辑,不需要关心服务器的运维和扩展,大大提高了开发效率,降低了成本。但是,它也有一些局限性,不是所有场景都适合,需要根据业务需求来选择。
面试的时候,不仅要知道Serverless的概念,还要知道它的优缺点、适用场景、常见问题,最好能结合实际项目经验,这样才能回答得全面,给面试官留下好印象。
当然,Serverless发展很快,新的功能和特性不断出现,我整理的这些,可能不是最新的,也可能有不对的地方,大家参考的时候,要注意甄别,结合最新的资料来准备。
最后,用一句话结尾:
"Serverless不是银弹,但是它是云计算发展的趋势,了解它,掌握它,能让我们在未来的技术发展中,占据主动。"
祝大家面试顺利,都能拿到心仪的offer!
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录