我正在研究需要每秒存储大量图像的项目。如果我应该将图像存储在 S3 或 DynamoDB 中,我有点困惑。我的困惑是因为 S3 似乎不支持批量请求,如果需要,我必须能够批量获取所有图像;另一方面,我不确定将所有这些图像存储在 dynamoDB 的表中是否是个好主意。最好的方法是什么?
2 回答
简短回答:使用 S3。
长答案:DynamoDB 将单个记录限制为 64 KB,因此除非您的图像很小,否则您可能无法使用 DynamoDB。
您提到希望在批处理请求中读取您的图像,但 DynamoDB 批处理请求最多返回 100 条记录或 1 MB(以较少者为准),因此无论如何您都不能一次检索所有图像。您可以通过一次读取一个页面来转储 DynamoDB 中的所有内容,这意味着大量请求一个接一个。不快。
DynamoDB 的延迟低于 S3,并且支持可配置的吞吐量。但是,S3 开箱即用支持尽可能多的并发。想一次上传 1000 张图片吗?去吧!每个对象的写入时间是否为 400 毫秒都没有关系,因为您可以同时传输任意数量的对象。同样,您可以通过获取存储桶中所有内容的列表,然后并行检索每个对象,从 S3 中转储所有内容。
使用 S3 的其他原因:
- HTTP 兼容性,因此您可以将其他人或应用程序直接指向存储桶
- 大大降低存储成本
- 按请求付费,而不是按预置吞吐量付费(DynamoDB 中 640 KB/s 的写入容量每月花费 460 美元,而 S3 中每 1000 次上传的固定费用为 0.01 美元)
我能想象出 DynamoDB 可能对图像存储有意义的唯一情况是,如果您的图像很小、经常更改,并且您对读取延迟非常敏感。除此之外,使用 S3。
将图像存储在 S3 中。willglynn 已经描述了 DynamoDB 的限制。但是,您可能希望将 URL 存储到 DynamoDB 中的图像和其他元数据。
关于 DynamoDB 的一点警告,它可能非常昂贵。从免费层升级可能很容易花费几百美元来购买十几个吞吐量单位。如果您将其用于存储需要更大容量的大型项目(接近 64KB,例如图像),您很可能最终会支付数千美元。要使用 AWS 存储元数据,您可能需要检查 SimpleDB。