传统的 Web 应用部署和运维需要开发者自行搭建和维护服务器,但是随着 Serverless 的出现,开发者可以将重心转移到代码的编写和业务逻辑的实现上,而不必再考虑服务器的运维问题。Serverless 对开发者来说带来了很多便利,但是这也带来了新的问题。在 Serverless 开发中需要特别注重以下问题。
1. 无状态
Serverless 平台中的函数是无状态的,也就是说每个请求都是独立的,函数之间不共享任何状态。为了实现状态的共享,需要使用外部存储,如 Redis 或数据库等。对于业务场景中不能采用无状态架构的场景,需要从业务角度出发进行设计和实现,保证系统的稳定性和可靠性。
2. 冷启动
由于 Serverless 平台使用的是按需计费的方式,因此如果函数长时间未被访问,平台就会自动释放函数的资源,以节省成本。而下次请求到来时,需要重新启动函数,这个过程就叫做冷启动。冷启动会带来显著的性能损失,因此需要保证函数的稳定性和可用性,可以采用以下方式来避免或减轻冷启动的影响。
2.1. 使用预热
预热是指在实际请求到来之前,人工触发函数,提前占用计算资源,加速后续的请求响应时间。例如,在定时任务中定时触发函数,或者手动发起一些请求来触发函数等。
2.2. 使用保温功能
一些 Serverless 平台提供了保温功能来缓解冷启动的性能影响。保温功能可以在冷启动之后保留一定时间的函数运行环境,以便后续请求能够快速响应。
2.3. 使用较小的函数包
函数包的大小也会影响冷启动的性能。较小的函数包需要的资源更少,因此冷启动时间更短。建议将函数代码和依赖包进行拆分,以减小函数包的大小。
3. 多种运行时环境
Serverless 平台支持多种语言和运行时环境,如 Node.js、Python、Java、Go 等。在进行 Serverless 开发时需要考虑不同语言和运行时环境之间的差异。例如,Java 程序需要进行 JVM 的启动,因此启动时间可能会比 Node.js 和 Python 长。建议选择合适的运行时环境来适应业务需求。
4. 函数调用方式
在 Serverless 开发中,函数可以通过 HTTP 请求或事件触发器来调用。事件触发器可以是消息队列、对象存储等服务。不同的函数调用方式对性能和资源消耗都有差异。例如,使用 HTTP 请求会比事件触发器消耗更多的资源,因此应该选择合适的函数调用方式来获得更好的性能和资源利用。
5. 安全性
在进行 Serverless 开发时需要特别注意安全性问题。由于 Serverless 平台是基于云服务的,安全性问题需要使用云服务提供的安全机制进行保护。例如,通过为函数分配合适的 IAM 角色来限制其访问范围、使用密钥来保护敏感数据等。同时,开发者也需要自行设计合适的安全机制来保障数据的安全性和系统的稳定性。
示例代码
以下是一个使用 AWS Lambda 和 API Gateway 实现的 Node.js 函数示例,用于查询目标 IP 地址的地理位置信息。
代码实现
-- -------------------- ---- ------- ----- ------- - ------------------- ----- -------------- - -------- -- ------- -- -- ----- ------------------ - -------- -- ------- ----- --------------- - ------- -------- --------- -- - ----- -- - ------------------------------- -- ---- --- ----- --- - -------------------------------------------------- ----- ---- - - ----------------- ----------------------- ----- ------- - - ---------------- ------ ---------------------------------------- -- -- ---- ------------- --------- ------- --------- ----- -- - -- ------- - -------------- ------------ ---- ----- ------------------------ ------- ----------- - ---- - ----- ---- - ----------------- -------------- ------------ ---- ----- ------------------------ ---------- --------- - --- --
API 配置
使用 API Gateway 将上述函数转换为一个 HTTP API。
- HTTP Method:GET
- URL:/location
- Query String:ip
- Lambda 函数名称:get-location
IAM 角色配置
为 Lambda 函数分配一个 IAM 角色,限制函数的访问权限。
- AWSLambdaBasicExecutionRole:允许函数访问 CloudWatch Logs 和 X-Ray 等日志和调试服务。
- AmazonSSMReadOnlyAccess(可选):允许函数访问 SSM Parameter Store 等服务。
安全性配置
通过 API Gateway 配置 VPC 连接来限制函数只能从 VPC 内访问,使用 KMS 对参数进行加密保护。
总结
Serverless 开发可以让开发者更加专注于应用开发本身,而避免了服务器部署和管理的烦恼。但是 Serverless 开发也带来了新的问题和挑战,需要开发者专注于技术细节和业务优化。在实践中,开发者需要从多方面考虑,从而在 Serverless 开发中获得最佳的性能和资源利用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f480fff6b2d6eab3d7d172