天天看點

用 LFS 做極簡高效的流媒體服務

示例可在:github git@osc 找到,包含一個詳細的圖檔伺服器

圖檔服務示範(簡單部署了 php 的服務):

先做一個音樂、視訊、圖檔等媒體檔案的上傳和下載下傳示例。都隻需要一行。

ok,一個媒體檔案上傳成功後會傳回一個檔案 id。

即使是一個比較大的視訊,比如大于 10g,也依然隻有這一行代碼,并不需要做切片存儲,并且無需擔心記憶體使用。(大檔案的上傳也變的如此簡單)

下載下傳:

沒錯,就是這一行啦,根據檔案 id 讀取檔案,把資料通知給 readstream。

那麼,我們來看看 readstream 做了什麼。(這就是一個完整的媒體服務的示例)

init 隻會在 parsedata 前調用一次,用來擷取檔案的真實大小,比如我們可能需要為 http 添加 content-length 的頭等。

parsedata 每次都會調用,把緩沖中的資料輸出到 http 的輸出流中,bytesavalibale 是緩沖中的有效位元組大小。

到這裡你會發現,parsedata 中是流式輸出資料的,是以這保證了音樂、視訊等流媒體的流暢度,并且也有效降低了伺服器的記憶體占用。因為緩沖的大小是非常小的,你可以了解為 socket 的緩沖大小,并且可調節,預設大小 2k(注:不是帶寬的大小,這是一個遠高于帶寬的值)。

這意味着一台伺服器,即使提供視訊服務也遊刃有餘。1w 人同時觀看視訊隻需要不到 20m 的記憶體(資源過剩的浪費)。

既然是流媒體服務(圖檔也是,在浏覽器中快速重新整理,會看到圖檔一點點的渲染),那麼斷點下載下傳很重要,斷點上傳也很重要。

斷點下載下傳:

還是那一行,隻不過多了一個偏移和讀取大小而已,很簡單不是麼。

斷點上傳:

上傳下載下傳就是如此的簡單。

最後,如果需要自定義檔案名的話,可以使用 lfs 的索引(即:key, value)。參考上一篇内容。