完整內容,請至幹話王 System Design Interview Ch 12 Digital Wallet
本文內容的章節是來自內行人才知道的系統設計面試指南 vol2
| 角色 | 對話內容 |
|---|---|
| 面試者 | 我們應該只關注兩個數位錢包之間的餘額轉帳操作嗎?我們是否需要擔心其他功能? |
| 面試官 | 讓我們只關注餘額轉帳操作。 |
| 面試者 | 該系統需要支援多少 TPS(每秒交易次數)? |
| 面試官 | 讓我們假設是 1,000,000 TPS (每秒 100 萬次交易)。 |
| 面試者 | 數位錢包對正確性有嚴格的要求。我們可以假設事務保證 就足夠了嗎? |
| 面試官 | 聽起來不錯。 |
| 面試者 | 我們需要證明正確性嗎? |
| 面試官 | 這是一個很好的問題。正確性(Correctness)通常只有在交易完成後才能驗證。一種驗證方法是將我們的內部記錄與銀行對帳單進行比較。對帳的局限性在於它只顯示差異,無法說明差異是如何產生的。因此,我們希望設計一個具有**可重現性(Repoducibility)**的系統,這意味著我們可以透過從頭開始重放數據,隨時重建歷史餘額。 |
| 面試者 | 我們可以假設可用性要求是 99.99% 嗎? |
| 面試官 | 聽起來不錯。 |
| 面試者 | 我們需要考慮外匯嗎? |
| 面試官 | 不,這超出了本次討論範圍。 |
摘要:
• 高吞吐量 (TPS): 系統需要支援每秒 1,000,000 次交易 (1,000,000 TPS)。
• 可靠性: 系統的可靠性必須至少達到 99.99%。
• 事務與一致性: 必須支援交易 (transactions),以確保資料的正確性。
• 可重現性 (Reproducibility): 系統需要具備從頭開始重放資料來重建歷史餘額的能力
1. 估算的前提與假設
• 背景: 討論 TPS 時,通常假設系統將使用事務型資料庫 (transactional database)。
• 性能基準: 來源指出,現今運行在典型資料中心節點上的關係型資料庫,大約可以支援每秒幾千次事務。
• 單節點假設: 為了進行估算,假設一個資料庫節點可以支援 1,000 TPS(每秒 1,000 次事務)。
• 目標負載: 系統必須支援 1,000,000 TPS(每秒 1 百萬次交易)。
2. 初始計算與修正
這個估算過程的關鍵點在於,交易數(轉帳次數)並不等同於實際的資料庫操作數。
1. 初始(不準確的)計算: 如果系統需要 1,000,000 TPS,而每個資料庫節點能處理 1,000 TPS,那麼初始估算需要 1,000 個資料庫節點(1,000,000 / 1,000 = 1,000)。
2. 關鍵修正(實際操作數): 這個計算被認為是稍微不準確的。這是因為每個轉帳指令 (transfer command) 需要兩個操作:
◦ 從一個帳戶扣除資金 (deducting money)。
◦ 向另一個帳戶存入資金 (depositing money)。
3. 最終所需的節點數量: 為了支援每秒 1 百萬次的轉帳,系統實際上需要處理高達 2 百萬次 TPS(2,000,000 TPS,即 2 百萬次操作)。 因此,根據每個節點 1,000 TPS 的假設,系統需要 2,000 個節點(2,000,000 / 1,000 = 2,000 節點)來支援此負載。
3. 對設計的影響
這個粗略估算直接影響了設計目標,因為所需節點的總數與單節點可處理的事務次數成反比:
• 設計目標: 降低所需的總節點數量是設計目標之一,這意味著必須增加單一節點可以處理的事務數量 (per-node TPS)。單節點的 TPS 越高,所需的硬體成本就越低。
來源提供了 TPS 與所需節點數量的映射表(Table 12.1),進一步說明了這種關係:
| 每節點 TPS (Per-node TPS) | 所需節點數量 (Node Number) |
|---|---|
| 100 | 20,000 |
| 1,000 | 2,000 (此為計算結果) |
| 10,000 | 200 |
總結來說,粗略估算確定了數位錢包系統為了處理 1 百萬次轉帳的負載,需要數千個資料庫節點,這為後續討論分區 (sharding)、分佈式事務 (distributed transactions) 以及如何提高單節點效率奠定了基礎。