Node.js 使用Amazon SQS完成Lambda功能时通知浏览器客户端

Node.js 使用Amazon SQS完成Lambda功能时通知浏览器客户端,node.js,amazon-web-services,amazon-sqs,aws-lambda,Node.js,Amazon Web Services,Amazon Sqs,Aws Lambda,在我的场景中,我试图实现运行相当长时间计算的无服务器后端。该计算由Lambda管理,Lambda引用一些外部API 为了请求这个,我使用了AmazonAPI网关,它有10秒的执行限制。然而,Lambda跑了大约100秒 为了避免这个限制,我使用第二个Lambda函数来执行这个耗时的计算&报告计算已经开始 我看起来很像这样: var AWS = require('aws-sdk'); var colors = require('colors'); var functionName = 'real

在我的场景中,我试图实现运行相当长时间计算的无服务器后端。该计算由Lambda管理,Lambda引用一些外部API

为了请求这个,我使用了AmazonAPI网关,它有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);
此代码由数千个客户端浏览器通过AWSAPI网关独立执行

为了通知每个特定的客户,他的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表中删除所述项。

lambda函数的上下文对象将向调用lambda函数的客户端返回AWS请求ID

因此,客户端的lambda请求ID为lambda 1,lambda 1上下文对象的请求ID相同(无论lambda重试次数如何,请求ID保持不变)。因此,将此请求ID传递给Lambda 2,实际请求ID一直链接到最后


在任何数据存储(如dynamodb)上,使用来自客户端的请求id进行轮询都相当容易。

如果有许多客户端长期轮询,这会不会造成瓶颈?