文件命名与目录设计

OSS 上出现了一个巨型目录

迁移到 OSS 后的第一个周末,我在 OSS 控制台看了一眼文件列表:

guangying-images/
  originals/
    a3f8c2e1b4567890abcdef1234567890.jpg
    b7d9e1f234567890abcdef1234567890.jpg
    c1e2f3a4567890123456789012345678.jpg
    d4e5f678901234567890123456789abcd.jpg
    ... (3,500 个文件,全平铺在一个目录下)

3,500 个文件不算多,但 OSS 的 list_objects API 在单目录下文件数超过 1,000 时性能开始下降。等到 100 万张图时,这个接口会慢到不可用。

更重要的是,很多文件系统(包括 OSS 的内部索引)对单目录下的文件数量有隐性限制。

扁平目录 vs 分层目录

我的设计:四层目录结构

经过研究,我设计了这样的目录结构:

originals/
  2024/
    06/
      a3/
        a3f8c2e1.jpg
        a3b7d9e1.png
      b7/
        b7d9e1f2.jpg
      ...
    07/
      ...

thumbs/
  small/
    2024/06/a3/a3f8c2e1_small.webp
  medium/
    2024/06/a3/a3f8c2e1_medium.webp
  large/
    2024/06/a3/a3f8c2e1_large.webp

为什么取哈希前 2 位?

文件命名规范