AWS Lambda 案例分析
优质博文:IT-BLOG-CN
一、什么是函数式编程
函数式 + 云服务 = Function as a Service(Fass)
什么是函数式编程
当我们讨论函数式编程(Functional Programming, FP)时,我们谈论的是一种编程范式,它强调使用函数来构建软件。在函数式编程中,计算被视为对数据的一系列函数应用,而状态和可变数据被避免。这种范式源于数学中的 λ 演算(lambda calculus),它提供了一种形式化的框架,用以表达计算过程。函数式编程是一种强大的工具,可以帮助我们构建更清晰、更可靠、更高效的软件系统。
核心概念
不可变性(Immutability) 在函数式编程中,一旦数据被创建,它就不能被改变。任何修改都会生成新的数据结构,而不是改变已存在的结构。这减少了程序中的错误,特别是在并发环境中,因为没有必要担心数据在多个线程间的同步问题。
平时在编写代码的时候,是否对 immutable 格外关注过吗?请举一个由于没有 immutable programming 导致出的生产事件。
纯函数(Pure Functions) 纯函数是函数式编程的核心。一个函数如果给定相同的输入,永远会返回相同的输出,并且不会产生任何副作用(即不会改变系统的状态)。这使得程序更易于理解和预测,也更容易测试和维护。
函数组合(Function Composition) 函数式编程鼓励将小的、具有专一功能的函数组合成更复杂的函数。这种模块化的方法不仅提高了代码的复用性,而且增加了代码的清晰度和可维护性。
高阶函数(Higher-Order Functions) 这些是可以接受其他函数作为参数或将函数作为结果返回的函数。高阶函数是非常强大的工具,因为它们可以用于生成或修改行为。
与传统的命令式编程(例如面向对象编程)相比,函数式编程提供了一种更抽象的方法来思考软件。在命令式编程中,我们会详细描述程序应如何执行每一个步骤来改变其状态。而在函数式编程中,我们更多地描述数据之间的关系,以及数据如何通过函数流转变换。
平时在编写代码的时候,有使用高阶函数吗?
组成架构
函数式编程的优势
1、可预测性和可理解性:由于使用纯函数,使得函数式代码更容易推理和预测。
2、并发性:不可变性使得函数式程序在并发执行时天然具有优势。
3、调试和测试:纯函数和不可变数据结构简化了调试和单元测试。
应用场景 函数式编程并非万能钥匙,但在需要高度可靠性和可维护性的系统中表现优异,如金融服务、电信网络和复杂的科学计算等。同时,许多现代编程语言,如 JavaScript, Python, 和 Java,都在增加对函数式编程的支持,以利用其带来的好处。
云服务 当谈论云服务时,我们常常会听到两个术语:全托管和非全托管。全托管云服务指云服务提供商负责管理和维护整个云基础架构。在全托管模式下,服务提供商负责服务器的配置、网络设置、安全性、备份和恢复等方面的任务。用户只需要关注应用程序的开发和部署,而不需要担心底层基础设施的管理。例如 AWS S3, SQS, SNS, DynamoDB 等。
非全托管云服务与之相反,将更多的责任和控制权交给用户。
二、Serverless 架构
Serverless 架构是一种构建应用程序的方法,它允许开发者编写和部署代码而不必关心底层的服务器管理。这种架构主要是通过自动化的计算资源分配和缩放,让开发者能够更专注于业务逻辑的开发,而不是服务器的运维和配置。Serverless 架构并不意味着没有服务器,而是服务器的管理和运维完全由云服务提供商处理。
核心特点
事件驱动 Serverless 应用通常是响应事件(如HTTP请求、数据库变动、队列消息)触发的,这些事件会自动启动一个短暂的、隔离的计算过程(函数)来处理这些事件。
自动扩展 Serverless 平台能够根据应用需求自动扩展或缩减计算资源。如果应用负载增加,平台会自动启动更多的函数实例来处理增加的请求;负载减少时,多余的资源会被自动释放。
按需付费 与传统的云服务(如虚拟机)不同,Serverless 架构中,开发者只需为实际使用的计算时间付费,而不需要为持续运行的服务器资源付费。这种计费模式可以显著降低成本,尤其是对于那些运行间歇性或低流量应用的开发者。
挑战与考虑 虽然Serverless架构提供了许多优势,但也存在一些挑战,如冷启动问题(即从无到有启动函数的延迟)、第三方API的依赖性、以及长期运行的任务可能不适合Serverless模型。此外,复杂的应用可能会面临资源限制和调试难题。
三、AWS Lambda 概述
AWS Lambda
AWS Lambda 是 Amazon Web Services 提供的一个核心服务,它定义了无服务器计算的范畴。通过Lambda,开发者可以运行代码来响应各种事件,而无需显式管理底层的服务器硬件或软件。AWS Lambda 是一个事件驱动的计算平台,自动执行代码响应事件,例如改变数据库、新文件上传或用户操作。Lambda 函数可以在几乎任何类型的应用程序或后端服务中使用,而不需要进行任何管理。
核心特性
自动扩展 Lambda 函数根据处理需求自动启动多个实例,从几个请求到数千个并发执行都无需人工干预。这意味着你的应用程序可以根据需要自动缩放,而不会因为资源限制而受阻。
支持多种编程语言 Lambda 支持多种编程语言,包括 Python, Node.js, Java, Go, Ruby, 和 C# 等。这使得开发者可以用他们熟悉的语言来编写函数。
集成 AWS 服务 Lambda 与 AWS 的其他服务深度整合,如 Amazon S3, DynamoDB 和 API Gateway。这些整合使得开发复杂的数据处理工作流程或微服务架构成为可能。
触发器和使用场景 AWS Lambda 可以配置多种类型的触发器,这些触发器定义了何时执行 Lambda 函数。
HTTP 请求通过 API Gateway API Gateway 可以管理成千上万的并发 API 调用,当这些调用发生时,触发 Lambda 函数来处理业务逻辑,如用户数据处理、文件上传等。
文件上传至 S3 触发数据处理 当文件被上传到 Amazon S3 时,Lambda 函数可以自动触发,执行数据转换、图片处理或其他文件分析任务。
DynamoDB 表更新触发业务逻辑 当 DynamoDB 中的数据被更新时,Lambda 函数可以自动执行,进行数据同步、事务日志处理或实时数据分析。
开发和部署流程 开发 Lambda 函数的过程非常简洁。开发者只需要在 AWS Lambda 控制台中编写或上传代码,然后设置触发条件即可。Lambda 也支持本地测试和部署工具,如 AWS SAM (Serverless Application Model) 和 AWS CloudFormation,这些工具帮助开发者在本地环境中模拟 Lambda 函数,然后将其部署到 AWS 云。
安全性 Lambda 通过 AWS 的身份和访问管理(IAM)服务提供安全的访问控制,确保只有授权用户和服务可以执行或管理 Lambda 函数。此外,Lambda 函数运行在 AWS 的独立的沙盒环境中。
总结 AWS Lambda 的好处
1、成本效益:按调用次数和执行时间计费,不用支付空闲资源费用。
2、弹性和可扩展性:自动管理计算资源,按需扩展。
3、维护简便:AWS负责所有底层架构的维护,更新和扩展。
4、快速部署和迭代:易于部署小型更新和新功能。
5、安全性:集成IAM(Identity and Access Management),精细控制访问权限。
实际案例分析
Netflix: AWS Lambda to build rule-based self-managing infrastructure
https://www.simform.com/blog/serverless-aws-lambda-examples/
https://aws.amazon.com/solutions/case-studies/netflix-and-aws-lambda/
https://medium.com/@pradeepkr848115/serverless-technology-in-aws-a-netflix-case-study-6df6ca5bd241
Netflix 案例
Video Processing
When publishers upload thousands of files to Netflix daily, each file needs to be encoded and sorted before being streamed to the user. Once the files get uploaded to S3, Amazon triggers an event calling an AWS Lambda function that splits the video into 5-minute chunks that get encoded into 60 different parallel streams that Netflix needs. Once the last part of the video gets processed, it gets aggregated and deployed using a series of rules and events.
Backup System
Netflix uses AWS Lambda for its backup system. As thousands of files get changed and modified daily, Lambdas are checking if the files need to be backed up, they check the validity and integrity of the files, and if anything fails they can backtrack to the source of the problem and restart the process.
Security
Netflix uses Lambda to validate that each instance is constructed and configured by the system’s rules and regulations. They also use Lambda to create alerts and shut down in the event of unauthorized access.
BMW’s Unified Configurator Platform
https://aws.amazon.com/solutions/case-studies/bmw-unified-configurator-platform/
Amazon Alexa
https://docs.aws.amazon.com/wellarchitected/latest/serverless-applications-lens/alexa-skills.html
AWS Lambda 架构
Container vs Sandbox
AWS Lambda 选择使用 Firecracker (一种沙盒技术)作为其底层技术的主要原因是为了提供更安全、更轻量级且资源效率更高的虚拟化环境。这里有几个关键点:
安全性 Firecracker 采用了微虚拟机(microVMs)的概念,可以在安全性和隔离性方面提供类似传统虚拟机的保护,但却具有更少的开销。这意味着每个函数实例都可以在相互隔离的环境中运行,从而增强了多租户安全性。
轻量级 Firecracker 专为运行在容器和无服务器架构中的函数而设计,它能够在数毫秒内启动新的微虚拟机。这种快速的启动时间非常适合无服务器函数的按需模型,因为它可以快速响应外部事件。
资源效率 Firecracker 使得虚拟化环境的资源使用更加高效,尤其是在处理大量短暂、小规模的计算任务时。它的设计优化了计算资源的使用,这对于需要大规模自动扩展和高密度部署的无服务器计算平台来说至关重要。性能虽然提供高级隔离,Firecracker 还是保持了较低的性能开销,使得无服务器应用能够快速响应并有效地运行,减少了启动延迟和运行时的资源浪费。
适应现代云需求 Firecracker 的设计充分考虑了现代云基础设施中安全、成本和性能的需求,非常适合支持轻量级、高频次的计算任务,如 AWS Lambda 所提供的服务。
AWS 通过选择 Firecracker,进一步优化了 Lambda 服务的运行效率和成本效益,同时提升了安全性和可扩展性。
对比 选择 Firecracker 而不是 Docker 这类容器技术,主要是由于 Firecracker 为无服务器计算提供了更加专注和优化的特性。以下是一些具体的考虑因素:
1、安全性和隔离性: 虽然 Docker 提供了良好的隔离性,但它主要是通过共享主机的操作系统内核来实现容器化的。这种方法在多租户环境下可能会带来潜在的安全风险。相比之下,Firecracker 通过使用微虚拟机提供了与物理隔离相似的安全级别,每个微虚拟机都有自己的内核,这对于需要极高安全性的无服务器架构是非常关键的。
2、启动速度: Docker 容器的启动时间虽然相对较快,但 Firecracker 设计之初就考虑到需要支持极端的可伸缩性和即时的响应性,其微虚拟机可以在毫秒级别启动。这对于无服务器计算中常见的按需启动和短暂计算任务非常重要。
3、资源效率: Firecracker 专门为轻量级虚拟化优化,可以在保持隔离性的同时,极大地减少资源的消耗。与 Docker 相比,Firecracker 在处理大量并发函数调用时能够更有效地管理和优化资源使用。
4、为无服务器环境定制: Firecracker 是专门为无服务器计算和微服务架构设计的,这意味着它能够更好地满足 AWS Lambda 这类服务的特定需求。Docker 虽然灵活且广泛应用于各种环境,但它并非专门为无服务器计算的独特挑战和需求量身定制。
四、冷启动问题
AWS Lambda 的冷启动问题是指在没有运行中实例可供立即使用时,启动新实例所需的时间延迟。解决或减轻冷启动问题可以通过以下几种方法实现:
优化函数配置
1、内存分配:增加 Lambda 函数的内存配置可以提高其执行速度,因为 AWS Lambda 会按比例分配 CPU 功率和其他资源。更多的内存通常意味着更快的启动时间。
2、运行时选择:选择更快启动的运行时(如 Node.js 或 Python)可能会比较慢启动的运行时(如 Java 或 C#)更有优势。
预热函数
1、自动预热:通过定时触发器(例如使用 Amazon CloudWatch Events 或 EventBridge)定期调用 Lambda 函数,确保函数保持“温热”状态,减少冷启动的发生。
2、第三方工具:使用市场上的预热工具或服务(如 AWS Lambda Warmer)来自动管理预热过程。
使用容器映像 部署容器映像使用 AWS Lambda 的容器映像支持,构建优化的容器映像来减少依赖项和包的大小,这可以加快启动时间。
代码优化
1、减少依赖:简化代码和减少外部库的依赖可以减轻启动负担,特别是在编解码器或框架初始化时。
2、延迟加载:实现代码中的延迟加载,即按需加载资源或模块,避免在初始化阶段加载不必要的代码。
使用 Provisioned Concurrency 配置预置并发:AWS Lambda 允许用户配置预置并发,即事先启动一定数量的实例以备不时之需。这样可以确保当请求到达时,已有运行中的实例可供立即使用,从而消除冷启动延迟。
架构调整
1、分解函数:将大型 Lambda 函数分解为多个小型、专一的函数,每个函数只处理特定的任务。较小的函数通常意味着更快的启动时间。
2、异步处理:对于非实时性的处理需求,可以设计为异步处理模式,通过队列或其他事件源触发,从而缓解冷启动对用户体验的影响。
原文地址:https://blog.csdn.net/zhengzhaoyang122/article/details/144325183
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!