我想从Aurora mysql中获取产品I,并使用lambda将它们发送到SQS。
伪代码:
int limit = 90,000;
int offset = 0;
//set db connection
query = ("select product id from products limit " +limit + " offset " + offset);
while(rs.next())
{
pid = rs.getString(1);
...
//code to send pid to sqs
}
if(context.getRemainingTimeInMillis() < 10000)
{
//call this lambda again
offset = offset + limit;
//call same lambda with updated offset and repeat this until all the records are fetched
}我不知道如何调用aws-lambda recursively,以便sql查询每次都会获得更新后的偏移量。以及如何在这个lambda中进行错误处理,以便如果某些lambda失败,它应该重试。我的表中的pids总数约为700万,在1次调用中,我能够向队列发送90k条记录。
发布于 2021-03-06 04:23:18
这可能不是Lambda的工作。我可能会先使用AWS Batch或ECS Task。
您可以对当前代码进行一些改进。看起来你一次只能发送一条消息给SQS,但你最多可以发送10条。
根据您处理消息的方式,将它们批量处理为包含1,000个或更多ID的消息可能是有意义的。
但是,如果您打算使用Lambda并编写单独的SQS消息,那么您需要理解invoke()操作。您将需要异步调用,并且需要将偏移量打包到JSON blob中。
如果采用这种方式,我建议将时间检查移到循环中:对于处理的每条记录,递增index变量。发送消息后,检查时间并在必要时再次调用该函数,传递当前索引。然后跳出这个循环。
发布于 2021-03-12 20:54:33
在无服务器中实现递归的另一种方法是使用调度的lambda。
基本上,你会有一个lambda运行,比如说每15分钟运行一次。
关于偏移量,我建议将记录标记为已处理,而不是尝试传递offset参数。
您的查询将如下所示:
query = ("select product id from products WHERE processed=false AND limit=" +limit); 然后我们需要回答这个问题,我们什么时候停止预定的lambda?
如果您有有限数量的记录,您可以在知道所有记录都已处理后,禁用定期触发lambda的云监视规则,否则我们最好让lambda永远运行:)
关于如何按计划触发lambda的Documentation。
https://stackoverflow.com/questions/66497988
复制相似问题