我想在文件系统中存储大量(数百万)用户头像。 但是文件必须在文件系统中均匀分布,以便在添加更多文件时能够很好地扩展。
这些头像大小为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存储在我拥有用户名的所有表中
感谢您阅读
答案 0 :(得分:1)
我没有看到这种创建这种文件夹结构的方式,但是,我认为这很有趣。
假设您将拥有数百万用户,那么,100万用户X 10kb将接近10GB,存储起来并不算太多。
问题是,有多少用户同时访问?如果它很多,服务器可能会慢慢提供这些文件,因为服务器必须已经处理了数百万次访问。
如果我必须为数百万用户建立一个网站,我不会将头像和内容存储在我的应用服务器中,我会使用CDN(内容传送网络)存储图像,甚至可以获得专用服务器用于上传图片,例如avatar.mydomain.com,所以我会通过WCF上传到这个域。
答案 1 :(得分:1)
通过您提供的方法,您实际上最终会为每个头像创建一个文件夹结构。并且您没有简单的方法来进一步将流量重新分配给许多服务器。
在我看来,最好使用来自唯一用户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
}