Spotify 成功案例 – 如何將服務搬上 GCP?7 大關鍵技術決策完整解析

Spotify 雲端遷移 GCP 的 7 大技術決策一覽:

決策主題選擇核心原因
遷移策略Lift and Shift + Rewrite 並行停機代價決定做法
容器管理自研 Helios → GKE消除 Toil,CPU 使用率翻倍
強一致性資料Cloud Spanner全球同步、銀行等級一致性
大量寫入資料Cloud Bigtable播放紀錄的 Append-heavy 場景
音訊檔案Cloud Storage + CDN全球低延遲傳輸
資料分析Hadoop → BigQuery查詢從小時縮為分鐘
事件傳遞Pub/Sub + Dataflow推薦演算法的即時資料餵養

一、為什麼 Spotify 要把機房搬到 GCP?

1.1 自建機房的核心痛點:容量規劃跟不上成長速度

Spotify 用戶從幾百萬成長到幾億,自建機房出現兩個致命問題:

問題一:容量規劃太慢。 流量爆增時,得先訂機器、等到貨、安裝、設定,流程少則幾週、多則幾個月。 網路流量不等人。

問題二:工程師時間全被吃掉。 機器壞了要換、系統有漏洞要自己修、軟體版本要自己升級。 做一百次,產品也沒有變更好,只是維持現狀。

2016 年,Spotify 決定把基礎設施維護工作交給 Google,讓自己的工程師去開發新功能。

1.2 遷移的核心挑戰:系統不能停

每一秒都有幾千萬用戶在聽歌。 停機哪怕五分鐘,就是幾千萬人同時看到錯誤畫面。

這個前提,決定了後面所有技術決策的方向。


二、GCP 雲端遷移策略:Lift and Shift vs. Rewrite

2.1 Lift and Shift(直接搬):核心播放功能

原封不動搬過去,不改任何程式碼、不動任何架構。

適用場景: 一停就出事的核心服務。 任何改動都是風險,先求搬過去,不求完美。

2.2 Rewrite(趁機重寫):資料分析系統

搬家的同時,把 Hadoop 整個換掉,改用 BigQuery 和 Dataflow。

適用場景: 出問題代價相對可控的內部系統。 反正都要搬了,順手把舊包袱一起處理掉。

2.3 判斷標準只有一個

直接搬,還是趁機重寫?

這個服務如果在遷移中出問題,代價是什麼?

代價極高 → Lift and Shift,把風險降到最低。 代價可以接受 → Rewrite,一步到位。

完整搬遷可參考此文章:《地端主機如何搬上GCP?各種方法和步驟詳解》


三、GKE 容器管理:從自研 Helios 到 Google 全代管

3.1 什麼是 Control Plane?

Spotify 的產品不是一個大程式,而是幾百個小程式組成的。

誰決定哪個程式跑在哪台機器上? 誰決定流量爆增時要多開幾個副本? 誰決定這台機器掛了,要把程式搬去哪?

這個負責做決策的角色,就是 Control Plane。

3.2 Helios 的問題:Toil

Spotify 原本有自研的 Control Plane,叫做 Helios。 功能沒問題,但維護非常累。

每次 Linux 有安全漏洞,Spotify 要自己分析、自己開發修補、自己測試、自己部署。 每次版本升級,要自己測所有相容性。 出了問題,要自己找原因、自己修。

這種「重複做、做了系統也沒有變更好」的維運工作,叫做 Toil。 Toil 是工程師效率最大的殺手。

Helios 必須要自己維護,使用 GKE 能省去維護工作,專注於創新開發

3.3 換用 GKE:CPU 使用率從 10% 提升到 20-25%

Google 接管 Control Plane 後,安全更新、版本升級全部自動處理。

但 GKE 帶來的不只是省力,還有意外的效能提升:CPU 使用率從約 10% 提升到 20-25%。

這來自 Bin Packing(裝箱最佳化)

以前每個服務獨佔一台機器,大部分時間閒置。 GKE 把多個服務智慧塞進同一台機器,讓每台機器都跑得飽。 同樣的工作量,需要的機器更少,費用自然降了。

