【发布时间】:2016-01-19 15:30:27
【问题描述】:
在我的场景中,我正在尝试实现运行相当耗时的计算的无服务器后端。此计算由引用一些外部 API 的 Lambda 管理。
为了请求这个,我使用了 Amazon API Gateway,它有 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);
此代码由数千个客户端浏览器通过 AWS API Gateway 独立执行。
为了通知每个特定客户他的 Lambda 函数执行已成功完成,我计划使用 AWS SQS(因为长轮询和其他一些开箱即用的有用功能)。
所以我的问题是:
如何在客户端上确定队列中的哪条消息属于该特定客户端?或者我应该遍历所有队列以通过每个客户端浏览器中的某些请求 ID 参数找到正确的消息?我想当 1000 个客户同时等待他们的结果时,这种方法效率低下。
我知道我可以将结果写入 DynamoDB,并通过一些自制的 API 定期轮询 DB 以获取结果。但是是否有任何优雅的解决方案来通知基于浏览器的客户端有关基于某些 Amazon PaaS 解决方案的耗时 Lambda 函数的执行完成?
【问题讨论】:
标签: node.js amazon-web-services amazon-sqs aws-lambda