amazon-web-services - 如何在存储桶中选择文件的密钥以最大化 AWS S3 中的性能
问题描述
我对 AWS 很陌生。我正在开发一个云应用程序,我想使用 S3 进行文件存储。我阅读了Request Rate and Performance Considerations - Amazon Simple Storage Service以更好地了解索引在 S3 中的工作原理,但我不得不说这对我来说不是很清楚。
我的应用程序是多租户的,它将为每个客户存储许多文件。
我的关键想法是:
bucketname/211a6589-caef-4554-acc6-bc0fd05d756d/a/f/z/3b288ae5-3779-49d1-a79e-1812d4fa76e2.pdf
以这种方式组成的密钥:
- 存储桶名称
- 租户的uuid
- 3级文件夹随机生成
- 文件的uuid
第 2 点对我很有用,因为我将租户的所有数据都放在了一个文件夹中。uuid 是唯一且随机的,因此应该是一个好习惯。我还添加了 3 级嵌套文件夹(随机生成),因为最初我为磁盘存储创建了这个方法,这样我可以平衡文件系统上的 inode。
从文档中,我不完全了解密钥的哪一部分用于在 S3 中进行索引。
为了从 S3 获得最佳性能,我的方法是否足够好?
解决方案
首先,仅当存储桶“通常每秒超过 100 个 PUT/LIST/DELETE 请求或每秒超过 300 个 GET 请求”时才需要这种类型的工作。
这不是典型情况,因此如果您的应用程序不太可能达到这样的水平,请不要花费太多精力。但是,如果您认为自己会达到这样的水平,那么尽早将其“正确”是一个好主意。
想法是将负载分散到整个名称空间。将 Amazon S3 视为具有用于维护对象列表的树结构。对于大型存储桶,树结构的管理分布在服务器上。目标是将流量分散到多台服务器上,而不是只访问一台服务器。
如果您使用 UUID 来存储对象并且 UUID 是随机的,那么只需使用 UUID。这足以将负载分散到树结构中。即使是键前面的几个随机字符也足以分散负载。
如果您特别想在“每个租户”结构下存储文件,请使用:
tenant-uuid/object-uuid
这稍微不太好,因为一个租户可以同时获取/放置大量文件,并且它会影响树结构的一小部分,但如果您有许多同时用户,多租户应用程序的可能性很小。
推荐阅读
- javascript - 字符串 + JavaScript 中的增量值
- c++ - 模板或类中的static_assert,明白了
- sql - 在where子句中使用日期时选择查询不记录任何数据
- intellij-idea - 在戴尔 Latitude 笔记本电脑上写入 ASCII 字符时出现 Intellij 问题
- asp.net-core - Azure 搜索构面子元素限制
- dart - 将参数传递给 initState
- swift - 如何将包含属性字符串的对象编码为数据?
- python - 如何在 Flask Admin 的编辑表单中添加额外的字段?
- python - 在字典的值中搜索字符串并返回新的字典
- html - SVG 文件内的 SVG onhover 样式 - 用于 IMG 标签