天天看點

阿裡雲存儲 OSS 最佳實踐--上傳檔案命名

大家在做網站開發的時候,都會遇到檔案上傳的問題,其中對上傳檔案的命名大家并沒有通用标準,但随着上傳檔案越來越多的傳到各種雲存儲的時候,上傳檔案名這時候是可以有一些可以優化的小細節的。

其中在阿裡雲的文檔中清楚的寫着。

OSS按照檔案名UTF-8編碼的順序對使用者資料進行自動分區,進而能夠處理海量檔案,以及承載高速率的客戶請求。不過,如果您在上傳大量檔案時,在命名上使用了順序字首(如時間戳或字母順序),可能會導緻大量檔案索引集中存儲于某個特定分區。

當您的請求速率超過2000次/秒時(下載下傳、上傳、删除、拷貝、擷取中繼資料資訊等操作算1次操作,批量删除N個檔案、列舉N個檔案等操作算N次操作),會帶來如下後果:

  • 該分區成為熱點分區,導緻分區的I/O能力被耗盡,或被系統自動限制請求速率。
  • 熱點分區的存在會觸發系統進行持續的分區資料再均衡,這個過程可能會延長請求處理時間。

要解決這個問題,就要消除檔案名中的順序字首。您可以在檔案名字首中引入某種随機性,這樣檔案索引(以及I/O負載)就會均勻分布在多個分區。

簡單的說,就是你上傳的檔案會按着檔案名分區存儲,太多相似的命名檔案會存在一個區,當大量IO操作的時候性能會下降。

解決的辦法就是用随機檔案名的方式讓強制系統分區。

這裡推薦一個簡單有效的方法,就是把時間戳反轉,由于反轉的時間戳檔案名中的前3位數字代表毫秒時間,會有1000種取值。而第4位數字,每1秒鐘就會改變一次。同理第5位數字每10秒鐘就會改變一次。以此類推,反轉檔案名後,極大地增強了字首的随機性,進而将負載壓力均勻地分攤在各個分區上,避免出現性能瓶頸,是個簡單有效的優化存儲辦法。

最後送一段反轉時間戳的小代碼

return String((new Date().getTime())).split('').reverse().join('')
           

市面上大多數的雲存儲原理都類似,這樣的優化方案也适用于七牛,又拍,騰訊等雲提供商

=====================================================================

更新

上面提供的辦法再遇到數組重命名時候因為事件間隔太短,時間不會更新,會出現傳回字元串不變化的情況,在這個基礎上增加一個随機數來保證唯一性。

return String((new Date().getTime())).split('').reverse().join('') + Math.random()
           
上一篇: 樹型背包DP
下一篇: 樹型DP樹型DP

繼續閱讀