每家公司都該擁有OSS

我在招行卡中心的時候,開發了一款OSS(對象存儲服務),當時內部叫FSP(文件服務平臺).定位和七牛/又拍極其類似;算是一種私有的OSS吧.OSS這種東西可繁可簡,可是一旦擁有便將成爲開發者的福音,大大增長開發效率.總的來講,OSS是很受廣大開發人員歡迎的,很容易進行內部推廣,你們都很願意使用,甚至有些時候愛到了濫用的地步.現在掌上生活應該有極多的靜態資源經過FSP進行託管和分發了吧.前端

在我所呆過的很少的幾家公司裏我發現了一個現象:只要公司體量稍大,便不太樂意使用公有云服務,各類服務更偏向於本身部署,甚至本身造輪子.哪怕這種耦合並不那麼嚴重的服務,也更傾向於本身作,而不使用公有云,我想凡是在大中型開發團隊的Developer大多會和我有相同的感覺.若是你的團隊也是這樣,我以爲你的團隊一樣須要一個較爲完善的對象存儲服務.算法

曾經我大量遇到過這樣的問題:後端

一個WEB站點,必然存在大量的靜態資源:圖片,CSS,JS,靜態化內容等等...可是爲了網站的高可用,咱們須要進行集羣部署,集羣部署後顯然就帶來了一致性的問題:新增圖片A,節點1存下了,節點2怎麼辦?特別是相似CMS這樣須要靜態化場景的場景下,如何保持多個節點間靜態資源的同步?若是碰上了UGC場景就更恐怖了~你到底是要存DB呢仍是存本地呢?當時咱們也嘗試過使用RSYNC這樣的方案進行節點間同步,可是由於這樣的站點很難作讀寫分離,全部同步策略都須要使用互相同步......使用一段事件後老是問題多多.在這樣的背景下,絕大多數團隊都會天然而然地衍生出最簡單地對象存儲服務.通常狀況下他的架構是這樣的: 緩存

every-company-need-OSS-201821195111

在初期這樣地架構沒有任何問題,靜態資源集中化存儲,並由靜態資源服務器統一將靜態資源返回給用戶.靜態資源服務器還能加上CDN一切看起來都很好,每每不少團隊的開發就到此爲止了.可是隨着使用量地增多,需求也將會愈來愈難以知足:服務器

受權訪問微信

應用資源隔離架構

資源自動過時前後端分離

多媒體資源處理運維

水印異步

防盜鏈

五花八門的需求會如潮水般涌來,哪怕高可用,限流這樣的需求用上面的架構都難以知足.這些資源的存儲\管理\配置\遷移都會成爲你所要面臨的問題.而這些問題彷佛是沒辦法規避的.也是終究會面對的需求.此時,你須要的就是一個OSS!

every-company-need-OSS-2018211102719

接下來我簡單介紹一下每一個服務:

  1. CDN:這個不用太多說,通常都會購買專業的CDN服務提供方給的CDN服務用以互聯網緩存.

  2. WEB寫入API:一般用來和用戶進行寫入交互,這裏的用戶可能時終端用戶,也有多是服務器.我很建議這一套API提供CORS支持,這在UGC場景對開發實在太友好了.開發人員只須要分發token+上傳策略,最終用戶上傳的流量徹底不通過業務端的應用服務器用戶減小了不少開發量.(這裏很建議提供一套分發token\策略的SAAS服務,畢竟每次都寫一堆這種東西部署仍是很煩人).從前我以爲七牛在這一塊的API品味頗有問題,感受API很是的Dirty,直到後來上傳時須要設置的東西愈來愈多才發現這種Dirty的東西很爽啊,哈哈哈!用戶在上傳時就能夠提供不少的應用處理信息:過時\文件處理\命名規則等等.

  3. CDN服務調用:當一些靜態資源存在更新時須要及時通知CDN以進行緩存刷新;當進行一些會產生突發大流量訪問的狀況應該通知CDN服務進行資源預取.這些調用CDN服務的工做一般能夠交給這一服務進行異步調用.

  4. Web讀取API:這一層一般直接接入CDN,標配提供了鑑權的功能.若是對本身服務的圖像處理性能有信心能夠加一些圖像縮放這些小功能進去.

  5. 鑑權服務:這個服務是專門用於和CDN對接的.能夠和CDN廠商進行對接,通常CDN廠商會提供兩種訪問鑑權的服務:(1)基於過時簽名的CDN模式,雙方約定好一種基於過時簽名的算法,CDN緩存了你的源數據,以後的鑑權所有由CDN幫你完成.若是這樣就能知足你的需求,那徹底不須要鑑權服務(2)自定義的鑑權模式,這種模式每每約定好一個參數做爲鑑權token,CDN拿到這個鑑權token之後會調用你的鑑權服務進行鑑權.這樣你的鑑權邏輯就能夠徹底自主,基於調用次數,基於時間,等等這些功能就能較好地實現.每每CDN廠商是不太樂意幹這事的,和他們協商仍是須要很費一番口舌.

  6. 集羣存儲文件系統:這個服務提供了整個OSS的最核心服務,即文件的高效讀寫,可用性保障,可靠性保障.對於自建而言,若是不是開發團隊格調極高,仍是儘可能別本身開發了.市面上這樣的開源和商業的解決方案都不少:SeaWeedFS,FastDFS,TFS(名聲大,尾巴爛,阿里開源你懂的...)等等這些解決方案均可以直接拿來使用.

  7. 對象處理服務:這一服務主要用於異步處理一些複雜任務,例如視頻拼接/切割,圖片水印/壓縮,批量文件打包等等這些耗時的處理型任務.若是這些任務不少很複雜,還建議再開一個Web服務用於接收用戶這些服務請求.

  8. 後臺管理和測試工具:這個我沒在架構圖上畫出來,不少企業內服務開發者其實都存在這個問題,對管理後臺的輕視.其實這個東西必定要針對系統仔細開發,它能大大下降你的工做量,儘可能讓用戶可以自助管理本身的對象空間和進行開發測試,可以讓你省出大量時間.

基本的一套OSS就這些組件,其實開發起來並非很困難.能夠參考一些公有云服務提供的功能給本身的OSS加上.在先後端分離的今天,甚至一些開發能夠直接使用OSS做爲前端WEB SERVER,不知比配置一堆Nginx而後再去找運維加CDN方便到哪裏去了.這一套服務架起來靜態資源的託管和分發問題能夠極大的獲得解決,性價比極高.在前廠由於合規政策等緣由,不少我很想要的功能無法加入,一直想本身寫一套OSS來開源,但最近看到七牛開始支持私有云部署了,實施這一計劃的動力又降低了很多(主要仍是懶)...但願每一家公司都有本身的一套成熟靠譜易用的OSS,別把寶貴的時間浪費在繁瑣的小事上.

歡迎關注個人微信公衆號
相關文章
相關標籤/搜索