在许多情况下,将功能分成不同的函数可以提供更好的性能,还可以使应用程序更易于维护和扩展。但是,Lambda“单体”可能是迁移现有应用程序的有用垫脚石。
单一 Lambda 函数应包含多少功能?
该函数应在微服务中跨 AWS 服务的数据流中执行单一任务。但是,如果功能任务太小,则可能会在应用程序中引起额外的延迟,并导致大量函数的管理开销。函数的确切范围由使用案例确定。
基于 Lambda 的应用程序能否在多个区域运行?
是,许多无服务器服务都为多个区域提供复制和支持,包括 DynamoDB 和 Amazon S3。作为部署管线的一部分,Lambda 函数可以部署在多个区域,并且 API Gateway 可以配置为支持此配置。请参阅此示例架构
Lambda 函数能否按定时计划运行?
是,您可以使用 EventBridge 中规则的计划表达式来触发 Lambda 函数。此格式使用 cron 语法,可以设置为一分钟的粒度。有关示例,请参阅此教程。
Lambda 函数如何在两次调用之间保留状态?
在许多情况下,DynamoDB 表是理想的保留方式,因为它提供低延迟的数据访问,且可以随着 Lambda 服务进行扩展。如果您正在使用此服务,则可以将数据存储在 Amazon EFS for Lambda
什么类型的工作负载适合事件驱动型架构?
事件驱动型架构使用网络在不同的系统之间进行通信,这会引入可变的延迟。对于需要非常低延迟的工作负载(例如实时交易系统),此设计可能不是最佳选择。但是,对于高度可扩展和可用的工作负载,或者流量模式不可预测的工作负载,事件驱动型架构可以提供满足这些需求的有效方法。
为什么 Lambda 服务的函数限制为 15 分钟?
Lambda 函数用于处理事件,而且大多数事件的处理速度非常快 – 通常大多数生产调用不到 1 秒。函数的持续时间是由处理一个事件所花费的时间决定的。虽然有些计算密集型工作负载可能需要几分钟才能完成,但极少数工作负载会需要 15 分钟才能完成。
如果发现需要更长的持续时间,则请确保您的函数代码正在处理单一事件、执行单一任务,并使用本文档中概述的最佳实践。在许多情况下,可以重新设计函数,来处理单一事件并减少处理所需的时间。
为什么具有预留并发的函数无法扩展来满足传入流量?
Lambda 函数的预留并发也会充当最大容量值。提高总并发的软限制不会对此行为造成影响。如果需要具有预留并发的函数来处理更多流量,则可以更新预留并发值,从而提高函数的最大吞吐量。
为什么具有预置并发的函数仍然会出现冷启动?
您可以通过向函数添加 X-Ray 监控,来测量随着 Lambda 纵向扩展的冷启动。使用预置并发的函数不会表现出冷启动行为,因为执行环境是在调用之前准备好的。但是,预置并发必须应用于函数的特定版本或别名,而不是 $LATEST 版本。如果继续看到冷启动行为,则请确保您调用的是配置了预置并发的别名版本。
我的 Lambda 函数最适合使用的运行时是什么?
Lambda 与您所选择的运行时无关。对于简单函数,Python 和 Node.js 等解释性语言提供最快的性能。对于计算更复杂的函数,Java 等编译语言通常初始化速度较慢,但在 Lambda 处理程序中运行速度很快。运行时的选择也受开发人员偏好和语言熟悉度影响。
如何确保 SDK 版本不更改?
随着 AWS 发布新服务和功能,嵌入式 SDK 可能会更改,恕不另行通知。您可以通过创建具有所需特定版本的 Lambda 层锁定 SDK 版本。然后,即使服务中嵌入的版本更改,该函数也始终使用层中的版本。
如何测试基于 Lambda 的应用程序能否扩展来满足预期流量?
为确保应用程序按预期扩展,请在开发过程中使用负载测试来模拟预期的流量级别。
哪些工作负载适合预置并发?
预置并发旨在使函数具有两位数毫秒的响应时间。通常,交互式工作负载从该功能中获益最大。这些是用户发起请求的应用程序(例如 Web 和移动应用程序),并且对延迟最敏感。异步工作负载(例如数据处理管线)经常对延迟不太敏感,因此通常不需要预置并发。
为什么 Lambda 函数未记录任何输出?
如果 Lambda 函数未记录到 CloudWatch,请首先确保调用方正在调用该函数。检查调用服务的日志以及表示事件已触发该函数的任何 CloudWatch 指标。接下来,检查 CloudWatch Logs 中是否有该函数。所有 Lambda 函数都会记录三行,即使函数的自定义代码中没有其他显式日志记录也是如此:

如果尽管调用了该函数,但 CloudWatch 中没有出现任何日志记录,请检查该函数的权限。IAM 角色必须包含日志权限,否则该函数无法向服务写入日志。您可以将 AWSLambdaBasicExecutionRole 策略附加到函数的执行角色,以授予这些权限。