電子商務文件存儲及讀取服務的設計和開發思路(JMagick用於生成高清的縮略圖)

商品圖片,平均200-500K,說大不大,說小不小,但量大且細碎,一般經過頁面上傳,所有保存在文件裏,管理和索引都很慢,幾乎沒法備份,讀取也很慢。html

傳統的基於磁盤存儲的缺陷: 
一、 圖片存儲和應用程序在一個服務器上,圖片的讀取佔用大量的磁盤IO,在訪問量高的時候,圖片讀取和應用程序相互影響。特別互聯網環境下的文件多以幾K,幾十K的小文件爲主,磁盤尋址和讀取,緩存命中率都比較低。 
二、 當規模大到必定程度,應用服務器將擴展到多服務器集羣環境中,傳統的磁盤存儲在集羣環境下面臨集中存儲的挑戰。
三、 基於磁盤的存儲,在面臨將來擴容的狀況下,也顯的能力不足,經過增長磁盤的容量很快將達到極限,最好的方法仍是多服務器集羣的存儲。因此在存儲和讀取上的難度將陡然增長。 web

因此鑑於此,放棄簡單的磁盤存儲,並且各大互聯網公司都有本身的文件系統,google的GFS,淘寶的TFS,其餘中小型的網站,會採用相似於mogileFS這樣開源的文件系統。因此利用開源的文件系統來搭建咱們本身的文件系統、文件服務器以及文件的存取服務。spring

在衆多開源的文件系統中,咱們選用MongoDB的GridFS做爲文件存儲服務。sql

MongoDB特性 MongoDB是一個可擴展、高性能的下一代數據庫,由C++語言編寫,旨在爲web應用提供可擴展的高性能數據存儲解決方案。它的特色是高性能、易部署、易使用,存儲數據很是方便,主要特性有: 
1. 模式自由,支持動態查詢、徹底索引,可輕易查詢文檔中內嵌的對象及數組。 
2. 面向集合存儲,易存儲對象類型的數據, 包括文檔內嵌對象及數組 。 
3. 高效的數據存儲,支持二進制數據及大型對象(如照片和視頻) 。 
4. 支持複製和故障恢復;提供了主-從、主-主模式的數據複製及服務器之間的數據複製。 
5. 自動分片以支持雲級別的伸縮性,支持水平的數據庫集羣,可動態添加額外的服務器 。 

在OECP社區(http://www.oecp.cn)中,咱們也初步使用了mongodb,實踐證實mongodb從效率和穩定性上都是有保障的。 
GridFS和傳統的MogileFS不一樣, gridfs能夠和其它的meta數據部署在同一個 db中,默認的會爲gridfs的collection分別建立fs.files和fs.chunks. 當存儲一個文件時,能夠附加存入任意的附加信息,由於這些信息實際上也是一個普通的collection. GridFS的一個優勢是能夠存儲上百萬的文件而無需擔憂擴容性. 經過同步複製,能夠解決分佈式文件的備份問題. 目前,mongo支持主-從和Replica Pairs以及受限的Master-Master Replication. 比較實用的仍是前2種. 

選擇了存儲的方案後,咱們須要對電子商務網站的圖片的存儲和讀取進行總體的架構設計,設計思路: 
? 決不容許重複圖片存在,利用MD5進行判斷 
? 文件只有原始的須要保留,其餘各尺寸和效果均可以由原圖生成 
? 圖片URL老是固定的,無論它出如今哪裏 ? 縮略圖生成規則也簡單的體如今URL裏 
? 第一次請求,由圖片處理程序生成靜態文件,之後請求即直接定位到靜態文件 mongodb

下圖爲圖片存取流程圖:
數據庫

所用到的技術組件:
一、    MongDB,第一階段採用單服務器,後期演變到M-S架構
二、    Nginx: 解析URL並定位到靜態文件,若是未生成則轉向程序去生成圖片
三、    JMagick:用於生成高清的縮略圖
四、    spring-data:用於對MongoDB的操做


下一步的工做主要是:
一、    對MongoDB的封裝
二、    對文件系統的存儲實現和應用程序的讀取
三、    將文件系統做爲OECP平臺的系統組件進行包裝

延伸:基於MongoDB的日誌服務和用戶行爲分析的架構設計及實現策略的考察和嘗試

案例: 視覺中國的NoSQL之路:從MySQL到MongoDB : http://blog.nosqlfan.com/html/1155.html 視覺中國MongoDB開發應用實踐 : http://www.infoq.com/cn/presentations/pf-mongodb-develop數組

相關文章
相關標籤/搜索