在使用Amazon SQS完成Lambdafunction时通知浏览器客户端

在我的情况下,我试图实现运行相当耗时的计算的服务器less后端。 这个计算是由Lambdapipe理的,它引用了一些外部的API。

在oder要求这个我使用的Amazon 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); 

此代码由数千个客户端浏览器独立在AWS API网关上执行。

为了通知每个特定的客户,他的Lambda函数执行已经成功完成,我计划使用AWS SQS(因为长时间轮询和一些其他有用的function)。

所以我的问题是

我怎样才能在客户端确定队列中的哪个消息属于这个特定的客户端? 还是应该遍历所有的队列,以便在每个客户端浏览器中通过一些请求ID参数来查找正确的消息? 我想这1000个客户端将同时等待他们的结果时,这种方法是低效的。


我知道我可以将结果写入DynamoDB,并通过一些自制的API定期轮询DB的结果。 但有没有什么优雅的解决scheme通知基于浏览器的客户端有关完成基于某些Amazon PaaS解决scheme的耗时的Lambda函数的执行?

老实说DynamoDB路线可能是你最好的select。 您可以在由API网关执行的第一个Lambda函数中生成uuid。 将这个uuid传递给长时间运行的Lambda函数。 在第二个函数完成之前,将其写入具有两列的DynamoDB表: uuidresult

API网关使用其生成的uuid响应客户端。 然后,客户端通过对DynamoDB表的getItem请求(通过aws-sdk直接或通过另一个API网关请求)进行长时间轮询。 一旦成功响应,从DynamoDB表中删除所述项目。

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

因此,客户端将具有Lambda 1的lambda请求ID,Lambda 1 Context对象将具有相同的请求Id(不考虑lambda重试,请求ID保持不变)。 所以将这个请求ID传给Lambda 2,由实际的请求ID链接到结尾。

使用来自客户端的请求ID进行轮询在像dynamodb这样的任何数据存储上都相当简单。