2015-09-25 82 views
2

我想在文件系統中存儲大量(百萬)用戶頭像。 但是文件必須在文件系統中均勻分佈,以便隨着更多文件的添加而擴展。僅基於用戶名存儲和檢索大量頭像?

頭像大小爲5-10KB。 該應用程序是ASP.NET MVC(C#)

儲存:

考慮以下這些唯一的用戶ID:鮑勃,麥克羅伯特約翰遜 的頭像名字將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在我所有的表,我有用戶名

感謝您閱讀

回答

1

我還沒有見過這種創建這種文件夾結構的方式,但是,我認爲這很有趣。

假設你將有一百萬的用戶,那麼你呢,一百萬用戶X 10kb它將接近10GB的東西,這不是太多的存儲。

問題是,有多少用戶會同時訪問?如果它很多,服務器可能會傳輸這些文件的速度很慢,因爲服務器必須已經處理了數百萬次訪問。

如果我必須爲數百萬用戶建立一個網站,我不會將化身和內容存儲在我的應用程序服務器中,我會使用CDN(內容分發網絡)來存儲圖像,或者甚至專門致力於上傳圖片的服務器,比如avatar.mydomain.com,所以我會通過WCF上傳到這個域。

+0

化身將被存儲並從單獨的服務器提供服務。會有很多訪問。 100位用戶將同時訪問該頁面。我更關心的是架構,而不是我如何服務他們,這些可以改進或改變。但是改變架構將在以後更加困難。 – kheya

1

您提供的方法實際上最終會爲每個頭像創建一個文件夾結構。而且您還沒有一種簡單的方法來進一步將流量重新分配給許多服務器。

在我看來,最好使用來自唯一用戶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 
} 
+0

用戶ID可以是3-20個字符長:a-Z0-9並且不區分大小寫。鮑勃和鮑勃不允許只鮑勃或鮑勃。瞭解你想分開第一個字母的服務器。那麼你如何將它們分發到文件夾中,以便可以有一定的分佈。你能提供一些例子嗎?謝謝閱讀。 – kheya

+0

看起來像http://serverfault.com/questions/95444/storing-a-million-images-in-the-filesystem/161014#161014還指定使用MD5散列作爲文件名和目錄結構 – kheya