3.4 GKE 計費方式:選錯差很多

資源型計費: 按程式實際佔用多少資源收費。適合一般 Web 服務。

節點型計費: 按你開了幾台機器收費。適合需要指定特定硬體(例如 GPU)的情況。

Spotify 需要用 GPU 跑 AI 推理,選的是節點型計費。 使用情境不同,兩種計費方式的費用差距可能非常顯著。導入前一定要先評估清楚。


四、三層資料儲存架構:不同資料用不同工具

4.1 Cloud Spanner:播放清單與帳號的全球一致性

負責的資料: 播放清單、帳號資料。

核心需求:全球一致性。

你在台北更新播放清單,加了一首歌。 你在紐約的朋友馬上開 Spotify,看到的應該是最新版本。

這個特性叫做 External Consistency(外部一致性)。 Spanner 是少數能提供這個保證的資料庫。

背後技術:TrueTime

Spanner 在全球所有資料中心安裝原子鐘,確保所有機器的時間誤差不超過 7 毫秒。 靠這個保證,才能準確判斷全球資料的先後順序。

代價: Spanner 的回應速度比一般資料庫慢 4 到 10 倍。 資料不需要全球即時同步的話,用 Spanner 只是白花錢。

Spanner 的外部一致性,代價是速度會被拖慢

4.2 Cloud Bigtable:播放紀錄與 Wrapped 年度回顧

負責的資料: 播放紀錄、歌曲播放次數。

核心需求: Append-heavy(大量新增)的場景。

用戶每播一首歌,就新增一筆紀錄。 幾乎不需要修改或刪除舊紀錄。

這些播放紀錄累積起來,就是每年 Spotify Wrapped 的原料。

設計細節:Key 要先 Hash

直接用用戶 ID 當 Key 會出問題。 熱門用戶的資料會集中在少數幾台機器,那幾台機器撐不住,效能就下降。

Spotify 的解法:先把用戶 ID 打亂(Hash)再當 Key,讓資料均勻分散。

這個細節官方文件裡有寫,很多人跳過,等到系統出問題才回頭翻,改架構的代價很高。

Spotify 先把用戶 ID 打亂(Hash)再當成 Bigtable 的 Key

4.3 Cloud Storage + CDN:音訊檔案全球傳輸

負責的資料: 音訊檔案、封面圖片。

音訊檔案不是直接從 Cloud Storage 傳給用戶,中間還有一層 Cloud CDN

CDN 把熱門歌曲的音訊檔案預先放到離用戶最近的節點。 台北的用戶聽歌,資料從台灣本地節點傳來,不用繞到美國,延遲短、速度快。

沒有 CDN 這層,全球幾億用戶的請求全打到同一個地方,跨洲頻寬費用就會讓帳單失控。

Spotify 透過 Cloud CDN 把音檔從 Cloud Storage 傳送給全球用戶

五、BigQuery:資料查詢從幾小時縮為幾分鐘

5.1 從 Hadoop 到 BigQuery

Hadoop 有兩個明顯缺點:

速度慢: 複雜查詢需要幾小時,有時幾天。

維運人力高: 需要專職工程師每天照顧,調整機器、處理卡住的任務、管理版本升級。

換成 BigQuery 之後:

查詢速度: 同複雜度的查詢,從幾小時縮短到幾分鐘。 維運人力: BigQuery 是全代管服務,基礎設施的維護、擴容、備份、升級,Google 全部處理。

5.2 BigQuery 定價:按量計費 vs. 固定容量

按量計費(預設): 每 TB 約 6.25 美元。適合資料量小的公司。

固定容量計費: 預先購買運算容量,費用可預測。適合資料量大、使用量穩定的公司。

Spotify 這種規模早就改成固定容量計費了。

如果你的 BigQuery 帳單一直在漲,研究一下固定容量選項。 有時候一個計費方式的調整,就能讓帳單砍半。

BigQuery 固定費用 (Flat rate)

了解更多 BigQuery 可參考:《BigQuery 是什麼?功能、組成元件、特色和優勢完整介紹

