【发布时间】:2017-12-05 10:46:27
【问题描述】:
我正在制作一个简单的应用程序,用户可以在其中创建文本帖子并选择性地包含媒体(目前仅提供图片,但未来将提供视频)。
目前,用户向 API Gateway 发送 POST 请求,该请求调用 Lambda 函数将发布数据插入数据库。这很好用。 API Gateway 使用主体映射来格式化事件数据。
为了上传媒体,我似乎至少有三个选择:
-
像平常一样发出 HTTP
POST请求然后将媒体上传到 S3(通过 Cloudfront?)。- S3 将触发一个 Lambda 函数,该函数使用媒体 url 更新帖子记录。
- 这需要在前端至少调用 2 次 API。 -.-
- 如果媒体上传失败怎么办?我将不得不调用另一个 Lambda 函数来删除帖子。如果失败了怎么办?这是一个兔子洞。
-
将媒体上传到 S3(通过 Cloudfront?)然后发出 HTTP
POST请求。- 这需要在前端调用 2 次 API。 -.-
- 如果
POST请求失败怎么办?我的桶里会有额外的物品。我想我可以有一个桶清洁计划任务,但 ugg。 - S3 密钥会不会与帖子的
id不对应? (id在数据库插入时生成。)
-
使用
multipart/form中的HTTPPOST请求上传媒体。- 这就是我过去的做法,但我也有一个 Web 服务器(不是 lambda)。如果照片不是很大,转移到 S3 应该相对较快,并且我的 lambda 成本不会大幅增加。但是如果我决定添加视频呢?现在我的 lambda 调用将是几秒钟之久。
这里的最佳做法是什么?这似乎是一个常见问题,但我在网上找到的所有指南都不关心帖子数据(仅媒体数据)。
【问题讨论】:
-
出于好奇,您为什么要涉及 API 网关?为什么不直接使用 AWS 的 SDK 调用您的 lambda?无论如何,我会选择选项 (1),即首先创建帖子,因为这听起来像是您的用户想要创建的实际对象。如果您的媒体上传失败,您只需将此错误传回 UI 并要求他们再次上传。为什么要删除帖子?
-
好问题。我想是关注点分离。前端对于后端改造其功能是完全天真的。现在我想起来这可能会与版本控制混淆。你选择那个很有趣,因为我认为(2)会是最好的。媒体似乎同样重要。在 (1) 中,获取新创建帖子的用户可以在没有媒体的情况下获得帖子。
-
我明白了,所以您的对象由两个同等重要的部分(文本和媒体)组成,您希望在一次操作中传输它们以避免一致性问题。如果您可以将文本限制为少于 1024 个 Unicode 字符,请将文本放入包含媒体的 s3 对象的键中。您需要在键的前面保留一些字符,即在用户文本开始之前,因为 S3 的 ListObjects API 有一个有用的“前缀”参数,您可以使前缀有利于搜索。然后附加一个 lambda 监听器以创建数据库条目上传后。
-
如果您的帖子超过 1000 多个字符,那么是的,您需要两个操作和一个清理过程来捕获那些失败的。 S3 的对象过期应该有助于清理您将首先上传的媒体部分(您的选项 #2),您当然会在成功提交帖子上的文本部分后将媒体移出自动过期存储桶
-
很棒的答案。非常感谢。
标签: amazon-web-services amazon-s3 aws-lambda amazon-cloudfront