我试图想出一种方法,通过每N小时调用一次aws lambda,以特定的时间间隔处理数据。
例如,每6小时在特定网址解析一个页面,并将结果存储在s3存储桶中。 有很多(~100k)网址都按这种方式处理。
当然,您可以拥有一个托管某些调度程序的VM,它会触发lambdas,如this answer中所述,但这打破了“无服务器”方法。
那么,有没有办法只使用aws服务呢?
我试过的东西不起作用:
我能想到的唯一方法是使用一个带有“url”记录的发电机数据库表,每个记录都有最后一次“处理”的时间戳,并且具有定期的lambda,它将查询表并将“旧”记录作为作业发送给另一个“工人“lambda(直接或通过SNS)。这样可行,但是你仍然需要一个“轮询”lambda,这可能会成为一个瓶颈,因为要处理的项目数量会增加。
还有其他想法吗?
每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增加此限制,但我不知道他们会在什么情况下执行此操作,或者他们会增加限制的高度。
从这里你有三个选择。
看起来,它适合使用AWS lambda函数作为工作的Batch processing场景。它没有服务器,但显然增加了对另一个AWS服务的依赖。
同时,它具有dashboard,处理状态,重试以及来自作业调度服务的所有特权。