繁体   English   中英

按 SQS 消息数触发 Lambda

[英]Trigger Lambda by number of SQS messages

我有一个 SQS,它将接收大量消息。 消息不断进入队列。

我有一个用例,如果队列中的消息数量达到 X 个(例如 1,000),系统需要触发一个事件来一次处理 1,000 个。

系统会触发一大堆触发器。 每个触发器都有一千条消息。

例如,如果我们有 2300 条消息在队列中,我们期望 3 个触发器到 lambda 函数,前 2 个触发器对应于 1,000 条消息,最后一个将包含 300 条消息。

我正在研究并看到 CloudWatch 警报可以连接到“NumberOfMessageReceived”上的 SQS 指标以发送到 SNS。 但我不知道如何为每 1,000 条消息配置一大块警报。

如果 AWS 可以支持此用例或我们可以为实现此目的进行的任何定制,请告知我。

在此处输入图像描述

因此,在与 OP 对评论部分进行了一些澄清之后,这是我的答案(结合@ChrisPollard 的评论):

用 SQS 实现你想要的是不可能的,因为每个批次最多只能包含 10 条消息。 由于您需要一次处理 1000 条消息,这绝对是不行的。

@ChrisPollard 建议每次将新文件推送到 S3 时在 DynamoDB 中创建一条新记录。 这是一个非常好的方法。 每次将分区键递增 1 并通过DynamoDB Streams触发 lambda。 在您的函数上,对您的分区键运行检查,如果它等于 1000,则对您的 DynamoDB 表运行一个查询,过滤最后 1000 个更新的项目(您需要在 CreatedAt 字段上使用全局二级索引)。 映射这些项目(或使用Projections )以创建仅包含必要信息的极简 JSON。 就像是:

[
    {
     "key": "my-amazing-key",
     "bucket": "my-super-cool-bucket"
    },
    ...
]

像这样的 JSON 只有 87 个字节长(如果你把方括号从游戏中去掉,因为它们不会重复,你就剩下 83 个字节了)。 如果将其四舍五入到 100 字节,您仍然可以成功地将其作为一个事件发送到 SQS,因为它只有大约 100KB 的数据。

然后让一个 Lambda 函数订阅您的 SQS 队列,最后连接 1000 个文件。

要记住的事情:

  1. 确保您确实在 DynamoDB 中创建了 createdAt 字段。 当它达到 1000 条时,可能已经插入了新项目,所以这样可以确保您正在阅读预期的 1000 条项目。

  2. 在您的 Lambda 检查中,只需运行 batchId % 1000 = 0,这样您就不需要删除任何内容,从而节省了 DynamoDB 操作。

  3. 注意 Lambda 的执行时间。 一次连接 1000 个文件可能需要一段时间才能运行,所以我会运行几个测试并在其上放置 1 分钟的开销。 即,如果通常需要 5 分钟,请将函数的超时设置为 6 分钟。

如果您有新信息要分享,我很乐意编辑我的答案。

您可以在 1k、2k、3k 等处添加警报……但这似乎很笨拙。

你让消息批量处理有什么原因吗? 您可以使此触发器基于事件(当添加队列消息时触发我的 lambda)并摆脱批处理它们的复杂性。

我最近处理了一个非常类似的情况,进程-A 将对象放入 S3 存储桶中,每次它都会在 SQS 中放入一条消息,其中包含密钥和存储桶详细信息,我有一个每小时触发的 lambda,但它可以成为任何触发器,例如您的云手表警报。 以下是您可以对每个触发器执行的操作:

  • 从队列中读取消息,SQS 允许您一次仅读取 10 条消息,并且每次读取消息时,不断将它们添加到 lambda 中的某个列表中,您还可以获得每条消息的收据句柄,您可以使用它删除消息并重复此过程,直到您阅读队列中的所有 1000 条消息。 现在,您可以执行列表上所需的任何操作,并以多种不同方式将其提供给进程 B,例如 S3 中的文件和/或进程 B 可以读取的新队列。

  • 读取消息的替代方法:SQS 允许您一次仅读取 10 条消息,您可以发送可选参数 'VisibilityTimeout':60 将消息从队列中隐藏 60 秒,并且您可以递归读取所有消息,直到您不读取查看队列中的任何消息,同时将它们添加到 lambda 中的列表以处理它们,这可能很棘手,因为您必须根据读取 1000 条消息所需的时间尝试不同的可见性超时值。 一旦您知道您阅读了所有消息,您就可以简单地拥有收据句柄并删除所有这些消息。 您也可以清除队列,但是,您可能会删除在此过程中进入的一些至少未阅读一次的消息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM