我们使用机器学习技术将英文博客翻译为简体中文。您可以点击导航栏中的“中文(简体)”切换到英文版本。
实现 亚马逊云科技 Lambda 错误处理模式
这篇文章由首席云应用程序架构师 Jeff Chen 和高级云应用程序架构师 Jeff Li 撰写
在设计分布式应用程序时,处理错误变得更加重要。如果服务无法处理无效的负载、依赖资源可能不可用或服务可能超时,它可能会失败。可能存在可能导致失败的权限错误。亚马逊云科技 服务提供了许多处理错误情况的功能,您可以使用这些功能来提高应用程序的灵活性。
这篇文章探讨了处理故障的三种用例和设计模式。
概述
Lambda 与
Lambda 与 SNS 和 EventBridge 的集成就是异步调用的例子。例如,SNS 会向 Lambda 发送事件进行处理。当 Lambda 收到事件时,它会将其放在内部事件队列中,并向 SNS 返回已收到消息的确认。另一个 Lambda 进程从内部队列读取事件并调用您的 Lambda 函数。如果 SNS 无法将事件传送到您的 Lambda 函数,则该服务会根据重试策略自动重试相同的操作。
Lambda 与 SQS 的集成使用基于轮询的调用。Lambda 运行一组轮询器,这些轮询器会轮询您的 SQS 队列中是否有消息。轮询者分批读取消息,并每批调用一次您的 Lambda 函数。
你可以在许多场景中应用这种模式。例如,您的运营应用程序可以将销售订单添加到运营数据存储中。然后,您可能需要定期将销售订单加载到您的数据仓库,以便信息可用于预测和分析。操作应用程序可以将已完成的销售作为事件进行批处理,并将其放入 SQS 队列中。然后,Lambda 函数可以处理事件并将完成的销售记录加载到您的数据仓库中。
如果您的函数成功处理了批处理,则轮询器将从 SQS 队列中删除消息。如果未成功处理批处理,则轮询者不会从队列中删除消息。
下表显示了上述 亚马逊云科技 服务的调用类型和重试行为。
亚马逊云科技 service example | Invocation type | Retry behavior |
Amazon API Gateway | Synchronous | No built-in retry, client attempts retries. |
亚马逊 SNS Amazon EventBridge |
Asynchronous | Built-in retries with exponential backoff. |
Amazon SQS | Poll-based | Retries after visibility timeout expires until message retention period expires. |
基于轮询的调用类型和异步调用类型可以使用多种设计模式来保留失败的消息以进行额外处理。这些模式可以帮助您从交付或处理失败中恢复。
您可以通过使用使用 Python 的
基于 Lambda 民意调查的调用模式
将 Lambda 与 SQS 配合使用时,如果 Lambda 无法处理消息并且消息保留期到期,则 SQS 会删除该消息。无法处理消息可能是由于函数处理失败所致,包括超时或有效负载无效。当目标函数不存在或权限不正确时,也可能发生处理失败。
您可以在源队列 上配置单独的
以下内容显示了配置 Lambda 以轮询来自 SQS 队列的事件并调用 Lambda 函数时的设计模式。
要探索这种模式,请
Lambda 异步调用模式
对于异步调用,使用 Lambda 时需要考虑两个故障方面。事件源无法将消息传送到 Lambda,并且在处理事件时出现 Lambda 函数错误。
事件源处理向 Lambda 传送消息的失败的方式各不相同。如果 SNS 或 EventBridge 在用尽所有重试尝试后无法将事件发送到 Lambda,则该服务会删除该事件。您可以在 SNS 主题或 EventBridge 事件总线上配置 DLQ 来保存丢弃的事件。这与 SQS 基于轮询的调用模式的工作方式相同。
然后,Lambda 函数可能会由于输入负载语法错误、持续时间超时或函数抛出异常(例如数据资源不可用)而出错。
对于异步调用,您可以配置 Lambda 在其内部队列中保留事件的时长,最多 6 小时。您还可以配置函数出错时 Lambda 重试的次数,介于 0 和 2 之间。当超过最大期限或所有重试尝试都失败时,Lambda 会丢弃该事件。要保留丢弃事件的副本,您可以在 Lambda 函数配置中配置 DLQ,或者最好配置失败事件
Lambda 目标允许您指定异步调用成功或失败后下一步要做什么。您可以配置目标以将调用记录发送到 SQS、SNS、EventBridge 或其他 Lambda 函数。目的地是故障处理的首选,因为它们支持其他目标并包含其他信息。DLQ 保存原始失败事件。有了目标,Lambda 还会在调用记录中传递函数响应的详细信息。这包括堆栈跟踪,这对于分析根本原因可能很有用。
同时使用 DLQ 和 Lambda 目的地
你可以在许多场景中应用这种模式。例如,您的许多应用程序可能包含客户记录。为了遵守《
以下内容显示了将 SNS 主题配置为 Lambda 函数的事件源时的设计模式,该函数使用目标队列进行成功和失败处理。
您可以在 SNS 主题上配置 DLQ 以捕获 SNS 无法传送到 Lambda 的消息。当 Lambda 调用该函数时,它会将成功处理的消息的详细信息发送到成功的 SQS 目的地。对于更简单的用例,您可以使用此模式将事件路由到多个服务。对于协调多项服务,
Lambda 还可以将未成功处理的消息的详细信息发送到失败时的 SQS 目的地。
这种模式的一种变体是将 SQS 目标替换为 EventBridge 目的地,以便多个使用者可以根据目的地处理事件。
使用 DLQ
尽管目的地是处理函数故障的首选方法,但您可以使用 DLQ 进行探索。
以下内容显示了将 SNS 主题配置为 Lambda 函数的事件源时的设计模式,该函数使用 SQS 队列进行故障处理。
您可以在 SNS 主题上配置 DLQ 以捕获 SNS 无法传送到 Lambda 函数的消息。您还可以为 Lambda 函数配置单独的 DLQ。Lambda 在最大重试尝试次数后无法处理失败的事件后,Lambda 将该事件保存到此 DLQ。
结论
这篇文章解释了可用于设计弹性事件驱动的无服务器应用程序的三种模式。事件处理期间的错误处理是设计无服务器云应用程序的重要组成部分。
您可以部署存储库中的代码,以探索如何使用基于轮询的调用和异步调用。查看基于轮询的调用如何向 DLQ 发送失败消息。查看如何使用 DLQ 和 Lambda 目的地来路由和处理不成功的事件。
详细了解
*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。