仅根据用户名存储和检索大量头像?

时间:2015-09-25 18:40:43

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

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

这些头像大小为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
}

我离开了吗? 如果是的话,你会如何设计这个?

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

感谢您阅读

2 个答案:

答案 0 :(得分:1)

我没有看到这种创建这种文件夹结构的方式,但是,我认为这很有趣。

假设您将拥有数百万用户,那么,100万用户X 10kb将接近10GB,存储起来并不算太多。

问题是,有多少用户同时访问?如果它很多,服务器可能会慢慢提供这些文件,因为服务器必须已经处理了数百万次访问。

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

答案 1 :(得分:1)

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

在我看来,最好使用来自唯一用户ID的信息作为分发密钥。例如,用户id的第一个字母。因为这样你可以保持开放的选择。想象一下,随着用户数量的增长,您可以将服务头像图像分割为两个服务器。 Server1处理范围为A-MServer 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
}