HUAN 讙 · 開發者
ADR-0005:本機優先播放
狀態
已採用
背景
播放裝置要怎麼取得要播的影片?
- 從伺服器串流。
- 先下載到本機再播放。
決策
素材必須先完整下載到裝置本機並通過 SHA-256 驗證,才會播放。 正常播放時裝置不會去讀 RustFS。
新版本的切換是原子的:所有檔案就緒之後才切換,任何一個失敗就留在舊版本。
理由
現場網路是整套系統裡最不可靠的一環。 看板裝在賣場後場、電梯口、展場角落,用的是延伸出去的 Wi-Fi 或別人插著的網路線。串流播放意味著網路一抖畫面就卡,網路一斷就是黑畫面。
黑畫面是這個產品最嚴重的失效模式。 一面看板的價值就是它一直亮著。客戶不會知道是網路的問題,他們只會看到自己花錢買的螢幕變成一塊黑板。
先下載讓失敗變得無害。 網路斷了,裝置照播現有內容;新版本下載失敗,裝置照播舊版本。網路問題從「立刻可見的故障」降級成「延遲更新」。
原子切換避免了半新半舊的狀態。 如果邊下載邊切換,使用者會看到左邊已經是新影片、右邊還是舊圖片。全部就緒才切換讓每一次更新都是一次乾淨的轉換。
後果
- 裝置需要足夠的本機儲存空間。這帶來了儲存管理的需求:空間門檻檢查、垃圾回收,以及空間不足時向後台回報。
- 更新有延遲。發布之後裝置要先下載完才會顯示,一支大影片可能要幾分鐘。這對數位看板完全可以接受。
- 絕對不能先刪舊版本再下載新版本。 舊版本的檔案要等新版本成功啟用並經過保留期之後才回收。
- 垃圾回收永遠不能刪除目前啟用版本的素材、下一個排程版本需要的素材,或正在下載的檔案。
替代方案
串流播放:實作簡單、不需要本機儲存,但完全不能接受黑畫面的風險。
串流加上本機快取:看起來兩全其美,實際上是最糟的組合——首播仍然依賴網路,而且要同時維護串流與快取兩套邏輯,失效模式比任何一種單獨的做法都多。