代码之家  ›  专栏  ›  技术社区  ›  Ashish Patil

应该使用哪种技术来服务大量静态文件?

  •  1
  • Ashish Patil  · 技术社区  · 14 年前

    我的主要目标是通过web服务器提供大量XML文件(每个文件的容量大于10亿字节)。文件可以被认为是staic,因为这些文件将被外部代码修改,频率相对很低(每天大约50k次更新)。将以高频率请求文件(>30请求/秒)。

    另一方面,我认为,经过调整的apacheweb服务器或lighttpd就足够了。缓存可以留给操作系统或web服务器的默认缓存。如果需要相同的输出,并且只根据文件名进行查询,那么将数据保留在DB中是没有意义的。不确定memcached在这里如何工作。在通过外部代码更新文件的同时更新外部缓存(memcached)也会增加复杂性。

    还有一个问题,如果我选择使用文件,是否可以将这些文件存储在\a\b\c\d.xml这样的目录中,并通过abcd.xml?或者我应该把所有10亿个文件放在一个目录中(不确定操作系统是否允许)。

    这不是一个网站,而是一个封闭网络中的应用程序API,所以云/CDN是没有用的。

    This 是唯一一个关于这个话题的公开说明,它也有点老了。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Codo    14 年前

    10亿个文件,每个1KB,大约1TB的数据。令人印象深刻。因此,除非你有非常昂贵的硬件,否则它无法放入内存。如果您的文件系统为小文件浪费大量空间,甚至会在磁盘上造成问题。

    每秒30个请求远没有那么令人印象深刻。它当然不是网络的限制因素,也不是任何严肃的web服务器的限制因素。对于速度慢的硬盘来说,这可能是一个小小的挑战。

    因此,我的建议是:将XML文件放在硬盘上,并使用您选择的普通web服务器提供它们。然后测量吞吐量并优化它,如果你不能达到每秒50个文件。但不要投资任何东西,除非你已经证明它是一个限制因素。

    • 在文件系统中找到一个更好的布局,即在足够多的目录中分发文件,这样一个目录中就不会有太多的文件(超过5000个)。
    • 将文件分发到多个硬盘上,以便它们可以并行访问这些文件
    • 使用更快的硬盘

    关于将文件分发到多个目录,您可以使用Apache将其隐藏起来 重写规则 ,例如:

    RewriteRule ^/xml/(.)(.)(.)(.)(.*)\.xml /xml/$1/$2/$3/$4/$5.xml
    
        2
  •  1
  •   Josh K    14 年前

    另一件你可以看到的是 Pomegranate ,这似乎与您正在尝试的操作非常相似。

        3
  •  0
  •   Josh K    14 年前

    我相信一个专门的应用程序,所有东西都由memcache数据库提供,这是最好的选择。