六、Pub/Sub + Dataflow:事件驅動架構的兩個設計眉角

Pub/Sub 的 At-least-once Delivery 和 Dataflow 的冪等性(Idempotency)

6.1 At-least-once Delivery:同一則訊息可能送兩次

用戶播一首歌,會觸發一連串反應: 計費系統扣版稅、推薦系統更新喜好模型、播放紀錄系統記錄這次播放。

負責傳遞這些通知的是 Pub/Sub

Pub/Sub 的特性:At-least-once Delivery(至少送達一次)。

它保證訊息一定送到,但在網路不穩定、接收方沒及時確認的情況下,同一則訊息可能送兩次甚至更多次。

了解 Pub/Sub 更多可參考《Cloud Pub/Sub 教學:比 RabbitMQ 好用,無限擴充的訊息佇列服務》

6.2 冪等性(Idempotency):計費系統的必要設計

訊息可能重複,計費系統就必須有 冪等性

「用戶播放 A 歌曲」的通知,就算送來三次,系統只能扣一次版稅、記錄一次播放。

實作方式有兩種:

一、每個事件附加唯一 ID(Event ID),收到訊息前先確認這個 ID 有沒有處理過。 二、把操作設計成「就算重複執行,結果也不變」的形式。

任何依賴事件驅動架構的系統,冪等性不是選配,是必須的。

6.3 Dataflow:推薦演算法的資料來源

Dataflow 把即時的播放記錄和用戶歷史行為合併,做計算和轉換,把結果餵給推薦演算法。

Dataflow 處理的是 串流資料(Streaming Data),也就是即時、持續湧入的資料流。 這讓推薦系統能快速響應用戶的行為,你剛聽完一首歌,推薦結果很快就會反映。


七、VPC 網路架構:一個初期沒注意的限制,代價極高

VPC Peering 不支援 Transitive Routing

7.1 VPC Peering 不支援 Transitive Routing

Spotify 的每個工程團隊有獨立的 GCP 專案,用 VPC Peering 讓不同團隊的服務互相通訊。

VPC Peering 有一個關鍵限制:不支援 Transitive Routing(轉傳路由)。

A 網路和 B 網路打通了、B 網路和 C 網路打通了。 但 A 網路的服務,不能透過 B 網路去存取 C 網路。 A 和 C 之間必須再建立一個獨立的 VPC Peering 連線。

服務只有幾個時,影響不大。 服務成長到幾百個、幾千個,需要互相連線的組合數量就會爆炸性增長,管理幾千條 Peering 連線本身就是巨大的維運負擔。

網路架構設計要在初期就考慮擴展性。 等問題出現再來改,代價是初期就設計好的幾十倍。

7.2 Workload Identity:容器的存取權限管理

Spotify 採用 Workload Identity 讓容器安全存取 GCP 上的其他服務

GKE 的 Workload Identity 讓容器安全存取 GCP 上的其他服務。

每個容器啟動時,GCP 自動發給它一組識別憑證,記錄這個容器有哪些存取權限。

相比傳統做法(把密碼寫在設定檔裡)的優勢: 設定檔傳錯地方、被包進映像檔推上公開倉庫,都可能造成嚴重的安全事故。 Workload Identity 的憑證不存在任何地方,大幅降低外洩風險。


速查表:這篇文章的判斷框架

問題答案
遷移時,這個服務停下來的代價高不高?高 → Lift and Shift;低 → Rewrite
資料需要全球即時一致?是 → Cloud Spanner;否 → 考慮其他方案
資料是大量寫入、幾乎不修改?是 → Cloud Bigtable
BigQuery 帳單一直在漲?評估固定容量計費
事件驅動架構的業務邏輯冪等性是必須的,不是選配
網路架構設計VPC Peering 不支援 Transitive Routing,初期就要考慮進去

常見問題 FAQ

Q1:Spotify 的雲端遷移總共花了多少時間? Spotify 從 2016 年開始將服務逐步遷移到 GCP,到 2023 年時已幾乎完成整個遷移過程,前後歷時約七年。這麼長的時間,主要是因為遷移過程中服務不能中斷,必須以滾動式、漸進式的方式進行。

