- Languages supported
-
Fargate: AWS Fargate 是容器的无服务器计算引擎,与亚马逊 ECS 一起用于编排。它支持任何可以打包到 Docker 容器中的编程语言或运行时环境。这种灵活性意味着您几乎可以使用任何适合您的应用程序需求的语言、框架或库。你可以使用Python、、Java、Go Node.js、.NET Ruby、PHP,甚至是自定义语言和环境。只要将它们封装在容器中,Fargate 就可以运行它们。这种广泛的语言支持使 Fargate 成为运行各种应用程序的理想之选。其中包括传统系统、多语言微服务和现代云原生应用程序。
Lambda:与 Fargate 相比,为更有限的语言集 AWS Lambda 提供原生支持。Lambda 函数专为事件驱动的工作负载而构建。Lambda 正式支持以下语言和运行时:
-
Node.js
-
Python
-
Java
-
Go
-
Ruby
-
C#
-
PowerShell
Lambda 还支持自定义运行时。使用自定义运行时,您可以自带语言或运行时环境。但是,与使用本机支持的选项相比,这需要更多的设置和管理。如果您从容器镜像部署 Lambda 函数,则可以在其中写入您的函数。Rust使用 AWS OS-only 基础镜像并在映像中包含Rust运行时客户端。如果您使用没有 AWS提供的运行时接口客户端的语言,则必须创建自己的语言。
- Event-driven invocation
-
Lambda 本质上是为事件驱动计算而设计的。Lambda 函数是根据数据、用户操作或计划任务的变化而触发的。它与许多 AWS 服务原生集成在一起。其中包括亚马逊 S3(例如,在上传文件时调用函数)、DynamoDB(例如,在数据更新时触发)和 API 网关(例如,处理 HTTP 请求)。Lambda 事件驱动架构非常适合需要立即响应事件的应用程序。这些应用程序不需要持久的计算资源。
Fargate 本身并不是由事件驱动的。但是,通过一些额外的样板逻辑,它可以与诸如亚马逊 SQS 和 Kinesis 之类的事件源集成。Lambda 会为您处理大部分集成逻辑。使用 Fargate,你必须使用这些服务的 API 自己实现这种集成。
- Runtime/use cases
-
Fargate 旨在运行容器化应用程序。它提供了灵活的运行时环境,您可以在其中定义容器的 CPU、内存和网络设置。Fargate 在基于容器的模型上运行。它支持长时间运行的进程、持久性服务和具有特定运行时要求的应用程序。Fargate 中的容器可以无限期运行,因为执行时间没有硬性限制。这使其成为需要持续运行的应用程序的理想之选。使用 Fargate 中的容器重启策略,任务中的各个容器可以自动重启,而无需重启整个任务。这提高了多容器工作负载的弹性。Fargate 与 CloudWatch Container Insights 集成,增强了可观察 使用此功能,您可以获得详细的每个容器指标和跟踪记录,以监控应用程序性能。
Lambda 函数针对短期、事件驱动的任务进行了优化。Lambda 函数每次调用的最大执行时间为 15 分钟。这使得 Lambda 函数非常适合文件处理、实时数据流和 HTTP 请求处理等场景。这些任务很简短,不需要长时间运行的进程。
利用 Lambda 中的耐用函数,您可以构建长时间运行的工作流程,这些工作流程可以在多次调用中保持状态长达 1 年。耐用功能提供内置的错误处理、自动重试和故障后恢复。耐用函数 SDK 可用于 JavaScript、 TypeScriptPythonJava、和 C# (.NET)。在等待期间,您的函数会暂停而不会产生计算费用。使用耐用函数,您可以解决以前需要持久计算环境的用例。
在为长时间运行的工作负载选择耐用函数和 Fargate 时,请考虑执行模式。对于将大部分时间花在等待上的工作流程,例如人工批准、计划延迟或外部 API 回调,耐用函数具有成本效益。在等待期间,您不会产生计算费用。Fargate 更适合需要持续计算的工作负载,例如数据处理、持久网络连接或必须不间断地保持活动状态的服务。
在 Lambda 中,运行时环境更加抽象。您对底层基础设施的控制较少。对于标准函数,每次调用都是独立且无状态的。任何需要在两次调用之间保存的状态或数据都必须由外部管理。示例包括数据库或存储服务。
- Scaling
-
Fargate 通过调整正在运行的任务数量来进行扩展。这基于您的容器编排服务 (Amazon ECS) 中定义的所需状态。扩展可以手动完成,也可以通过亚马逊 EC2 自动扩展自动完成。有关更多信息,请参阅 AWS 容器博客上的幕后故事:亚马逊 ECS 和 Fargate 提高任务启动率。
在 Fargate 中,每项任务都在其隔离的环境中运行。扩展包括启动其他任务或根据负载停止任务。Amazon ECS 服务计划程序可以在每项服务不到一分钟的时间内启动多达 500 个任务。这适用于 Web 和其他长时间运行的服务。Amazon ECS 还支持预测性扩展。它使用历史模式在需求激增之前主动增加任务。CPU 和内存利用率的目标跟踪策略支持 20 秒指标分辨率。这样可以更快地检测缩放信号。Amazon ECS 还可以自动在可用区之间重新平衡服务任务。这样可以保持高可用性。Fargate 与 AWS
故障注入服务 (FIS) 集成。使用 FIS,您可以运行受控故障注入实验来测试应用程序弹性。
对于 Lambda 而言,并发性是指您的 AWS Lambda 函数同时处理的正在处理的请求数量。这与 Fargate 中的并发性不同。只要有可用的计算和网络资源,每个 Fargate 任务都可以处理并发请求。对于每个并发请求,Lambda 会预置单独的执行环境实例。随着您的函数收到更多请求,Lambda 会自动扩展执行环境的数量。这种情况一直持续到您达到账户并发上限为止。默认情况下,Lambda 为您的账户提供了 1,000 次并发执行的总并发限制。此限制适用于中的所有函数 AWS 区域。如果需要,您可以请求增加配额。
使用 Lambda 托管实例,扩展的工作原理有所不同。托管实例不是为每个并发请求预置新的执行环境,而是根据 CPU 资源利用率异步扩展。每个执行环境可以处理多个并发调用。这种方法最大限度地提高了资源利用率。它非常适合稳定状态或可预测的工作负载。
对于使用默认计算类型的每个 Lambda 函数,并发扩展率为每 10 秒 1,000 个执行实例。这种情况一直持续到账户的最大并发量。有关更多信息,请参阅 C AWS ompute 博客上的 Lambda 函数现在在处理大容量请求时扩展速度提高了 12 倍。如果 10 秒周期内的请求数超过 1,000,则额外的请求会受到限制。下图演示了假设账户并发量为 7000,Lambda 扩展的工作原理。
- Cold start and cold-start mitigation
-
Lambda 函数可能会经历冷启动。当一个函数在空闲一段时间后被调用时,就会发生这种情况。在冷启动期间,Lambda 服务会初始化新的执行环境。这包括加载运行时、依赖关系和函数代码。冷启动持续时间从低于 100 毫秒到超过 1 秒不等,具体取决于运行时间、包大小和初始化逻辑。对于初始化时间较长的运行时间,例如Java或 C#,如果不进行优化,冷启动可能会更长。冷启动会影响需要低延迟响应的应用程序的性能。
要缓解 Lambda 中的冷启动,请考虑以下策略:
-
最小化函数大小:减小函数包及其依赖关系的大小。这可以减少初始化所需的时间。
-
增加内存分配:更高的内存分配会增加 CPU 容量。这可以减少初始化时间。
-
保持函数温暖:定期调用您的 Lambda 函数(例如,使用 CloudWatch 事件)。这样可以使它们保持活跃状态并降低冷启动的可能性。
-
Lambda SnapStart:使用 Lambda SnapStart for Java 和 .NET 函数来缩短启动时间。Python SnapStart 拍摄初始化执行环境的快照。后续调用将从快照中恢复,而不是执行完全冷启动。
-
预置并发性:此功能可保持指定数量的函数实例处于预热状态,随时准备为请求提供服务。这减少了冷启动延迟。但是,它增加了成本。即使预置实例未积极处理请求,您也需要为这些实例付费。
-
Lambda 托管实例:在各种 EC2 实例类型上运行函数。其中包括处理器等Graviton4和高带宽网络选项。 Pre-provisioned 执行环境消除了冷启动。Lambda 负责处理实例生命周期、操作系统和运行时补丁、路由、负载平衡和自动扩展。Lambda 托管实例还支持每个执行环境的多并发调用。它们提供 EC2 定价优势,例如计算节省计划和预留实例。
Fargate 通常不会像 Lambda 那样受到冷启动的影响。启动 Fargate 任务的时间与从镜像注册表提取任务中定义的容器映像所花费的时间直接相关。Fargate 还支持延迟加载已使用 Seekable OCI (SOCI) 索引的容器镜像。使用 SOCI 延迟加载容器映像可缩短在 Fargate 上启动 Amazon ECS 任务的时间。Fargate 使用 SOCI 索引清单 v2。这为延迟加载提供了更好的性能。在 Fargate 上启动任务后,它是一个长时间运行的过程。它随时准备处理请求。如果您需要启动新任务以响应扩展事件,则在初始化过程中可能会有一些延迟。与 Lambda 冷启动相比,这通常不那么重要。
- Memory and CPU options
-
Fargate 为容器化应用程序提供对内存和 CPU 资源的精细控制。当你在 Fargate 中启动任务时,你可以为应用程序指定确切的 CPU 和内存要求。CPU 和内存分配是独立的。您可以选择最适合您工作量的组合。您可以选择 CPU 值,范围从 0.25 个 vCPU 到 32 个 vCPU。每个任务的内存范围从 0.5 GB 到 244 GB 不等,具体取决于您的配置。
这种灵活性非常适合具有特定性能特征的应用程序。示例包括内存密集型数据库或 CPU-bound 计算任务。Fargate 允许你优化资源分配。您可以有效地平衡成本和性能。
在 Lambda 中,内存和 CPU 是相互关联的。CPU 会根据您选择的内存量按比例自动分配。您可以选择 128 MB 到 10 GB 之间的内存分配,以 1 MB 为增量。CPU 随内存扩展,最多可扩展 6 个 vCPU。更高的内存设置会产生更多的 CPU 功率。但是,您无法直接控制 CPU 分配本身。
该模型是为简单而设计的。无需管理 CPU 配置即可快速调整内存设置。但是,对于需要在 CPU 和内存资源之间实现特定平衡的工作负载,它可能不那么灵活。Lambda 模型适用于您希望根据内存需求直接扩展的任务。对于具有复杂或高度特殊资源需求的应用程序,它可能不是最佳选择。
- Networking
-
当您在 Fargate 中部署任务时,它们会在亚马逊 VPC(亚马逊虚拟私有云)中运行。这使您可以完全控制网络环境。您可以配置安全组、网络访问控制列表 (ACL) 和路由表。每个 Fargate 任务都有自己的网络接口和专用的私有 IP 地址。如果需要,您可以分配公有 IP 地址。
Fargate 支持高级联网功能,例如负载平衡(使用 AWS 弹性负载均衡)、VPC 对等互连以及直接访问 VPC AWS 服务 内其他功能。您还可以使用安全、私密 AWS PrivateLink 的连接来连接受支持者 AWS 服务。这样可以避免遍历互联网。Fargate 任务还支持亚马逊 VPC Lattice。这提供了标准化的服务间连接、安全性和可观察性。Fargate 任务可以在 IPv6-only 配置中运行。这允许任务仅通过 IPv6 进行通信。
默认情况下,Lambda 函数在托管网络环境中运行。您无法直接控制网络接口或 IP 地址。但是,可以使用 AWS Hyperplane 将 Lambda 连接到客户管理的 VPC。这使您能够控制对您的 VPC 内资源的访问权限。
当 Lambda 函数连接到客户管理的 VPC 时,它们会继承 VPC 安全组和子网配置。这使他们能够安全地与同一 VPC 中的其他 AWS 服务
(例如 RDS 数据库)进行交互。由于 Lambda 通过创建许多并发执行环境进行扩展,因此每个环境都维护自己的数据库连接。高并发性可能会耗尽数据库连接限制。要访问关系数据库,请使用 Amazon RDS 代理来池和管理连接。这样可以避免在高并发期间连接耗尽。
Lambda 服务使用网络功能虚拟化平台来提供 NAT 功能。这将 Lambda VPC 连接到客户 VPC。它在创建或更新 Lambda 函数时配置所需的弹性网络接口 (ENI)。它还允许在多个执行环境中共享您账户中的 ENI。这使得 Lambda 能够在函数扩展时更有效地使用网络资源。
ENI 是一种用尽无遗的资源,每个区域的软限制为 250。如果您为 VPC 访问配置 Lambda 函数,请监控弹性网络接口的使用情况。同一个可用区和同一个安全组中的 Lambda 函数可以共享 ENI。如果您提高了 Lambda 中的并发限制,请评估是否需要增加弹性网络接口。如果达到限制, VPC-enabled Lambda 函数的调用就会受到限制。
- Pricing model
-
Fargate 定价基于分配给您的容器的资源。具体而言,这意味着您为每项任务选择的 vCPU 和内存。按秒计费,最低收费一分钟。成本与您的应用程序消耗的资源直接相关。无论应用程序是否在积极处理请求,您都要为预留的资源付费。Fargate 非常适合需要特定资源配置的可预测工作负载。您可以通过调整分配的资源来优化成本。Fargate Spot 可用于 x86 和 ARM-based Linux 工作负载。这为容错应用程序节省了大量成本。相关服务可能会收取额外费用。其中包括数据传输、存储和联网(例如 VPC、弹性负载均衡)。
Lambda 具有不同的定价结构,该结构以事件为导向,按执行量付费。根据请求数量和执行时长向您收费。持续时间以毫秒为单位进行测量。Lambda 还会考虑您分配给函数的内存量。成本根据使用的内存和执行时间而定。定价模式包括免费套餐。它每月提供100万个免费请求和40万 GB-seconds 个计算时间。这使得 Lambda 对于小容量、零星的工作负载特别具有成本效益。
Lambda 定价模型非常适合具有不可预测或突发流量模式的应用程序。您只需为实际的函数调用和执行时间付费。您无需预置闲置容量或为其付费。
借助 Lambda 托管实例,Lambda 提供使用 EC2 定价模型的基于实例的定价。其中包括 On-Demand预留实例和计算节省计划。这可以提高稳定状态或可预测工作负载的成本效率。
Fargate 和 Lambda 都有资格参加计算储蓄计划。这些可以将成本降低多达66%,以换取对稳定的计算使用量的承诺。这是以 1 年或 3 年期的每小时美元计量的。
当您比较两种服务的成本时,通常在较低的流量下使用 Lambda 支付更少的费用。但是,对于持续的高吞吐量工作负载,Fargate 的每秒资源计费往往更经济。随着请求量的增长,Lambda 成本呈线性增长。相比之下,无论在配置的资源内处理什么请求,Fargate 成本都保持相对稳定。