performance - 构建可扩展的文件上传站点

标签 performance file file-upload couchdb scalability

我正在尝试构建一个文件上传站点作为辅助项目,但我从未构建过任何需要处理此类大量文件的东西。据我所知,存储和检索文件有三个主要选项(请注意,每次上传可以有多个文件,因此,例如, website.com/a23Fc 可能会让您下载单个或多个文件,具体取决于关于用户最初上传的数量 - 类似于 imgur.com):

  • 将所有文件放在一个巨大的文件目录中,并使用(关系)数据库找出哪些文件属于哪些 URL,然后根据该文件返回一个文件名列表。示例:用户加载 website.com/abcde,因此它在数据库中查询与 abcde 上传相关的所有文件,返回它们的文件名,然后站点输出这些文件。
  • 使用 CouchDB 是因为它允许您将文件实际附加到数据库中的单个记录,因此每个 URL/上传都可以是一个附加了文件的数据库记录。例如,用户加载 website.com/abcde,CouchDB 抓取 ID 为 abcde 的文档,抓取附加到该文档的文件,并将它们提供给用户。
  • 完全跳过使用数据库,对于每次上传,创建一个新目录并将文件粘贴在其中。示例:用户加载 website.com/abcde,站点查找/files/abcde/目录,从那里抓取所有文件,并将它们提供给用户,因此根本不涉及数据库。

  • 其中哪些似乎最具可扩展性?就像我说的,我在这方面的经验很少,所以如果我完全离开或者如果有明显的第四种选择,我对它持开放态度。在单个目录中拥有数千或数百万个文件(即选项 1)似乎不太聪明,但在一个目录中拥有数千或数百万个目录(即选项 3)似乎并没有好多少。

    最佳答案

    我曾经工作过的一家公司在处理大约 PB 的图像文件时遇到了这个确切的问题。他们的解决方案是使用 Andrew 文件系统(更多信息请参见 http://en.wikipedia.org/wiki/Andrew_File_System)将文件存储在与 URL 结构匹配的目录结构中。这在实践中扩展得很好。

    他们还出于应用程序内部的其他原因记录了数据库中文件的存在。

    关于performance - 构建可扩展的文件上传站点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5009501/

    相关文章:

    javascript - 找到匹配项后防止在 jQuery 中向下遍历

    ios - iOS文件创建可访问所有应用程序

    android - Kotlin如何获取和打开视频

    html - 如何在 Chrome 中的文件输入中垂直对齐文件名

    php - 使用 php 在 Windows 服务器上上传文件时出现问题

    python - flask 在哪里寻找图像文件?

    Java8 Lambda 性能与公共(public)函数

    ios - pausesLocationUpdatesAutomatically 对 iBeacon 检测有多大影响?

    MySQL 状态 "closing tables"占用双倍的处理时间

    java - 使用 Java 在 Ubuntu 18.04 中获取 FileNotFoundException