跳至主要內容

500 台 EC2 同時轉檔的日子——CatchPlay

500 台 EC2 同時轉檔的日子——CatchPlay
我的職涯地圖:一個工程師的 20 年回顧 第 5 / 12 篇 ,前往系列總覽

本篇是「我的職涯地圖:一個工程師的 20 年回顧」系列的第 5 / 12 篇。你可以從系列總覽開始閱讀,也可以直接接著看本文。

2016 年六月,我加入了 CatchPlay。

CatchPlay 是一家影音串流平台公司,簡單說就是台灣版的 Netflix。走進這家公司,我遇到了職涯中第一個真正讓我覺得「天啊這也太酷了」的技術挑戰。

從零打造全自動影音轉檔系統

在影音串流的世界裡,你在手機上點開一部電影看到的畫面,背後經歷了一段極其複雜的處理過程。一部電影的原始檔案可能有幾十 GB,需要被轉成各種解析度、各種位元率的版本,才能讓不同裝置、不同網速的使用者都能順暢觀看。這個過程叫做「轉檔」(transcoding),而我的任務就是打造一套全自動的轉檔系統。

技術選型上,我做了一個當時相當大膽的決定:用 Elixir + Phoenix。

為什麼選 Elixir?因為它站在巨人的肩膀上。Elixir 跑在 Erlang VM(BEAM)上——Erlang 原本是愛立信為了電信系統設計的語言,天生就是為了同時處理幾百萬通電話而生的。它的 Actor Model 讓你可以輕鬆開出成千上萬個輕量級 Process,每個 Process 獨立運作、互不干擾,掛了一個不會影響其他的。用這種架構來管理數百台機器的轉檔工作流程,簡直是天作之合——每一台 EC2 的轉檔任務就是一個 Process,系統可以同時追蹤所有任務的狀態,任何一台機器掛了就自動重新分配。

Phoenix 是 Elixir 的 Web 框架,類似 Ruby on Rails 但效能好上幾個數量級(因為底層是 Erlang VM 而不是 Ruby VM)。我用 Phoenix 建了管理介面和 API,搭配 FFmpeg(開源的影音處理瑞士刀)做實際的轉碼,再用 Shell Script 把各種操作串起來,整套系統從零開始建構。

最瘋狂的時候,這套系統同時控制超過 500 台 AWS EC2 Instance 進行轉檔。想像一下,500 台虛擬機器同時在雲端上跑,你要管理它們的啟動、任務分配、進度監控、錯誤處理、自動重試、成本控制——任何一個環節出問題,就是一堆影片卡在那裡無法上架。

我完成了 Internal API 的設計、前台和後台的功能規劃、資料表結構的設計,整個系統的核心架構都是我一手搭建的。

影片 DRM 和那些技術細節

轉檔只是第一步,影片保護是另一個大課題。

我負責實作了 Widevine(Google 的 DRM 方案,用在 Chrome 和 Android)和 FairPlay(Apple 的 DRM 方案,用在 Safari 和 iOS)兩套數位版權管理系統。同時要支援 DASH 和 HLS 兩種串流格式——DASH 是 Google 主推的自適應串流協議,HLS 是 Apple 的。簡單說,你的影片要能根據使用者的網速自動切換畫質,4G 順暢的時候播 1080p,訊號差的時候自動降到 480p,而且全程加密防盜版。

這些聽起來很枯燥的技術縮寫,背後代表的是一個完整的影片保護和播放體驗。每一個環節出錯——加密金鑰沒對上、串流格式切不過去、DRM 授權過期——使用者看到的就是黑畫面和錯誤訊息。

同時,影片 API 要供各平台的播放器串接使用。搭配 Redis 做熱門影片的快取(避免每次都去查資料庫),Elasticsearch 做影片搜尋和推薦(它能快速在數萬部影片中做全文搜尋和多維度過濾)。目標是使用者點下播放的那一刻,影片能在最短時間內開始播放。每一毫秒的延遲都可能讓使用者按下返回鍵。

便利小工具:讓同事的日子好過一點

在 CatchPlay 最讓我有成就感的,不是那套壯觀的 500 台機器轉檔系統,而是一些「小事」。

我注意到同事們每天都有很多繁雜的重複操作:檢查 S3 bucket 的檔案狀態、調整字幕的 TimeCode、部署 CDN、清除 CDN 快取。每一件事單獨做不難,但每天重複做就是一種折磨。

所以我開發了一系列便利小工具:S3 bucket 檔案掃描工具、字幕 TimeCode 調整工具、加速 CDN 部署工具、Purge CDN cache 工具。這些工具技術含量不高,但每一個都是從同事的日常痛點出發,幫他們把十分鐘的操作縮短到十秒鐘。

我也舉辦了 Workshop,帶領團隊入門 Elixir 和 Phoenix 的開發。那時候 Elixir 在台灣還非常冷門,很多同事是第一次接觸函數式程式語言。看著他們從一臉困惑到開始寫出自己的第一個模組,那種感覺很棒。

同時,影片管理後台是我帶領團隊用 PHP + Laravel + jQuery + Bootstrap 開發的。我負責規劃技術文件、進行教育訓練、舉辦 Workshop 帶團隊實戰練習。

技術長的 BMW

趕專案的時候,加班到半夜是常有的事。有一次忙到凌晨十二點多,準備離開辦公室,發現公司已經沒有人了——除了技術長。

他看到我還沒走,問我住哪裡。我說淡水。他說太晚了搭捷運不安全,開車送我回去。

那是一台 BMW。我這輩子第一次坐 BMW,竟然是被技術長從公司載回家。車上我們聊了一路技術和產品的事,那種深夜裡兩個工程師對著夜色聊天的畫面,到現在想起來還是覺得很溫暖。

最值得信賴的共事夥伴

離開 CatchPlay 的時候,同事匿名互評的結果出來,我拿到了最高分,並且被評為「最值得信賴的共事夥伴」。

這個評價比任何績效獎金都讓我開心。它代表的不是我的技術多厲害,而是我在團隊裡的存在讓大家覺得安心。知道有一個人會在你需要的時候幫你一把,知道有一個人寫的工具可以讓你的工作輕鬆一點,知道有一個人會在半夜陪你一起 debug。

CatchPlay 教會我的是:一個好的工程師,不只是能寫出好的程式,更是能讓整個團隊一起變好的人。那些便利小工具的價值,遠大於任何一個華麗的系統架構。

帶著這份信念,2017 年底,我前往了下一站——一個直播電商的新部門,一段充滿混亂和驚喜的旅程。

留言討論

esc
輸入關鍵字搜尋文章...
查看收藏 →