【问题标题】:Storing and retrieving large number of avatars just based on usernames?仅基于用户名存储和检索大量头像?
【发布时间】:2015-12-23 16:02:33
【问题描述】:

我想在文件系统中存储大量(数百万)用户头像。 但文件必须均匀分布在文件系统中,以便在添加更多文件时更好地扩展。

头像为 5-10KB 大小的图片。 该应用程序是 ASP.NET MVC (C#)

存储:

考虑以下这些唯一用户 ID:bob、mike、robert、johnson 头像名称将是 bob.jog、mike.jpg、robert.jpg、johnson.jpg

渲染头像的HTML元素:

<img class="avatar" src="www.xyz.com/getAvatar?user=bob" />
<img class="avatar" src="www.xyz.com/getAvatar?user=mike" />

这将转到 getAvatar 控制器操作,该操作将从物理位置获取头像并写入响应缓冲区

当前架构:

[HttpPost]        
public ActionResult SaveAvatar(HttpPostedFile avatarImage, string user)
{
   //get MD5 hash of user (bob=9F9D51BC70EF21CA5C14F307980A29D8)
   //split MD5 hash string to get the folders (\9F\9D\51\BC\)
   //save avatar at path <file_server>\images\9F\9D\51\BC\bob.jpg
}

[HttpGet]        
public ActionResult GetAvatar(string user)
{
   //get MD5 hash of user (bob=9F9D51BC70EF21CA5C14F307980A29D8)
   //find the file location from MD5 hash (9F\9D\51\BC\)
   //return <file_server>\images\9F\9D\51\BC\bob.jpg
}

我在这方面做得不够吗? 如果是,您将如何构建它?

我可以使用数据库中用户的用户 ID(自动生成为新的 UUID),但在这种情况下,我必须将用户 ID 存储在我拥有用户名的所有表中

感谢阅读

【问题讨论】:

    标签: c# asp.net-mvc-4 architecture filesystems scalability


    【解决方案1】:

    我还没有见过这种创建这种文件夹结构的方法,但是,我觉得这很有趣。

    假设您将拥有 100 万用户,那么您会这样做,100 万用户 X 10kb 将接近 10GB,存储空间不会太多。

    问题是,有多少用户会同时访问?如果数量很多,服务器传递这些文件的速度可能会变慢,因为服务器已经处理了数百万次访问。

    如果我必须为数百万用户做一个网站,我不会将头像和内容存储在我的应用服务器中,我会使用 CDN(内容交付网络)来存储图像,甚至获得专用服务器用于上传图片,例如 avatar.mydomain.com,所以我会通过 WCF 上传到该域。

    【讨论】:

    • 头像将从单独的服务器存储和提供。会有很多访问。 100 多个用户将同时访问该页面。我更关心架构,而不是我如何为它们服务,这可以改进或改变。但是以后改变架构会更难。
    【解决方案2】:

    通过您提出的方法,您实际上最终会为每个头像创建一个文件夹结构。而且您没有一种简单的方法来进一步将流量重新分配到许多服务器。

    在我看来,最好使用来自唯一用户 ID 的信息作为分配键。例如用户 id 的第一个字母。因为多亏了这一点,您才能保持选择余地。想象一下,随着用户数量的增长,您可以例如将服务头像图像拆分到两台服务器。 Server1 处理范围为A-M 的用户名,Server 2 处理N-Z。在由用户 id 的第一个字母分布的文件夹中,您可以使用您提供的方法。

    示例如下:

    [HttpPost]        
    public ActionResult SaveAvatar(HttpPostedFile avatarImage, string user)
    {
       //get MD5 hash of user (bob=9F9D51BC70EF21CA5C14F307980A29D8)
       //split MD5 hash string to get the folders (\9F\9D\51\BC\)
       //add first letter of user id to the location
       //save avatar at path <file_server>\images\b\9F\9D\51\BC\bob.jpg
    }
    
    [HttpGet]        
    public ActionResult GetAvatar(string user)
    {
       //get MD5 hash of user (bob=9F9D51BC70EF21CA5C14F307980A29D8)
       //find the file location from MD5 hash (9F\9D\51\BC\)
       //add first letter of user id to the location
       //return <file_server>\images\b\9F\9D\51\BC\bob.jpg
    }
    

    【讨论】:

    • 用户 ID 可以是 3-20 个字符长:a-Z0-9,不区分大小写。鲍勃和鲍勃不允许只有鲍勃或鲍勃。了解您要拆分服务器的第一个字母。那么你如何将它们分布在文件夹中,以便你可以有一些均匀的分布。你能提供一些例子吗?感谢阅读。
    • 看起来serverfault.com/questions/95444/…也指定使用MD5哈希作为文件名和目录结构
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 2011-05-05
    • 2012-08-13
    • 2012-06-30
    相关资源
    最近更新 更多