Q66 — AWS SAA-C03 第17章
第 66/89 题 | ← 返回第17章
Q1366. 一位解决方案架构师拥有一个应用程序容器、一个 AWS Lambda 函数和一个 Amazon SQS 队列。Lambda 函数使用 SQS 队列作为事件源。当函数被调用时,Lambda 函数会调用第三方机器学习 (ML) API。第三方 API 的响应最多可能需要 60 秒才能返回。Lambda 函数的超时值当前为 65 秒。解决方案架构师注意到 Lambda 函数有时会处理来自 SQS 队列的重复消息。解决方案架构师应该如何做才能确保 Lambda 函数不会处理重复消息?
- A. 为 Lambda 函数配置更大的内存。
- B. 配置增加 Lambda 函数的超时值。
- C. 将 SQS 队列的交付延迟值配置为大于调用第三方 API 所需的最大时间。
- D. 将 SQS 队列的可见性超时值配置为大于调用第三方 API 所需的最大时间。 ✓
正确答案: D. 将 SQS 队列的可见性超时值配置为大于调用第三方 API 所需的最大时间。
解析
正确答案是 D. 将 SQS 队列的可见性超时值配置为大于调用第三方 API 所需的最大时间。解释:问题在于 Lambda 函数有时会处理来自 SQS 队列的重复消息。这种情况发生在以下情况下:Lambda 函数由 SQS 消息调用。Lambda 函数处理消息所需时间过长(例如,等待缓慢的第三方 API 响应)。如果 Lambda 函数在 SQS 可见性超时到期之前没有从队列中删除消息,则该消息将再次变为可见,并可被另一个 Lambda 调用处理(导致重复)。为什么选项 D 是最佳选择:SQS可见性超时决定消息被 Lambda 函数获取后对其他消费者隐藏多长时间。如果 Lambda 函数在可见性超时之前没有删除消息,SQS 会认为处理失败,并再次显示该消息(导致重复消息)。解决方法:将可见性超时时间设置为大于最大处理时间(包括 60 秒 API 调用时间 + Lambda 函数执行时间)。例如:如果 API 需要 60 秒,而 Lambda 需要 5 秒,则将可见性超时设置为 65 秒以上(例如,70 秒)。防止重复处理确保消息保持隐藏状态,直到 Lambda 函数有机会完成处理并将其删除。其他选项为何错误:A. 为 Lambda 函数配置更大的内存并不能解决重复问题。内存会影响性能,但不会影响消息可见性。与 SQS 消息重传逻辑无关。B. 增加 Lambda 函数的超时值。这只是部分解决方案,单独使用并不足够。如果增加 Lambda 超时时间,但 SQS 可见性超时时间仍然很短,则消息可能在 Lambda 完成之前再次出现。Lambda 超时和 SQS 可见性超时都应该保持一致,但 SQS 可见性超时是关键因素。C. 将 SQS 队列的交付延迟值配置为大于最大 API 调用时间。误解了交付延迟的目的。传递延迟控制消息发送到队列后等待多长时间才使其可用。它不影响消费者取阅消息后的可见性。避免重复的最佳实践:设置 SQS 可见性超时时间大于 Lambda 函数执行时间加上 API 调用时间(例如,本例中为 70 秒)。确保 Lambda 函数在成功处理消息后,使用 DeleteMessage API 从 SQS 中删除该消息。对于反复失败的消息,考虑使用 SQS 死信队列 (DLQ) 以避免无限重试。结论:选项 D 是正确的解决方案,因为调整 SQS 可见性超时可确保消息保持隐藏状态足够长的时间,以便 Lambda 处理它们而不会重新出现。避免选择 A、B 和 C(它们没有解决重复处理的根本原因)。最终答案:D