使用 AWS Lambda 函数使用 AWS SQS 队列
Using AWS Lambda Functions to Consume AWS SQS Queues
我正在使用从 SNS 事件触发器触发的 AWS Lambda 函数来使用 SQS 队列。当 Lambda 函数执行时,它从队列中提取 10 条消息,处理它们,再提取 10 条,依此类推 - 直到编码到 Lambda 函数中的特定时间限制(显然少于 5 分钟的最大值) ).
据我了解,由 SNS 事件触发的 Lambda 函数是一对一的,对吗?换句话说,一个 SNS 事件不会触发多个 Lambda 函数(达到最大并发执行限制)。没有基于负载的缩放。
是否有任何其他可能的解决方案,利用 Lambda,让我尽可能地从 SQS 使用 frequently/fast?我曾考虑尝试根据 SQS 队列大小利用 CloudWatch 警报(和 SNS 事件触发器)来自动扩展我的 Lambda 函数,但这些警报似乎最多每 5 分钟触发一次。我还考虑过开发一个主 Lambda 函数,它可以根据查询队列大小自动执行(许多)从属 Lambda。
我了解更优化的设计可能是利用 Kinesis 而不是 SNS。我可能会考虑在未来合并 Kinesis,但让我们假装 Kinesis 目前不是一个选项。
没有最好的方法来做到这一点。一种方法(您已经提到过)是使用 CloudWatch 并将 Lambda 函数安排到每分钟 运行(这是 Lambda 的最短安排时间)。然后,此 Lambda 函数将查找新的 SQS 消息并调用其他 Lambda 函数来处理新消息。这是该用例的一篇非常好的文章:https://cloudonaut.io/integrate-sqs-and-lambda-serverless-architecture-for-asynchronous-workloads/
就我个人而言,对于此用例,我不建议通过 SNS 触发您的 Lambda,因为 SNS 不能完全保证交付并建议将 SNS 通知发送到 SQS - 这不能解决您的问题。来自常见问题解答:
[...] If it is critical that all published messages be successfully processed, developers should have notifications delivered to an SQS queue (in addition to notifications over other transports).
对于这种处理,如果您将消息推送到 Kinesis Stream 而不是 SQS,您应该能够灵活地处理(按所需大小的批次)消息。
注意:如果您使用SQS,在通过SNS(或使用Scheduled Lambda)触发Lambda函数后,它可以调用内部Lambda函数来检查产生多个并发内部Lambda的队列。但是问题是,批量处理SQS项是不现实的。
我正在使用从 SNS 事件触发器触发的 AWS Lambda 函数来使用 SQS 队列。当 Lambda 函数执行时,它从队列中提取 10 条消息,处理它们,再提取 10 条,依此类推 - 直到编码到 Lambda 函数中的特定时间限制(显然少于 5 分钟的最大值) ).
据我了解,由 SNS 事件触发的 Lambda 函数是一对一的,对吗?换句话说,一个 SNS 事件不会触发多个 Lambda 函数(达到最大并发执行限制)。没有基于负载的缩放。
是否有任何其他可能的解决方案,利用 Lambda,让我尽可能地从 SQS 使用 frequently/fast?我曾考虑尝试根据 SQS 队列大小利用 CloudWatch 警报(和 SNS 事件触发器)来自动扩展我的 Lambda 函数,但这些警报似乎最多每 5 分钟触发一次。我还考虑过开发一个主 Lambda 函数,它可以根据查询队列大小自动执行(许多)从属 Lambda。
我了解更优化的设计可能是利用 Kinesis 而不是 SNS。我可能会考虑在未来合并 Kinesis,但让我们假装 Kinesis 目前不是一个选项。
没有最好的方法来做到这一点。一种方法(您已经提到过)是使用 CloudWatch 并将 Lambda 函数安排到每分钟 运行(这是 Lambda 的最短安排时间)。然后,此 Lambda 函数将查找新的 SQS 消息并调用其他 Lambda 函数来处理新消息。这是该用例的一篇非常好的文章:https://cloudonaut.io/integrate-sqs-and-lambda-serverless-architecture-for-asynchronous-workloads/
就我个人而言,对于此用例,我不建议通过 SNS 触发您的 Lambda,因为 SNS 不能完全保证交付并建议将 SNS 通知发送到 SQS - 这不能解决您的问题。来自常见问题解答:
[...] If it is critical that all published messages be successfully processed, developers should have notifications delivered to an SQS queue (in addition to notifications over other transports).
对于这种处理,如果您将消息推送到 Kinesis Stream 而不是 SQS,您应该能够灵活地处理(按所需大小的批次)消息。
注意:如果您使用SQS,在通过SNS(或使用Scheduled Lambda)触发Lambda函数后,它可以调用内部Lambda函数来检查产生多个并发内部Lambda的队列。但是问题是,批量处理SQS项是不现实的。