使用 Amazon SQS 完成 Lambda 函数时通知浏览器客户端

Posted

技术标签:

【中文标题】使用 Amazon SQS 完成 Lambda 函数时通知浏览器客户端【英文标题】:Inform browser clients when Lambda function is done using Amazon SQS 【发布时间】: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 函数的执行完成?

【问题讨论】:

【参考方案1】:

老实说,DynamoDB 路线可能是您最好的选择。您可以在 API Gateway 执行的第一个 Lambda 函数中生成一个 uuid。将该 uuid 传递给长时间运行的 Lambda 函数。在第二个函数完成之前,将其写入包含两列的 DynamoDB 表:uuidresult

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

【讨论】:

如果有很多客户长时间轮询,这会不会造成瓶颈?【参考方案2】:

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

因此,客户端将具有 Lambda 1 的 lambda 请求 ID,Lambda 1 上下文对象将具有相同的请求 ID(无论 lambda 重试如何,请求 ID 保持不变)。因此,通过实际请求 ID 将这个请求 ID 传递给 Lambda 2,直到最后。

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

【讨论】:

以上是关于使用 Amazon SQS 完成 Lambda 函数时通知浏览器客户端的主要内容,如果未能解决你的问题,请参考以下文章

AWS Lambda 在向 SQS 发送消息之前完成

作为 SQS 事件处理程序的 Lambda 函数未运行部分代码并成功完成

访问 AWS Lambda 的 Amazon CloudWatch 日志

Amazon MQ 和 SQS 有啥区别?

SimpleMessageListenerContainer Amazon SQS Pollinterval

如何将Amazon SQS与Dynamodb集成