Ale*_*xey 10 amazon-sqs amazon-web-services node.js aws-lambda
在我的场景中,我正在尝试实现服务器较少的后端运行相当长时间的计算.此计算由Lambda管理,引用一些外部API.
在奥德请求这个我使用的亚马逊API网关有10秒的执行限制.然而Lambda运行大约100秒.
为了避免这种限制,我使用第二个Lambda函数执行这个耗时的计算并报告计算开始.
我看起来非常相似:
var AWS = require('aws-sdk');
var colors = require('colors');
var functionName = 'really-long'
var lambda = new AWS.Lambda({apiVersion: '2015-03-31'});
var params = {
FunctionName: functionName,
InvocationType: 'Event'
};
lambda.invoke(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(functionName.green + " was successfully executed and returned:\n" + JSON.stringify(data, null, 2).gray); // successful response
});
console.log("All done!".rainbow);
Run Code Online (Sandbox Code Playgroud)
此代码由AWS API Gateway独立于数千个客户端浏览器执行.
为了通知每个特定客户端他的Lambda函数执行成功完成,我计划使用AWS SQS(因为长轮询和一些其他有用的功能开箱即用).
所以我的问题是:
如何在客户端上确定队列中哪条消息属于此特定客户端?或者我应该遍历所有队列以通过每个客户端浏览器中的某个请求ID参数查找正确的消息?我想当1000个客户端同时等待他们的结果时,这种方法效率低下.
我知道我可以将结果写入DynamoDB,并通过一些自制的API定期轮询DB以获得结果.但有没有优雅的解决方案来通知基于浏览器的客户端基于某些Amazon PaaS解决方案完成执行耗时的Lambda功能?
老实说,DynamoDB 路线可能是您最好的选择。您可以在 API 网关执行的第一个 Lambda 函数中生成 uuid。将该 uuid 传递给长时间运行的 Lambda 函数。在第二个函数完成之前,将其写入包含两列的 DynamoDB 表:uuid
和result
。
API网关使用它生成的uuid响应客户端。然后,客户端对 DynamoDB 表发出请求进行长轮询getItem
(直接通过 aws-sdk 或通过另一个 API 网关请求)。成功响应后,从 DynamoDB 表中删除所述项目。
归档时间: |
|
查看次数: |
577 次 |
最近记录: |