Q2:什麼是 Lift and Shift?適合哪種情境? Lift and Shift 是一種雲端遷移策略,指的是將服務原封不動地搬到雲端,不修改任何程式碼或架構。這種方式最適合「停機代價非常高」的核心服務——因為任何改動都是風險,直接搬過去能把遷移風險降到最低。代價是舊有的技術債也會一起帶過去。

Q3:GKE 是什麼?和自己管理 Kubernetes 有什麼差別? GKE(Google Kubernetes Engine)是 Google 提供的全代管 Kubernetes 服務。和自己管理 Kubernetes 最大的差別在於:安全更新、版本升級、Control Plane 的維護,全部由 Google 負責,使用者只需要專注在自己的應用程式上。這能大幅減少工程師花在維運上的 Toil 時間。

Q4:Cloud Spanner 的外部一致性(External Consistency)和一般資料庫有什麼不同? 一般的分散式資料庫通常提供的是「最終一致性」(Eventual Consistency)——也就是資料更新後,不同節點的資料可能有短暫的不一致,但最終會同步。Spanner 的外部一致性提供更強的保證:一筆資料寫入之後,全球任何地方的讀取都能立刻看到最新的版本,就像銀行帳戶的操作一樣。

Q5:Bigtable 的 Key 設計為什麼重要? Bigtable 會把相近的 Key 存放在同幾台機器上。如果直接用連續性的 ID 當 Key(例如遞增的用戶 ID),熱門用戶的資料就會集中在少數機器上,造成「熱點」問題,讓那幾台機器過載、整體效能下降。先對 Key 做 Hash 處理,可以讓資料均勻分散到所有機器,避免熱點。

Q6:什麼是 Toil?工程師為什麼要減少它? Toil 指的是重複性的、手動的、對系統沒有長期改善效果的維運工作。例如每天手動重啟某個服務、手動處理積壓的任務、手動更新設定檔等。Toil 不只讓工程師感到無聊和挫折,更重要的是它直接佔用了工程師的時間,讓他們沒有精力去做真正有創造力、有長遠價值的工作。

Q7:Pub/Sub 的 At-least-once Delivery 為什麼不設計成 Exactly-once(剛好一次)? Exactly-once 的保證在分散式系統中實作成本非常高,因為要確保訊息剛好送達一次,需要複雜的協調機制,而這些機制本身也有失敗的可能性。業界的普遍做法是選擇 At-least-once(保證至少送達),然後在應用層實作冪等性來處理重複訊息,這樣能在可靠性和效能之間取得比較好的平衡。

Q8:CDN(內容遞送網路)對音樂串流服務有多重要? CDN 對 Spotify 這類全球性的串流服務幾乎是不可或缺的。沒有 CDN,台灣用戶播放一首歌的請求可能要繞到美國的伺服器,光是網路延遲就可能讓音樂無法即時播放。CDN 把熱門內容預先放到離用戶最近的節點,不只改善了使用體驗,也大幅降低了跨洲際的頻寬費用。

Q9:VPC Peering 的 Transitive Routing 限制有沒有替代方案? 有。Google Cloud 提供了 Cloud VPNCloud Interconnect 作為替代或補充方案,也有 Shared VPC 的架構可以讓多個專案共用同一個網路,減少需要建立 VPC Peering 的數量。另外,使用服務網格(Service Mesh)如 Anthos Service Mesh,也可以在不依賴 VPC Peering 的情況下管理服務間的通訊。

Q10:Spotify 的雲端遷移經驗適用於中小型公司嗎? 核心原則是適用的,但規模不同,決策的優先序也不同。對中小型公司來說,最重要的啟發可能是:善用雲端的全代管服務(Managed Services)來減少維運負擔,把有限的工程師資源集中在核心產品上;以及在技術選型初期就把擴展性和成本控制考慮進去,避免後期需要痛苦的架構大改。

原始案例參考:https://cloud.google.com/customers/spotify

Table of Contents
返回頂端