最近看了獵魔女團,不得不說《Soda Pop》真的是一首很洗腦的歌,而且根據我以前操作客戶品牌的經驗(我曾經在奧美擔任實習生一段時間,在學期間),這是一個非常聰明且敏略的策略,透過動畫這個載體來擴張新的客群。
我們先忘掉伺服器和資料庫,現在我們是一家大型娛樂公司(比如 HYBE 或 JYP)的首席製作人。
想像一下,如果我們的公司只經營一個、也是唯一一個超級偶像團體。就算這個團體有 20 個成員,能駕馭所有風格,他們也無法滿足全球所有粉絲的喜好,也無法同時在美洲、歐洲和亞洲舉辦巡迴演唱會。
這時,我們會意識到且不得不面對一個根本問題:沒有任何單一團體可以 無限擴張 (Scale-Up) 以佔領所有市場。
所以我們勢必放棄「打造一個能迎合所有人的超級天團」的幻想,轉而採納「 針對不同市場和粉絲群,推出多個風格差異化的獨立團體 」的策略。
喜歡年輕且具有活力的會是一種客群、喜歡成熟且具有深沉故事性的又會是一種客群,同時,喜歡看到非真人的又會是一種客群。
看到了嗎? 在這個過程中,我們已經不知不覺的進行分片 / 分組策略了 - 這甚至是行銷學的學理!
分片 (Sharding) 的核心哲學,就是 放棄 「打造一個萬能許願機/工具」的幻想,轉而採納「 針對不同需求與背景 ,推出多個風格差異化的解決方案」的策略。這就是「分而治之」,也就是水平擴展 (Scale-Out)。
從粉絲的角度來看,他們可能追的是「HYBE」或「JYP」這個廠牌下的音樂和藝人(單一的邏輯實體)。粉絲只想說:「我要聽最新的 K-Pop」,而不太關心這首歌具體是哪個團體唱的(除非他們是特定團體的粉絲)。
當一個潛在的粉絲(請求)出現時:
因此,整個娛樂帝國在品牌上是統一的,但在音樂產品和粉絲運營上,是由許多個獨立、自治的團體組成的。
graph TD
A[潛在粉絲] --> B[娛樂公司企劃中心 (Routing Layer)<br/>Shard Key: 音樂品味/用戶畫像]
B -- 偏好: Hip-hop, 強烈風格 --> C[分片 1 (Shard 1)<br/>團體 A (e.g., BTS)]
B -- 偏好: 清新, 流行舞曲 --> D[分片 2 (Shard 2)<br/>團體 B (e.g., NewJeans)]
B -- 偏好: 搖滾, 樂團風格 --> E[分片 3 (Shard 3)<br/>團體 C (e.g., DAY6)]
其終極目標不是為了讓單一團體變得更「快」地出新歌,而是為了讓整個公司的影響力版圖變得無比「大」。是為了讓公司的總粉絲數和收入,可以隨著成功團體(伺服器)的增加而線性地增長,從而突破單一團體的市場極限。
所以我們可以整理出 分片策略(Sharding Strategies) 最核心的哲學概念 : 透過需求、特性與情境的區分化,以換取規模的線性擴展
既然我們把粉絲市場切割給不同團體,那麼設計一個好策略的最高指導原則就是:讓絕大多數的粉絲互動,都能在單一團體的生態系內完成,並極力避免需要粉絲同時關注好幾個團體才能獲得完整體驗。
就像我們在上述所提到說根據曲風、團員形象魅力以及團體形象(奶狗/帥氣/魔鬼),我們會有一個基礎的需求( Domain requirement )並希望在這個環境中盡可能快速且完整的滿足我的需求,可能會是有收藏專輯與海報、粉絲互動與牽手會乃至於想要看到偶像團體參加綜藝節目會擔任電影演員。
這引導出三個關鍵的設計原則:
恭喜,現在我們是一名具有領域(Domain)分片策略能力的首席製作人了,未來我們不做軟體工程師,也可以去當一個社交工程師
結束了我們短暫且精彩的的首席製作人生涯,回過頭來看看用資料庫設計的概念怎麼說:
核心的哲學概念 : 透過需求、特性與情境的區分化,以換取規模的線性擴展
關鍵設計三原則 :
水平分片思維脈絡: 業務<=>特性<=>資料生命週期
依據業務邏輯分片:
依據資料特性分片:
分片路由設計:
這是一個以股票交易來說非常常見的情形,我們必須想盡辦法去克服遙遠的距離、氣急敗壞的交易員與咬信號線的鯊魚來完成我們的股票交易。以下是去脈絡化之後所產生的 4 個核心挑戰,也是依循了 業務需求 > 特性 > 資料生命週期的邏輯思考脈絡。
核心挑戰:
1. 地理延遲 (Latency):新加坡到紐約的光纖物理距離導致了數百毫秒的延遲,這在金融交易中是致命的。
2. 資料洪流 (High Velocity):市場行情(Ticks)瞬息萬變,交易指令要求極速響應。
3. 讀寫不對稱 (Read/Write Asymmetry):交易員讀取市場行情的頻率遠高於他們下單(寫入)的頻率。
4. 一致性要求 (Consistency):交易指令的寫入必須是強一致的,不能出錯。
以上是我們面對這個需求時,在長期的開會溝通後所釐清出來的客觀核心需求式樣。但依舊有人所不能及的限制,接下來我們來逐步解析挑戰該如何解決。
核心矛盾:物理定律 vs. 金融需求
首先,為了解決物理問題,我們可以採用的措施是同樣用物理來解決 - 在事件密集發生地直接設立交易服務。我們將最關鍵的寫入延遲降到最低。從撮合引擎到資料庫的寫入必須在微秒或毫秒內完成。
我們可以將所有交易指令的「最終目的地」——寫入主分片,且必須部署在離交易所(如 NYSE, NASDAQ)最近的資料中心,例如 AWS 的 us-east-1(北維吉尼亞),並使用具備 ACID 事務能力的資料庫,如 Amazon RDS (PostgreSQL),確保每一筆交易的原子性和持久性。
這樣架構有沒有很熟悉? 核心功能應用在寫入 看到這個關鍵字的時候我們就必須立刻聯想到 CQRS 讀寫分離策略, 這樣子就能盡可能避免因為延遲錯過交易時機,在紐約的寫入主分片完成交易或接收到市場新行情後,會立即將這些「事件」發布到一個高速數據流服務中(如 Amazon Kinesis)。
然後我們立即將完成的交易成果送回到新加坡交易所
假如這樣做,我們就會立刻吃到延遲的高昂成本了。要注意,我們在讀取的時候,實際上的需求其實是:想要 「立即」 看到具有業務邏輯意涵的 「數據」 。所有的一切我們都必須站在 需求端(Domain) 去進行解析與重構。所以對於這個架構解來說,最好的方式其實是延續 在本地端執行 的概念邏輯,盡可能減少交易完成與後續的業務化數據的執行處理成本,然後將成本段放在相對需求較少的購買策略寫入與交易成果讀取。在新加坡的資料庫架構中,我只需要留存 下單命令 與 交易成效 的資料庫即可。
這個架構的核心哲學是:將 「改變事實的行為(交易)」 與 「詮釋事實結果的業務邏輯(分析與呈現)」 在 地理上 和 系統上 徹底分離。
graph TD
subgraph "新加坡區域 (ap-southeast-1)"
A[用戶瀏覽器/App<br/><b>AWS Amplify</b>] --> B[<b>Amazon API Gateway</b><br/>(Edge-optimized)]
B --> |讀取請求 (GET)| L[查詢服務<br/><b>AWS Lambda</b>]
L --> M[<b>Amazon Aurora Global DB (Read Replica)</b><br/>唯讀副本]
M --> L --> B --> A
B -- |寫入請求 (POST)| C
end
subgraph "AWS 全球骨幹網路"
C[<b>AWS Global Accelerator</b><br/>優化路由,降低跨洋延遲] --> D
end
subgraph "紐約/北維吉尼亞區域 (us-east-1)"
D[<b>Amazon API Gateway</b><br/>(Regional Endpoint)] --> E[命令處理服務<br/><b>AWS Lambda / AWS Fargate</b>]
E --> F[<b>Amazon Aurora Global DB (Primary)</b><br/>寫入主庫]
F -- 觸發 (CDC) --> G[<b>Amazon Kinesis Data Streams</b><br/>原始交易事件流]
G --> H[事件增值服務<br/><b>AWS Lambda</b>]
H --> I[<b>Amazon EventBridge</b><br/>高階業務事件總線]
end
subgraph "跨區域數據同步"
I -- EventBridge 跨區域規則 --> J[<b>Amazon EventBridge (新加坡)</b>]
F -- Aurora Global DB 物理複製 (<1s) --> M
end
subgraph "新加坡區域 (ap-southeast-1) - 狀態更新"
J --> K[<b>Amazon SQS</b><br/>緩衝與解耦]
K --> L_update[查詢模型更新服務<br/><b>AWS Lambda</b>]
L_update --> M
end
style M fill:#e8f5e8,stroke:#388e3c,stroke-width:2px
style F fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
流程詳解
這一步是設計的精髓。一個或多個 「交易濃縮/增值服務」(通常是 Lambda 函數)會訂閱 Kinesis 流。
當它收到 TradeExecutedV1 事件後,它會執行你所說的「業務邏輯處理」。例如:
處理完成後,它不會直接回傳數據,而是產生一個或多個 全新的、具有豐富業務意涵的高階事件,例如 PortfolioValueUpdated
、TradeProfitCalculated
或 RiskThresholdBreached
。 5.高階事件分發與回傳(紐約 → 新加坡)
這些高階事件被發布到 Amazon EventBridge。EventBridge 擅長基於內容的智能路由。
我們在 EventBridge 上設定一條「跨區域規則」,將所有來自紐約的這些高階事件,轉發到新加坡區域的 EventBridge 總線上。 6.本地狀態更新(在新加坡內部)
新加坡的 EventBridge 接收到事件後,觸發本地的 「查詢模型更新服務」。
該服務解析事件內容,並更新專門為新加坡用戶優化的 「本地讀取資料庫」。這個資料庫可能是 Aurora 的讀取副本,或是 DynamoDB 表。它的結構是反正規化的,完全為了快速查詢而設計。
設計的優勢總結
總結來說,分片策略是一門關於 「切割」 與 「權衡」 的藝術。它的核心是為了應對「規模」這個 終極挑戰 ,其手段是將一個大問題拆解成無數個小問題,並通過精巧的設計,讓絕大多數請求都變成簡單的小問題來解決。