延迟Lambda执行特定数据

问题描述 投票:1回答:2

我试图想出一种方法,通过每N小时调用一次aws lambda,以特定的时间间隔处理数据。

例如,每6小时在特定网址解析一个页面,并将结果存储在s3存储桶中。 有很多(~100k)网址都按这种方式处理。

当然,您可以拥有一个托管某些调度程序的VM,它会触发lambdas,如this answer中所述,但这打破了“无服务器”方法。

那么,有没有办法只使用aws服务呢?

我试过的东西不起作用:

  • SQS可以延迟消息,但最多只能持续15分钟(我需要几小时),并且SQS和Lambda之间没有内置的集成,所以你需要有一些轮询代理(lambda?),它会一直轮询qeueu和向工作人员lambda发送新消息,这再次突破了仅在预定时间执行的点;
  • CloudWatch警报可以向触发Lambda的SNS发送消息。您可以通过使用future metric timestamp定期执行lambda调用,但是警报消息不能连接到它的自定义数据(认为上面的示例中的url),因此也不起作用;
  • 我可以通过编程方式创建Lambda CloudWatch预定触发器,但它们也无法将任何数据传递给Lambda。

我能想到的唯一方法是使用一个带有“url”记录的发电机数据库表,每个记录都有最后一次“处理”的时间戳,并且具有定期的lambda,它将查询表并将“旧”记录作为作业发送给另一个“工人“lambda(直接或通过SNS)。这样可行,但是你仍然需要一个“轮询”lambda,这可能会成为一个瓶颈,因为要处理的项目数量会增加。

还有其他想法吗?

amazon-web-services aws-lambda scheduling serverless
2个回答
1
投票

每6个小时就有100个工作,对于无服务器IMO来说听起来不是一个很好的用例。就个人而言,我会设置一个CloudWatch事件,其中包含一个相关的cron表达式,该表达式触发Lambda启动处理所有URL(存储在DynamoDB中)的EC2实例,并在处理完最后一个url后编写EC2实例的脚本。

但这不是你问的。

您可以使用相关的cron表达式设置CloudWatch事件,该表达式生成lambda(orchestrator)从DynamoDB读取URL甚至是S3文件,然后为每个url调用第二个lambda(worker)来实际解析页面。

使用此模式,您将开始在1000个lambdas(1个orchestrator和999个worker)中遇到并发问题,如果您在同一个区域中运行其他lambda,则会减少。您可以要求AWS增加此限制,但我不知道他们会在什么情况下执行此操作,或者他们会增加限制的高度。

从这里你有三个选择。

  1. 将有效负载拆分为每个worker lambda,以便每个实例接收多个要处理的url。
  2. 使用此列向您的网址和网址列表添加另一列(例如,前500个标记为1,第二个500标记为2,等等)。那么你的orchestrator lambda可以批量删除列表中的url。这将要求您以更高的频率运行CloudWatch事件并管理状态,以便调用时的协调器lambda知道哪个是下一批(我在较小的范围内完成此操作只是将变量存储在S2文件中)。
  3. 将使用选项1和2的某些组合。

1
投票

看起来,它适合使用AWS lambda函数作为工作的Batch processing场景。它没有服务器,但显然增加了对另一个AWS服务的依赖。

同时,它具有dashboard,处理状态,重试以及来自作业调度服务的所有特权。

© www.soinside.com 2019 - 2024. All rights reserved.