AWS 简单队列服务 (SQS) 提供可靠且可扩展的消息传递解决方案,而 AWS Lambda 提供无服务器计算功能。将这两种服务结合起来可以实现强大的事件驱动架构。在这篇博文中,我们将深入探讨 SQS 和 Lambda 之间的集成,了解消息消费和处理背后的机制。我们将深入研究单独或批量处理消息的可用选项,重点介绍每种方法的优势和注意事项。此外,我们将讨论 Lambda 事件源映射和 SQS 的值得注意的配置,例如批处理大小、批处理窗口、最大并发性和队列可见性超时。我们Oncloud AI通过本文帮助您了解SQS 和 Lambda 集成的强大功能。
了解 SQS 和 Lambda 集成
SQS 和 Lambda 提供了强大的集成,可用于构建可扩展且事件驱动的架构。借助 Lambda 事件源映射,您可以异步处理来自 SQS 队列的消息,从而解耦组件并确保可靠的消息传递。当 Lambda 函数订阅 SQS 队列时,它会使用轮询机制等待消息到达。Lambda 按批处理消息。对于每个批次,Lambda 都会触发一次函数。如果队列中有更多消息,Lambda 可以扩展到 1,000 个并发函数,每分钟最多可添加 60 个函数。成功处理后,Lambda 会自动从队列中删除消息。
使用 Lambda 使用来自 SQS 的消息
使用 SQS 时,您可以单独或批量处理消息。Lambda 事件源映射支持更大的批次,标准 SQS 队列的单个批次最多可容纳 10,000 条消息或 6 MB。相比之下,SDK 限制每个 API 调用最多可容纳 10 条消息。这就是为什么您在使用来自 SQS 的消息时应尽可能使用 Lambda 事件源映射的原因之一。
单独处理消息具有处理速度更快、错误处理更简单的优势。但是,在某些情况下,批处理更合适。当您需要更高的吞吐量、更高的效率或成本优化很重要时,批处理是有益的。
处理单个消息
在 Lambda 中使用单个 SQS 消息相对简单,每条消息都被视为触发 Lambda 函数执行的独立事件。实施适当的错误处理以捕获消息处理过程中可能发生的任何异常或错误仍然很重要。当 Lambda 函数成功处理消息时,Lambda 将自动从队列中删除该消息。但是,如果在函数执行过程中捕获到错误,则该消息将返回到队列以进行进一步处理或重试。这可确保在发生错误时不会丢失消息,并允许正确处理和重新处理失败的消息。
处理批量消息
当 Lambda 处理来自 SQS 队列的一批消息时,这些消息会保留在队列中,但会根据队列的可见性超时暂时隐藏(本博文后面会详细介绍)。如果您的 Lambda 函数成功处理了该批消息,Lambda 会自动从队列中删除这些消息。但是,如果您的函数在处理批消息时遇到错误,该批消息中的所有消息都会重新出现在队列中,使它们再次可见。
为了确保消息不会被多次处理,您有几个选择。首先,您可以配置事件源映射以包含ReportBatchItemFailures
在函数响应中。这允许您在函数代码中处理和跟踪失败的消息,这是处理批处理时的推荐方法。或者,您可以使用名为 DeleteMessage 的 Amazon SQS API 操作在 Lambda 函数成功处理消息时明确从队列中删除消息。使用此 API 操作可确保不会无意中重新处理消息。
我将提供两个示例,说明如何利用 ReportBatchItemFailures 功能返回部分失败的消息,这将确保我们的函数不会多次处理消息。我将通过构建 batchItemFailures 函数响应以及使用Middy中间件来演示如何做到这一点。
值得注意的配置
Lambda 事件源映射
批次大小
批处理大小 ( BatchSize
) 配置决定了每个批处理中发送到 Lambda 函数的记录数。对于标准队列,您可以将批处理大小设置为最多 10,000 条记录。但是,需要注意的是,无论配置了多少条记录,批处理的总大小都不能超过 6 MB。
批处理窗口
批处理窗口 ( MaximumBatchingWindowInSeconds
) 设置确定在调用 Lambda 函数之前收集记录的最大时间(以秒为单位)。请注意,此配置仅适用于标准队列。
最大并发数
最大并发 ( ScalingConfig
) 功能使我们能够为事件源映射设置最大并发调用数,从而消除了之前在 Lambda 中使用保留并发时出现的过度限制所导致的问题。借助此功能,我们可以更好地控制并发,尤其是在使用具有相同功能的多个事件源映射时。
SQS 配置
队列可见性超时
SQS 中的可见性超时 ( VisibilityTimeout
) 是一种设置,用于确定消息在被消费者检索到后在队列中保持不可见状态的时间。当消费者从队列收到一条消息时,在可见性超时期间,该消息将暂时对其他消费者隐藏。如果您选择的批处理窗口大于 0 秒,则必须考虑在队列的可见性超时内增加的处理时间。建议将可见性超时设置为函数超时的至少六倍,再加上批处理窗口 ( MaximumBatchingWindowInSeconds
) 的值。这可确保您的 Lambda 函数有足够的时间处理每一批事件并处理由限制错误导致的潜在重试。例如,如果您的函数超时为 30 秒,批处理窗口为 20 秒。这将设置为 (30 x 6) + 20 = 200 秒。
死信队列 (DLQ)
当 Lambda 无法处理某条消息时,该消息将返回到队列进行重试。但是,为了防止该消息多次添加到队列并导致不必要的 Lambda 资源消耗,建议指定死信队列 (DLQ) 并将失败的消息发送到该队列。要控制失败消息的重试次数,您可以设置Maximum receives
DLQ 的值。一旦某条消息重新添加到队列的次数超过最大接收次数,它将被移动到 DLQ。这样您就可以稍后处理这些失败的消息,而不必在主队列中处理。
结论
总之,SQS 与 Lambda 之间的集成为构建事件驱动架构提供了强大且可扩展的解决方案。通过利用事件源映射、配置批处理以及利用死信队列和可见性超时等值得注意的功能,您可以确保可靠的消息处理并优化资源利用率。采用这种集成可以充分发挥分布式系统的潜力,并创建可轻松扩展的弹性应用程序。
Oncloud AI作为AWS代理商,提供亚马逊云服务,支持亚马逊云服务器AWS代付、AWS迁移、AWS运维托管等服务,如有相关需求可联系Oncloud AI。