用于浏览器轮询的Amazon SQS?

时间:2019-02-18 17:55:28

标签: amazon-web-services amazon-s3 boto3 amazon-sqs

我想知道AWS SQS是否适合进行浏览器轮询。

例如:

1)用户通过浏览器访问应用程序,并请求生成大型PDF

2)API向用户回复“确定”,并将请求转发给SQS

3)Lambda正在读取SQS队列,该Lambda会生成PDF并将其存储到S3。

现在,在第2步和第3步之间的某个时刻,用户浏览器想知道PDF何时完成(没有电子邮件),它可以通过轮询SQS以获取特定的消息ID来做到这一点(甚至可以吗?),但我有一些问题:

a)用户和lambda从SQS读取同一消息是否“还可以”?那么有太多用户因轮询请求而使SQS过载?

b)可以编辑/更新SQS消息吗?用户如何知道lambda完成了PDF并获得了下载链接? Lambda可以将包含S3链接的消息编辑为吗?如果不是,那么建议用户在不浪费太多资源的情况下知道何时完成PDF的推荐方式/ AWS服务是什么?

并且最好不需要数据库...我们确实没有太多的用户,但是我们正在努力使事情变得正确并为未来做证明。

最终我在Python中做所有这些工作时给boto加标签...

2 个答案:

答案 0 :(得分:2)

您不想为此使用SQS-每次轮询最多只能读取10条消息,并且如果队列中有很多消息,则在您继续进行轮询时,您可能会(一遍又一遍)看到相同的消息即,不能保证您会看到所有这些。更不用说您将要输入的可见性超时,并与多个轮询队列的客户端一起使用。

您的输出PDF将进入S3,因此您可以执行以下操作:让步骤2中的Lambda为输出PDF构造一个唯一的S3密钥,然后在“确定”响应中将密钥发送回客户端。然后,使客户端使用该键轮询输出存储桶。当然,构建的PDF应该使用此密钥编写。

要从浏览器中轮询,请使用GetObject。您需要在输出存储桶上配置CORS才能起作用。

答案 1 :(得分:2)

我建议将Web套接字作为一种将通知发送回浏览器的方法,而不是让浏览器在S3中轮询(即定期发送GetObject API调用)。如果生成PDF时发生错误,这种方法将帮助您通知浏览器。

有关更多详细信息,请观看https://www.youtube.com/watch?v=3SCdzzD0PdQ(从6:40开始)。

在10:27,您将找到一个与您要实现的目标相匹配的图(用S3替换DynamoDB组件)。

我还认为,通过比较S3定价[1]与Web套接字定价[2],基于Websocket的方法比轮询方法便宜。但是您将需要进行测试(这反映了生产工作量)并对此进行验证。

[1] https://aws.amazon.com/s3/pricing/#Request_pricing [2] https://aws.amazon.com/api-gateway/pricing/

中的“ WebSocket API”
相关问题