用于浏览器轮询的 Amazon SQS?

Amazon SQS for browser polling?

我想知道 AWS SQS 是否是进行浏览器轮询的正确服务。

例如:

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

2) API 返回 "OK" 给用户并将请求转发给 SQS

3) 生成 PDF 并将其存储到 S3 的 lambda 正在读取 SQS 队列。

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

a) "okay" 用户和 lambda 是否都从 SQS 读取相同的消息?如果太多用户通过轮询请求使 SQS 过载怎么办?

b) SQS 消息可以是 edited/updated 吗?用户如何知道 lambda 完成了 PDF 并获得了下载 link? lambda 能否将包含 link 的消息编辑到 S3?如果不是,推荐的 way/AWS 服务是什么,可以让用户知道 PDF 何时完成而不会浪费太多资源?

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

标记 boto,因为我在 Python 中做了所有这些...最终。

您不想为此使用 SQS - 每个投票您最多只能阅读 10 条消息,如果您的队列有很多消息,您可能(将)一遍又一遍地看到相同的消息继续轮询,即不能保证您会看到所有这些。更不用说你将进入可见性超时并使它与多个客户端轮询你的队列一起工作。

您的输出 PDF 将转到 S3,因此您可以执行以下操作:让步骤 (2) 中的 Lambda 为输出 PDF 构造一个唯一的 S3 密钥,并将该密钥发送回 [=16] 中的客户端=] 响应。然后让客户端使用该键轮询输出桶。构建的PDF当然要用这个key来写。

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

我建议将 Web 套接字作为一种将通知推送回浏览器的方法,而不是让浏览器轮询(即定期发送 GetObject API 调用)S3 中的 PDF 文件。如果生成 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] "WebSocket APIs" 在 https://aws.amazon.com/api-gateway/pricing/