我有一个SQS,它将接收大量消息,并不断进入队列。
我有一个用例,如果队列中的消息数达到X数(例如1,000),则系统需要触发一个事件来一次处理1,000。
系统将触发一大堆触发器,每个触发器有1000条消息。
例如,如果队列中有2300条消息,则我们希望Lambda函数有3个触发器,第2个触发器与10000条消息相对应,最后一个触发器将包含300条消息。
我正在研究,看到CloudWatch Alarm可以挂钩“ NumberOfMessageReceived”上的SQS指标以发送到SNS。但是我不知道如何为每1000条消息配置大量警报。
请告知我AWS是否可以支持该用例或为实现此目的而进行的任何自定义。
答案 0 :(得分:1)
因此,在使用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队列,然后最终连接这1,000个文件。
注意事项:
确保确实在DynamoDB中创建了createdAt字段。到1000时,可能已经插入了新项目,因此,可以确保已阅读了预期的1000个项目。
在Lambda检查中,只需运行batchId%1000 = 0,这样您就无需删除任何内容即可保存DynamoDB操作。
当心Lambda的执行时间。一次连接1000个文件可能需要一段时间才能运行,因此我将运行一些测试,并在其上增加1分钟的开销。也就是说,如果通常需要5分钟,请将函数的超时设置为6分钟。
如果您有新信息要分享,我们很乐意编辑我的答案。
答案 1 :(得分:0)
您可以在1k,2k,3k等处添加警报,但这似乎很笨拙。
您是否有理由让邮件批处理?您可以使此触发器基于事件(当添加队列消息时触发我的lambda),并摆脱了批处理它们的麻烦。
答案 2 :(得分:0)
最近我处理了一个非常类似的情况,进程A将对象放入S3存储桶中,每次将其放入SQS中的消息中,其中包含密钥和存储桶详细信息,我有一个lambda,该字符串每小时触发一次,但它可以是任何触发因素,例如您的云监控警报。您可以在每个触发器上执行以下操作:
从队列中读取消息,SQS允许您一次仅读取10条消息,并且每次阅读消息时,将它们不断添加到lambda中的某些列表中,您还将获得一个收据句柄每一封邮件,您都可以使用它删除邮件并重复此过程,直到读取队列中的所有1000封邮件。现在,您可以执行列表上所需的任何操作,并以多种不同方式将其馈送到进程B,例如S3中的文件和/或进程B可以读取的新队列。
读取消息的替代方法:SQS允许您一次仅读取10条消息,可以发送可选参数'VisibilityTimeout':60,该参数将队列中的消息隐藏60秒,然后您可以递归读取所有消息,直到您在队列中看不到任何消息为止,同时将它们添加到lambda的列表中进行处理,这可能很棘手,因为您必须根据读取所需的时间尝试不同的可见性超时值1000条消息。知道您已阅读所有消息后,您只需拥有收据手柄并将其删除即可。您也可以清除队列,但是,您可以删除在此过程中收到的至少未读过一次的某些消息。