<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Oltp on Tarragon</title><link>https://tarrragon.github.io/blog/tags/oltp/</link><description>Recent content in Oltp on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Wed, 13 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/oltp/index.xml" rel="self" type="application/rss+xml"/><item><title>1.11 全球分散式 OLTP</title><link>https://tarrragon.github.io/blog/backend/01-database/global-distributed-oltp/</link><pubDate>Wed, 13 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/01-database/global-distributed-oltp/</guid><description>&lt;h2 id="概念定位">概念定位&lt;/h2>
&lt;p>全球分散式 OLTP 解決一個傳統 DB 做不到的問題：跨地理位置 &lt;em>同時&lt;/em> 維持強一致性、低延遲、高可用性。&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/cap/" data-link-title="CAP Theorem" data-link-desc="分散式系統在網路分區時一致性與可用性的取捨框架">CAP 定理&lt;/a>過往把這視為「三選二」，但近 15 年的工程進展（Google Spanner、AWS Aurora DSQL、CockroachDB、Microsoft Cosmos DB 等）顯示「在投入 &lt;em>專屬硬體&lt;/em> 或 &lt;em>特殊演算法&lt;/em> 的條件下、可以同時拿到 strong consistency + global distribution + 可接受 latency」。&lt;/p>
&lt;p>本章整理這類系統的工程設計、容量取捨、跟傳統 single-region OLTP 的差異。讀完後讀者能回答：什麼業務需求需要 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/global-oltp/" data-link-title="Global OLTP" data-link-desc="跨地理區域仍維持交易一致性的 OLTP 設計責任與代價">global OLTP&lt;/a>、跨 region &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/quorum/" data-link-title="Quorum" data-link-desc="分散式系統以多數節點同意作為提交或讀取有效性的門檻">quorum&lt;/a> 的延遲代價、選 Spanner vs Aurora DSQL vs Cosmos DB 的決策依據。&lt;/p>
&lt;p>跟 &lt;a href="https://tarrragon.github.io/blog/backend/01-database/transaction-boundary/" data-link-title="1.3 Transaction 與一致性邊界" data-link-desc="交易邊界、isolation level、retry 策略、distributed transaction（2PC、Saga）與跨 region 強一致取捨">1.3 Transaction Boundary&lt;/a> 的關係：1.3 處理 single-region OLTP 的 transaction 設計、本章處理 multi-region OLTP 的特殊取捨。&lt;/p>
&lt;p>跟 &lt;a href="https://tarrragon.github.io/blog/backend/01-database/kv-document-capacity-planning/" data-link-title="1.10 KV / Document DB 容量規劃" data-link-desc="DynamoDB / Cosmos DB / Bigtable / MongoDB 等 KV / Document DB 的容量設計、partition key 取捨、capacity mode 選擇">1.10 KV / Document DB 容量規劃&lt;/a> 的關係：1.10 KV 通常 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/eventual-consistency/" data-link-title="Eventual Consistency" data-link-desc="允許短暫不一致、最終收斂到同一資料狀態的一致性語意">eventual consistency&lt;/a> 全球分散容易、本章處理 &lt;em>強一致&lt;/em> 全球分散的工程挑戰。&lt;/p>
&lt;h2 id="cap-跟-pacelc理論工具">CAP 跟 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/pacelc/" data-link-title="PACELC" data-link-desc="在 CAP 之外補上正常時段的延遲與一致性取捨框架">PACELC&lt;/a>：理論工具&lt;/h2>
&lt;p>選擇全球 DB 前要先理解兩個理論框架。&lt;/p>
&lt;p>&lt;strong>&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/cap/" data-link-title="CAP Theorem" data-link-desc="分散式系統在網路分區時一致性與可用性的取捨框架">CAP 定理&lt;/a>&lt;/strong>：分散式系統 &lt;em>發生分區（network partition）&lt;/em> 時、必須在 Consistency 跟 Availability 二選一。&lt;/p>
&lt;ul>
&lt;li>CP 系統：強一致、partition 時拒絕服務（Spanner、Cosmos DB strong）&lt;/li>
&lt;li>AP 系統：高可用、partition 時可能回舊資料（Cassandra、DynamoDB Global Tables）&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>PACELC（Daniel Abadi 提出）&lt;/strong>：擴充 CAP、加上「沒 partition 時」的取捨。&lt;/p>
&lt;ul>
&lt;li>沒 partition 時：Latency vs Consistency 二選一&lt;/li>
&lt;li>結合表示：PA/EL（partition 時選 Availability、平時選 Latency）vs PC/EC（partition 時選 Consistency、平時選 Consistency）&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>工程含義&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>Spanner、Aurora DSQL、Cosmos DB strong：PC/EC — 永遠選一致、付出 latency&lt;/li>
&lt;li>Cassandra、DynamoDB Global Tables：PA/EL — 永遠選快、付出可能不一致&lt;/li>
&lt;li>Cosmos DB session：PA/EL 但對同一 session 內保持 EC — 妥協方案&lt;/li>
&lt;/ul>
&lt;p>選 global DB 不是「哪個最好」、是「業務需要哪一邊」。金融交易、ticketing inventory、payment ledger 通常需要 EC；社群 feed、推薦、analytics 通常 EL 夠用。&lt;/p></description><content:encoded><![CDATA[<h2 id="概念定位">概念定位</h2>
<p>全球分散式 OLTP 解決一個傳統 DB 做不到的問題：跨地理位置 <em>同時</em> 維持強一致性、低延遲、高可用性。<a href="/blog/backend/knowledge-cards/cap/" data-link-title="CAP Theorem" data-link-desc="分散式系統在網路分區時一致性與可用性的取捨框架">CAP 定理</a>過往把這視為「三選二」，但近 15 年的工程進展（Google Spanner、AWS Aurora DSQL、CockroachDB、Microsoft Cosmos DB 等）顯示「在投入 <em>專屬硬體</em> 或 <em>特殊演算法</em> 的條件下、可以同時拿到 strong consistency + global distribution + 可接受 latency」。</p>
<p>本章整理這類系統的工程設計、容量取捨、跟傳統 single-region OLTP 的差異。讀完後讀者能回答：什麼業務需求需要 <a href="/blog/backend/knowledge-cards/global-oltp/" data-link-title="Global OLTP" data-link-desc="跨地理區域仍維持交易一致性的 OLTP 設計責任與代價">global OLTP</a>、跨 region <a href="/blog/backend/knowledge-cards/quorum/" data-link-title="Quorum" data-link-desc="分散式系統以多數節點同意作為提交或讀取有效性的門檻">quorum</a> 的延遲代價、選 Spanner vs Aurora DSQL vs Cosmos DB 的決策依據。</p>
<p>跟 <a href="/blog/backend/01-database/transaction-boundary/" data-link-title="1.3 Transaction 與一致性邊界" data-link-desc="交易邊界、isolation level、retry 策略、distributed transaction（2PC、Saga）與跨 region 強一致取捨">1.3 Transaction Boundary</a> 的關係：1.3 處理 single-region OLTP 的 transaction 設計、本章處理 multi-region OLTP 的特殊取捨。</p>
<p>跟 <a href="/blog/backend/01-database/kv-document-capacity-planning/" data-link-title="1.10 KV / Document DB 容量規劃" data-link-desc="DynamoDB / Cosmos DB / Bigtable / MongoDB 等 KV / Document DB 的容量設計、partition key 取捨、capacity mode 選擇">1.10 KV / Document DB 容量規劃</a> 的關係：1.10 KV 通常 <a href="/blog/backend/knowledge-cards/eventual-consistency/" data-link-title="Eventual Consistency" data-link-desc="允許短暫不一致、最終收斂到同一資料狀態的一致性語意">eventual consistency</a> 全球分散容易、本章處理 <em>強一致</em> 全球分散的工程挑戰。</p>
<h2 id="cap-跟-pacelc理論工具">CAP 跟 <a href="/blog/backend/knowledge-cards/pacelc/" data-link-title="PACELC" data-link-desc="在 CAP 之外補上正常時段的延遲與一致性取捨框架">PACELC</a>：理論工具</h2>
<p>選擇全球 DB 前要先理解兩個理論框架。</p>
<p><strong><a href="/blog/backend/knowledge-cards/cap/" data-link-title="CAP Theorem" data-link-desc="分散式系統在網路分區時一致性與可用性的取捨框架">CAP 定理</a></strong>：分散式系統 <em>發生分區（network partition）</em> 時、必須在 Consistency 跟 Availability 二選一。</p>
<ul>
<li>CP 系統：強一致、partition 時拒絕服務（Spanner、Cosmos DB strong）</li>
<li>AP 系統：高可用、partition 時可能回舊資料（Cassandra、DynamoDB Global Tables）</li>
</ul>
<p><strong>PACELC（Daniel Abadi 提出）</strong>：擴充 CAP、加上「沒 partition 時」的取捨。</p>
<ul>
<li>沒 partition 時：Latency vs Consistency 二選一</li>
<li>結合表示：PA/EL（partition 時選 Availability、平時選 Latency）vs PC/EC（partition 時選 Consistency、平時選 Consistency）</li>
</ul>
<p><strong>工程含義</strong>：</p>
<ul>
<li>Spanner、Aurora DSQL、Cosmos DB strong：PC/EC — 永遠選一致、付出 latency</li>
<li>Cassandra、DynamoDB Global Tables：PA/EL — 永遠選快、付出可能不一致</li>
<li>Cosmos DB session：PA/EL 但對同一 session 內保持 EC — 妥協方案</li>
</ul>
<p>選 global DB 不是「哪個最好」、是「業務需要哪一邊」。金融交易、ticketing inventory、payment ledger 通常需要 EC；社群 feed、推薦、analytics 通常 EL 夠用。</p>
<h2 id="spanner--truetime-模型">Spanner / <a href="/blog/backend/knowledge-cards/truetime/" data-link-title="TrueTime" data-link-desc="分散式資料庫用來界定時間不確定性的時間語意機制">TrueTime</a> 模型</h2>
<p><a href="https://cloud.google.com/spanner">Google Cloud Spanner</a> 是目前最成熟的 global strong-consistency OLTP。</p>
<p><strong>TrueTime API</strong>：用 GPS + 原子鐘提供「全球 <em>unambiguous</em> 時間戳」、解決分散式系統最難的問題之一 — 跨節點時序排序。</p>
<p><strong><a href="/blog/backend/knowledge-cards/external-consistency/" data-link-title="External Consistency" data-link-desc="交易可見順序與外部真實時間順序一致的強一致性語意">External consistency</a>（線性化）</strong>：用 TrueTime 保證「全球任何節點看到的交易順序、跟 wall clock 一致」。比 CAP 的 strong consistency 更強。</p>
<p><strong>容量特性</strong>（引自 <a href="/blog/backend/09-performance-capacity/cases/spanner-planetary-scale-database-gcp/" data-link-title="9.C10 Cloud Spanner：每秒 10 億請求的全球一致性資料庫" data-link-desc="Google Cloud Spanner 內部峰值 10 億 req/sec、跨地區強一致 — 全球分散式 OLTP 容量參考">9.C10 Spanner 案例</a>）：</p>
<ul>
<li>內部峰值 &gt; 10 億 requests / 秒</li>
<li>線性擴展：2 nodes → 45K reads/sec、4 nodes → 90K reads/sec</li>
<li>跨地區交易延遲 100-200ms（quorum round-trip 不可壓縮）</li>
<li>multi-region instance 可設定 quorum location（影響哪幾個 region 必須同意）</li>
</ul>
<h3 id="線性擴展為什麼是-oltp-設計的最高目標">線性擴展為什麼是 OLTP 設計的最高目標</h3>
<p>「2 nodes → 45K reads/sec、4 nodes → 90K reads/sec」這個線性對應在傳統 OLTP（PostgreSQL、MySQL）做不到。原因是 <em>跨節點交易需要 coordinator 確認順序、coordinator 本身是 bottleneck</em>。加更多節點不會線性加吞吐、因為 coordinator 處理速度跟不上、其他節點得排隊等。</p>
<p>Spanner 用 Paxos + TrueTime 把 coordinator 變成「拓樸感知的多 leader」、每個 leader 只管自己 partition、不需要全域 coordinator。這層演算法 + 硬體（GPS + 原子鐘）配合、才達成線性擴展。</p>
<p><strong>為什麼這個 frame 對選型重要</strong>：讀「Spanner 撐 10 億 req/sec」不該理解成「能力差距」、而是「設計差距」— 傳統 OLTP 不是「沒它快」、是「結構上做不到線性」。如果業務未來會跨 region 擴展、必須在最初就選 <a href="/blog/backend/knowledge-cards/distributed-sql/" data-link-title="Distributed SQL" data-link-desc="把 SQL 與交易語意延伸到多節點與多區域的資料庫形態">distributed SQL</a>、不是先用 PostgreSQL 再「之後加 sharding」。</p>
<p><strong>對等技術跟取捨</strong>：</p>
<ul>
<li><strong>AWS Aurora DSQL</strong>：用其他協議（OCC + 分散式時鐘）達成跨 region strong consistency、不用 TrueTime 硬體。</li>
<li><strong>CockroachDB</strong>：用 HLC（Hybrid Logical Clock）+ Raft、可在通用硬體上跑、但 cross-region linearizability 需要 OCC retry。</li>
<li><strong>TiDB</strong>：用 TSO（Timestamp Oracle）服務發 global timestamp、TSO 本身是 single point、可用性要靠 TSO failover 設計。</li>
</ul>
<p>TrueTime 是 <em>專屬硬體投資</em>、其他方案是 <em>軟體 only</em>、兩者一致性保證等級類似、但運維成本跟認證難度差很大。可複製性低的 TrueTime 是 Google 的競爭優勢、不是普遍 best practice。</p>
<p><strong>容量規劃</strong>：</p>
<ul>
<li>節點數量 = 容量單位（每年 review）</li>
<li>跨 region quorum 配置決定 latency baseline</li>
<li>不能像 single-region OLTP 那樣短期擴容、需要提前 ramp</li>
</ul>
<p><strong>適用場景</strong>：</p>
<ul>
<li>金融交易、ticketing inventory</li>
<li>全球客戶但需要強一致</li>
<li>不能容忍跨地區 <a href="/blog/backend/knowledge-cards/stale-read/" data-link-title="Stale Read" data-link-desc="讀取到落後於最新寫入版本的舊資料">stale read</a> 的業務</li>
</ul>
<p><strong>不適用</strong>：</p>
<ul>
<li>跨洲低延遲（沒辦法、TrueTime 也壓不下 100ms 跨洲）</li>
<li>高 throughput 但容忍 eventual consistency（Bigtable / Cassandra 更便宜）</li>
</ul>
<h3 id="分散式-sql-的-over-provision-屬結構性成本">分散式 SQL 的 over-provision 屬結構性成本</h3>
<p>分散式 SQL（TiDB、CockroachDB、Spanner）要求恆常 over-provision、是結構性成本、不是 capacity planning 失誤。三個原因都來自跨節點協調的物理需求：</p>
<ul>
<li>跨節點 transaction 需要 coordinator 角色、leader election 在尖峰當下不能發生、否則整個 cluster 卡住。</li>
<li>預留 buffer 讓 leader / follower lag 在尖峰時仍能收斂、否則 replication lag 爆增、讀走 replica 的 query 拿到太舊資料。</li>
<li>跨 region quorum 在某個 region 暫時不可用時、剩下 region 要能繼續 quorum、所以每 region 的容量都要 &gt;= quorum 所需。</li>
</ul>
<p>對應 <a href="/blog/backend/09-performance-capacity/cases/zomato-tidb-to-dynamodb-migration/" data-link-title="9.C20 Zomato：從 TiDB 遷移到 DynamoDB、吞吐 4 倍、延遲降 90%、成本減 50%" data-link-desc="Zomato 帳單系統從 TiDB 遷移到 DynamoDB、吞吐 2K→8K RPM、延遲降 90%、成本減 50%">9.C20 Zomato</a> — Zomato 從 TiDB 遷出是業務需求側的判斷：該 workload 本身就能接受 eventually consistent、為 strong consistency 付的 over-provision 屬於浪費。判讀重點：strong consistency 是業務需求時、distributed SQL 的常態 over-provision 是合理代價；業務需求不到這個層級時、KV / 傳統 OLTP 是更划算的選項。</p>
<p>選型公式：先問業務需求要什麼一致性層級、再選 DB 類型、避免倒過來「先選 DB 再硬塞需求」。</p>
<h2 id="aurora-dsqlaws-的全球-strong-consistency-答案">Aurora DSQL：AWS 的全球 strong consistency 答案</h2>
<p>AWS 在 2024 re:Invent 推出 Aurora DSQL、是 AWS 對 Spanner 的回應。</p>
<p><strong>設計特點</strong>（引自 <a href="https://aws.amazon.com/blogs/database/amazon-aurora-dsql-for-global-scale-financial-transactions/">Aurora DSQL announcement</a>）：</p>
<ul>
<li>跨 region active-active write</li>
<li>強一致性（線性化）</li>
<li>PostgreSQL wire protocol compatible（應用層改動小）</li>
<li>Serverless（不必管 instance）</li>
</ul>
<p><strong>跟 Spanner 的差異</strong>：</p>
<ul>
<li>Spanner 用 TrueTime 硬體、Aurora DSQL 用其他協議</li>
<li>Aurora DSQL 跟 PostgreSQL 相容（容易遷移）、Spanner 是專屬 SQL dialect</li>
<li>Aurora DSQL 較新（2024）、生態還在成長</li>
<li>Spanner 服務時間長（內部 2007、外部 2017）、production 案例多</li>
</ul>
<p><strong>適用場景</strong>：</p>
<ul>
<li>AWS 生態用戶想要 global strong consistency</li>
<li>已用 Aurora / PostgreSQL、想擴展到 multi-region</li>
<li>應用層想保留 PostgreSQL ORM</li>
</ul>
<h2 id="cockroachdb-跟-tidb自管選項">CockroachDB 跟 TiDB：自管選項</h2>
<p>如果不想 vendor lock-in、或需要 on-prem 部署、選擇是 <em>self-managed</em> distributed SQL。</p>
<p><strong>CockroachDB</strong>：</p>
<ul>
<li>開源、可自管或用 Cockroach Cloud</li>
<li>跟 PostgreSQL wire protocol compatible</li>
<li>線性擴展、跨 region 部署、強一致</li>
<li>設計理念近 Spanner、但不用 TrueTime（用 HLC + Raft）</li>
</ul>
<p><strong>TiDB</strong>：</p>
<ul>
<li>開源（PingCAP）、可自管或用 TiDB Cloud</li>
<li>跟 MySQL wire protocol compatible</li>
<li>TiKV + TiDB 分層架構</li>
<li>中國市場大量使用、亞洲生態成熟</li>
</ul>
<p><strong>選擇取捨</strong>：</p>
<ul>
<li>vendor lock-in 風險 → 選 CockroachDB / TiDB</li>
<li>想 managed → 選 Spanner / Aurora DSQL</li>
<li>已用 PostgreSQL → 選 CockroachDB / Aurora DSQL（migration 容易）</li>
<li>已用 MySQL → 選 TiDB</li>
</ul>
<p>對應案例：<a href="/blog/backend/09-performance-capacity/cases/zomato-tidb-to-dynamodb-migration/" data-link-title="9.C20 Zomato：從 TiDB 遷移到 DynamoDB、吞吐 4 倍、延遲降 90%、成本減 50%" data-link-desc="Zomato 帳單系統從 TiDB 遷移到 DynamoDB、吞吐 2K→8K RPM、延遲降 90%、成本減 50%">9.C20 Zomato</a> 從 TiDB 遷出（理由不是 TiDB 不好、是 NewSQL 必須 over-provision、KV NoSQL 對該 workload 更划算）。</p>
<h2 id="cosmos-db-multi-region-write-模式">Cosmos DB multi-region write 模式</h2>
<p><a href="https://azure.microsoft.com/products/cosmos-db/">Azure Cosmos DB</a> 提供 <em>五個一致性層級</em>、是 multi-region OLTP 最有彈性的選擇之一。</p>
<p><strong>五個 <a href="/blog/backend/knowledge-cards/consistency-level/" data-link-title="Consistency Level" data-link-desc="資料系統對讀寫一致性語意的可選擇層級">consistency level</a></strong>（從強到弱）：</p>
<ol>
<li><strong>Strong</strong>：<a href="/blog/backend/knowledge-cards/linearizability/" data-link-title="Linearizability" data-link-desc="每次操作看起來都在單一全域順序中即時生效的一致性語意">linearizable</a>、跨 region quorum</li>
<li><strong><a href="/blog/backend/knowledge-cards/bounded-staleness/" data-link-title="Bounded Staleness" data-link-desc="允許資料延遲，但把落後上限限制在可量化範圍內的一致性語意">Bounded staleness</a></strong>：訂版本 / 時間上限</li>
<li><strong><a href="/blog/backend/knowledge-cards/session-consistency/" data-link-title="Session Consistency" data-link-desc="同一使用者工作階段內維持讀寫一致、跨工作階段允許短暫不一致">Session consistency</a></strong>：同 session 內強一致</li>
<li><strong>Consistent prefix</strong>：保證寫入順序</li>
<li><strong>Eventual</strong>：最便宜、最終一致</li>
</ol>
<p><strong>Multi-region write 特色</strong>：</p>
<ul>
<li>每個 region 都能寫、不必所有寫入回主 region</li>
<li>conflict resolution 用 LWW（Last-Writer-Wins）或自訂 stored procedure</li>
<li>跟 Spanner 的 strong consistency 不同 — 是 <em>AP 系統</em>、不保證 <a href="/blog/backend/knowledge-cards/linearizability/" data-link-title="Linearizability" data-link-desc="每次操作看起來都在單一全域順序中即時生效的一致性語意">linearizability</a></li>
</ul>
<p><strong>適用場景</strong>：</p>
<ul>
<li>全球用戶分布、想 <em>寫入本地 region</em> 減延遲</li>
<li>容忍 <a href="/blog/backend/knowledge-cards/eventual-consistency/" data-link-title="Eventual Consistency" data-link-desc="允許短暫不一致、最終收斂到同一資料狀態的一致性語意">eventual consistency</a>（電商商品評論、社群動態）</li>
<li>不能容忍跨 region failover 中斷</li>
</ul>
<p><strong>對應案例</strong>：</p>
<ul>
<li><a href="/blog/backend/09-performance-capacity/cases/minecraft-earth-cosmos-db-global/" data-link-title="9.C11 Minecraft Earth：Azure Cosmos DB 上的全球分散式 AR 遊戲" data-link-desc="Minecraft Earth 用 Cosmos DB 跨地區分散、測試到 100 萬 RU/s 仍維持承諾延遲">9.C11 Minecraft Earth</a> — AR 玩家位置用 session consistency、跨 region 寫入</li>
<li><a href="/blog/backend/09-performance-capacity/cases/asos-cosmos-db-black-friday/" data-link-title="9.C21 ASOS：Cosmos DB 在 Black Friday 撐 1.67 億請求" data-link-desc="ASOS 在 2016 Black Friday 用 Azure Cosmos DB 撐 24 小時 1.67 億請求、3500 req/sec、48ms 平均延遲">9.C21 ASOS</a> — Black Friday 全球用戶、Cosmos DB 跨 region 複製</li>
<li><a href="/blog/backend/09-performance-capacity/cases/microsoft-365-cosmos-db-analytics/" data-link-title="9.C30 Microsoft 365：從 MongoDB 遷移到 Cosmos DB 的分析平台" data-link-desc="Microsoft 365 把使用分析平台從 MongoDB 遷移到 Cosmos DB、planet-scale 全球分散式分析">9.C30 Microsoft 365</a> — 分析 platform 用 weakest acceptable consistency、最大 throughput</li>
</ul>
<h2 id="跨地理合規法規限制下的-global-oltp">跨地理合規：法規限制下的 global OLTP</h2>
<p>部分產業（金融、醫療、政府）有 <em>資料駐留</em> 要求 — 特定國家的資料不能離境。這跟全球分散式 OLTP 的設計有 conflict。</p>
<p><strong>典型法規</strong>：</p>
<ul>
<li>歐盟 GDPR：歐洲用戶資料應留歐</li>
<li>中國《網路安全法》、《資料安全法》：中國用戶資料留中國</li>
<li>印度資料保護法：印度金融資料留印度</li>
<li>美國各州 healthcare（HIPAA）：醫療資料規範</li>
<li>金融業：各國央行通常規定本地交易資料留本地</li>
</ul>
<p><strong>設計策略</strong>：</p>
<ul>
<li><em>多個獨立 cluster</em>、每個合規區一個。不是 single global cluster。</li>
<li>meta-data 可以 global（用戶 profile 摘要）、transaction 必須 local</li>
<li>跨區查詢通過 federated query 或 ETL、不是直接 join</li>
</ul>
<p><strong>對應案例</strong>：</p>
<ul>
<li><a href="/blog/backend/09-performance-capacity/cases/standard-chartered-aurora-banking/" data-link-title="9.C14 Standard Chartered：受監管銀行的 Aurora 4000 TPS 容量提升" data-link-desc="Standard Chartered 銀行遷移到 Aurora 後吞吐量提升 10 倍至 4000 TPS、跨 7 個受監管市場">9.C14 Standard Chartered</a> — 7 個受監管市場、各自獨立 Aurora cluster、不能合併</li>
<li><a href="/blog/backend/09-performance-capacity/cases/genesys-dynamodb-99999-availability/" data-link-title="9.C24 Genesys：用 DynamoDB 在 15 region 跑出 99.999% 可用性" data-link-desc="Genesys 客服平台用 DynamoDB 為預設資料層、跨 15 主 region &#43; 5 衛星 region、達成 12 個月 99.999% 可用性">9.C24 Genesys</a> — 15 主 region + 5 衛星、按合規區分布</li>
<li><a href="/blog/backend/09-performance-capacity/cases/clearent-azure-sql-hyperscale-payments/" data-link-title="9.C32 Clearent：Azure SQL Hyperscale 撐每年 5 億筆支付交易" data-link-desc="Clearent 在 Azure SQL Hyperscale 上處理每年 5 億筆支付交易、autoscale &#43; 微服務架構">9.C32 Clearent</a> — 美國支付業務、Azure SQL Hyperscale + 美國 region</li>
</ul>
<h2 id="延遲代價跨-region-quorum-不可壓縮">延遲代價：跨 region quorum 不可壓縮</h2>
<p>全球 strong consistency 必須付的延遲代價來自物理。光速跑跨大西洋（紐約 ↔ 倫敦 5500 km）大約 27ms one-way、實際網路延遲 70-90ms（含路由 / 處理）。任何 strong consistency 系統都不能比這個快。</p>
<p><strong>典型跨 region quorum latency</strong>：</p>
<ul>
<li>同 region 跨 AZ：1-3ms</li>
<li>同 continent 跨 region（us-east-1 ↔ us-west-2）：50-80ms</li>
<li>跨 continent（us ↔ eu）：80-120ms</li>
<li>跨地球（us ↔ asia）：150-250ms</li>
</ul>
<p><strong>工程含義</strong>：</p>
<ul>
<li>SLO 訂 p99 &lt; 50ms 跨 continent strong consistency → 不可能達成</li>
<li>必須在 SLO 設計時就接受跨 region 的物理 floor</li>
<li>業務不需要 strong consistency 的話、用 session / eventual 換 latency</li>
</ul>
<p><strong>對應案例</strong>：</p>
<ul>
<li><a href="/blog/backend/09-performance-capacity/cases/coinbase-ultra-low-latency-exchange-2023/" data-link-title="9.C3 Coinbase International Exchange：超低延遲交易的逆向容量設計" data-link-desc="為什麼 Coinbase 國際交易所選 Cluster Placement Group &#43; z1d 而不是自動擴容 — 延遲敏感型負載的容量取捨">9.C3 Coinbase</a> — sub-ms 需求、無法跨 region、用 single-AZ cluster placement</li>
<li><a href="/blog/backend/09-performance-capacity/cases/riot-games-eks-multi-cluster/" data-link-title="9.C12 Riot Games：246 個 EKS cluster 的多遊戲多地區治理" data-link-desc="Riot Games 從 Mesos 遷移到 EKS、用 246 個 cluster 跨遊戲跨地區治理、年省 1000 萬美金">9.C12 Riot Games</a> — 35ms VALORANT 延遲門檻、靠 region cluster 滿足、不靠 global DB</li>
</ul>
<p>詳見 <a href="/blog/backend/knowledge-cards/latency-budget/" data-link-title="Latency Budget" data-link-desc="把 user-perceived latency 拆到每個 stage 的配額、反推架構選擇">Latency Budget 卡片</a>。</p>
<h3 id="業務的不同延遲代價曲線">業務的不同延遲代價曲線</h3>
<p>讀「100-200ms 跨洲延遲」這種數字、不能只看絕對值、要看 <em>業務代價怎麼隨延遲變化</em>。不同業務型態的延遲代價曲線不同、決定能不能用 strong consistency 全球分散。</p>
<p><strong>B2B agent 操作介面</strong>（客服平台、CRM）：延遲代價的特性是 <em>累積</em>。agent 一通客戶電話內連續操作數十次、每次卡 1 秒、累積 30 秒讓 agent 在用戶面前沉默 — 客服效率直接掉一半、客戶等不及掛電話、agent 績效跟 NPS 同時下降。專屬訊號是「單次 latency 看似可接受、agent 體感卻變慢」。對應 <a href="/blog/backend/09-performance-capacity/cases/genesys-dynamodb-99999-availability/" data-link-title="9.C24 Genesys：用 DynamoDB 在 15 region 跑出 99.999% 可用性" data-link-desc="Genesys 客服平台用 DynamoDB 為預設資料層、跨 15 主 region &#43; 5 衛星 region、達成 12 個月 99.999% 可用性">9.C24 Genesys</a> 用 15 個 region 把任一 agent 的 DB 延遲壓到 &lt; 50ms — 客服 SaaS 對單次延遲的容忍區間遠窄於一般網路服務。</p>
<p><strong>B2C 終端用戶</strong>（社群、電商）：延遲代價是 <em>一次性跳離</em>。用戶等 1 秒會抱怨、等 3 秒會跳離；但完成一個操作就走、不會像 B2B 累積多次。容忍區間在 200ms-500ms、超過就掉 conversion。專屬訊號是「session bounce rate 跟 latency p99 高度相關」、不是看平均。</p>
<p><strong>金融交易</strong>（payment、trading）：延遲代價有兩面、是其他業務型態少見的結構。一面是用戶體驗（付款卡 = 結帳放棄）、另一面是 <em>系統正確性</em>（交易順序錯 = 對帳異常、稽核失敗）。後者讓金融業願意付 100-200ms 換 strong consistency、因為對帳成本遠高於延遲成本。專屬訊號是「願意接受比 B2C 更高的 latency budget、但拒絕任何 consistency 妥協」。對應 <a href="/blog/backend/09-performance-capacity/cases/standard-chartered-aurora-banking/" data-link-title="9.C14 Standard Chartered：受監管銀行的 Aurora 4000 TPS 容量提升" data-link-desc="Standard Chartered 銀行遷移到 Aurora 後吞吐量提升 10 倍至 4000 TPS、跨 7 個受監管市場">9.C14 Standard Chartered</a> 7 個受監管市場的設計。</p>
<p><strong>IoT / Telemetry</strong>：延遲幾乎無業務代價（資料晚 10 秒進來、報表還是準）、但 throughput 才是主導指標。原因是這類業務的價值來自 <em>大量裝置的聚合趨勢</em>、不是 <em>單一裝置即時回應</em>；只要事件最終到達且順序合理、晚一點不影響決策。專屬訊號是「百萬裝置同時上報、寫入吞吐才是 SLO、latency 不在 alert 條件裡」。選型上 KV 或時序 DB 比 strong-consistency OLTP 更划算。</p>
<p>判讀重點：選 global OLTP 前先畫業務的延遲代價曲線、再決定能付多少 latency budget 給 strong consistency。「100ms 跨洲太慢」這個直覺反射只在沒有對帳 / 累積 / 趨勢這些業務代價時成立。</p>
<h2 id="容量規劃跟-single-region-oltp-完全不同">容量規劃：跟 single-region OLTP 完全不同</h2>
<p>全球分散式 OLTP 的容量規劃有獨特挑戰。</p>
<p><strong>容量單位</strong>：</p>
<ul>
<li>Spanner：節點數</li>
<li>Aurora DSQL：serverless 自動（按 ACU 計費）</li>
<li>Cosmos DB：RU/s（每個 region 獨立配置）</li>
<li>CockroachDB / TiDB：節點數 + storage</li>
</ul>
<p><strong>規劃要點</strong>：</p>
<ul>
<li>每個 region 獨立規劃（跨 region 不能 amortize）</li>
<li>quorum 配置決定哪些 region 必須同意（影響 failure domain）</li>
<li>跨 region replication lag 是 SLO 一部分</li>
<li>不能像 single-region 那樣 reactive 擴容、必須 predictive</li>
</ul>
<p><strong>對應 <a href="/blog/backend/09-performance-capacity/capacity-planning/" data-link-title="9.6 容量規劃模型" data-link-desc="peak forecast、headroom budget、growth curve、autoscaling sizing">9.6 容量規劃模型</a></strong>：全球 OLTP 是「不可水平擴容服務」的延伸 — 不只「單機極限」、是「跨 region 協調的物理極限」。</p>
<h2 id="可用性目標的成本曲線">可用性目標的成本曲線</h2>
<p>「我們要 99.99% 還是 99.999%」這個問題不該用直覺答、要先看每多一個 9 帶來的成本是多少。可用性是非線性、不是線性。</p>
<p><strong>九的數學意義</strong>：</p>
<table>
  <thead>
      <tr>
          <th>可用性</th>
          <th>年停機時間</th>
          <th>月停機時間</th>
          <th>適用場景</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>99%</td>
          <td>87.6 小時 / 年</td>
          <td>7.3 小時 / 月</td>
          <td>開發 / 內部工具</td>
      </tr>
      <tr>
          <td>99.9%</td>
          <td>8.76 小時 / 年</td>
          <td>43.8 分鐘 / 月</td>
          <td>一般 B2C 網站</td>
      </tr>
      <tr>
          <td>99.95%</td>
          <td>4.38 小時 / 年</td>
          <td>21.9 分鐘 / 月</td>
          <td>B2C SaaS、有 SLA 但非 mission-critical</td>
      </tr>
      <tr>
          <td>99.99%</td>
          <td>52.6 分鐘 / 年</td>
          <td>4.38 分鐘 / 月</td>
          <td>受監管產業、付款</td>
      </tr>
      <tr>
          <td>99.999%</td>
          <td>5.26 分鐘 / 年</td>
          <td>26 秒 / 月</td>
          <td>客服 SaaS、telco、5x9 是合約義務</td>
      </tr>
      <tr>
          <td>99.9999%</td>
          <td>31.5 秒 / 年</td>
          <td>2.6 秒 / 月</td>
          <td>極特殊（核電、航空管制）</td>
      </tr>
  </tbody>
</table>
<p><strong>為什麼 99.99 → 99.999 是指數成本而非線性</strong>：每多一個 9、要求 <em>每一層基礎設施</em> 都要對等冗餘。</p>
<ul>
<li>99.9 → 99.99：加 multi-AZ active-active、~2-3x 成本</li>
<li>99.99 → 99.999：加 multi-region active-active、+ DR 演練、+ failover 自動化、+ 監控覆蓋率拉滿、~5-10x 成本</li>
<li>99.999 → 99.9999：加多 cloud、+ 異地災備、+ 全自動 failover、+ 全鏈路演練、~20-50x 成本</li>
</ul>
<p><strong>適用場景的業務理由</strong>：</p>
<ul>
<li><strong>99.99%（受監管產業、付款）</strong>：合約 SLA 通常落在這層。受監管金融在中央銀行 / 金融監管機關的書面要求下、年度書面合規會審查 downtime 紀錄、超過 52 分鐘 / 年要解釋；付款 gateway 對商家 SLA 通常承諾 99.99%、低於這個值會被合作夥伴扣保證金。</li>
<li><strong>99.999%（客服 SaaS / telco）</strong>：5x9 是 B2B 客服 SaaS 跟電信業的 <em>合約義務</em>、不是行銷話術。對應 <a href="/blog/backend/09-performance-capacity/cases/genesys-dynamodb-99999-availability/" data-link-title="9.C24 Genesys：用 DynamoDB 在 15 region 跑出 99.999% 可用性" data-link-desc="Genesys 客服平台用 DynamoDB 為預設資料層、跨 15 主 region &#43; 5 衛星 region、達成 12 個月 99.999% 可用性">9.C24 Genesys</a> — 客服平台用 15 主 region + 5 衛星 region 達 99.999%、架構成本約是 single-region 的 15 倍、但 B2B 客服合約要 5x9、這是合理投資。對應 <a href="/blog/backend/09-performance-capacity/cases/amazon-ads-dynamodb-extreme-kv/" data-link-title="9.C5 Amazon Ads：DynamoDB 9000 萬 reads/sec 的廣告事件量測" data-link-desc="Amazon Ads 在 DynamoDB 上跑 9000 萬 reads/sec &#43; 500 萬 writes/sec、99.999% 可用性的廣告事件量測">9.C5 Amazon Ads</a> — 廣告計費 1 分鐘斷線可能損失幾百萬美金廣告收入、5x9 對應真實營收邊界。電信業 911 緊急通話必須 5x9 是更嚴格的法規層級。</li>
<li><strong>99.9999%（核電、航空管制）</strong>：6x9 不只是工程目標、是 <em>公共安全法規</em>。核電廠 SCADA 系統、空管雷達、軌道交通信號這類業務 30 秒 / 年的中斷會威脅生命、所以付得起跨多 cloud / 異地災備 / 全鏈路演練的成本。一般網路服務談 6x9 通常是過度設計。</li>
</ul>
<p><strong>SLO 木桶效應</strong>：99.999% 是 <em>系統整體</em> 數字、不是 DB 單獨。DNS、load balancer、application、DB、storage 任何一層 single-region 就破壞整體 SLO。傳統工程師常以為「DB 多 region 就好」、忽略 application 跑在 single-region 的話、application down = 整體 down。</p>
<p>要達成 5x9、要 <em>每一層</em> 都 multi-region active-active、且 <em>failover 流程能自動執行</em>（人類在事故當下做不到 5 分鐘內完成切換）。對應 <a href="/blog/backend/05-deployment-platform/" data-link-title="模組五：部署平台與網路入口" data-link-desc="整理 Kubernetes、systemd、load balancer、container 與服務生命週期合約">05 部署平台模組</a> 的跨 region 部署、跟 <a href="/blog/backend/06-reliability/" data-link-title="模組六：可靠性驗證流程" data-link-desc="用 SRE 領域詞彙建問題節點、以服務級案例庫累積驗證脈絡，先建概念與案例庫再進實作交接">06 可靠性驗證模組</a> 的 DR 演練。</p>
<p><strong>Region 成本曲線</strong>：N 個 region 的成本約是 1 個 region 的 N 倍（DB + compute + storage 都要複製）、但業務收益不是線性。</p>
<ul>
<li>1 region：覆蓋本國用戶</li>
<li>3 region（同 continent）：覆蓋整 continent、延遲 &lt; 50ms</li>
<li>6 region（跨 continent）：覆蓋全球、延遲 100-200ms</li>
<li>15 region：每個用戶 &lt; 50ms 接入（如 Genesys 模式）</li>
</ul>
<p>從 6 region → 15 region 的成本是 2.5x、但用戶體驗改善（50ms 延遲）對 B2B 客服很關鍵、對 B2C 推薦系統幾乎無感。region 數量選擇要看 <em>業務模型對延遲的敏感度</em>、不是工程「越多越好」。</p>
<h2 id="sharding-粒度跟業務一致性需求">Sharding 粒度跟業務一致性需求</h2>
<p>distributed SQL 跟 single-cluster SQL 之間還有一層：<strong>多個獨立 cluster + 應用層 sharding</strong>。選哪個跟業務的一致性需求有關。</p>
<p><strong>Hyperscale / Aurora 同類設計</strong>（storage / compute 分離）：</p>
<ul>
<li>AWS Aurora、Azure SQL Hyperscale、GCP AlloyDB、Spanner 都採類似工程哲學 — log-structured 分散式 storage + 獨立 compute scale</li>
<li>storage 最高通常 100 TB（Hyperscale）、超過要 sharding</li>
<li>compute 上限是 instance type（80 vCore 等）、超過要 sharding 或換 distributed SQL</li>
</ul>
<p>對應 <a href="/blog/backend/09-performance-capacity/cases/clearent-azure-sql-hyperscale-payments/" data-link-title="9.C32 Clearent：Azure SQL Hyperscale 撐每年 5 億筆支付交易" data-link-desc="Clearent 在 Azure SQL Hyperscale 上處理每年 5 億筆支付交易、autoscale &#43; 微服務架構">9.C32 Clearent</a> — 5 億筆/年支付交易、用 Hyperscale 撐單一 cluster、沒拆 sharding 是因為支付業需要 <em>跨 merchant 對帳一致性</em>、共用 OLTP 比拆 cluster 划算。</p>
<p><strong>選 vendor 看生態、不看技術</strong>：Hyperscale 跟 Aurora 工程哲學一致、選哪家取決於 application 已在哪個 cloud。AWS 客戶選 Aurora、Azure 客戶選 Hyperscale、GCP 客戶選 AlloyDB / Spanner。技術差異小、生態差異大（IAM 整合、observability tooling、計費綁定）。</p>
<p><strong>業務一致性需求決定 sharding 粒度</strong>：</p>
<ul>
<li><strong>微服務各自 OLTP</strong>（Netflix Aurora consolidation）：每個微服務有自己的 Aurora cluster、跨服務一致性靠 application 層 saga / outbox。適合服務間業務 <em>天然解耦</em>（用戶服務、訂單服務、商品服務各自 owned data）。Query path 上、跨服務查詢必須走 API 而非 SQL JOIN、要接受查多個服務多次往返；一致性 path 上、跨服務 transaction 用 saga + compensation、容忍中間態。</li>
<li><strong>微服務共用 OLTP</strong>（Clearent Hyperscale）：所有微服務共用一個大 cluster、跨服務一致性靠 DB transaction。適合業務 <em>天然耦合</em>（payment 跟 refund 跟 chargeback 必須在同一 transaction）。Query path 上、可以用 SQL JOIN 直接查跨服務資料、簡單；一致性 path 上、所有微服務共享一個 schema 演進邊界、schema migration 影響所有服務、要協調。</li>
<li><strong>Sharding by tenant</strong>（B2B SaaS）：每個 enterprise tenant 自己 cluster、適合 tenant 之間完全隔離、大客戶可能要求專屬 cluster。Query path 上、跨 tenant 查詢（例如平台級報表）要走 federated query 或 ETL 聚合、不能直接 join；運維 path 上、每個 tenant cluster 的容量規劃、backup、upgrade 都獨立、運維工時隨 tenant 數量線性成長。</li>
<li><strong>Sharding by region</strong>（受監管產業）：每個合規市場自己 cluster、合規驅動、不是性能驅動。對應 <a href="/blog/backend/09-performance-capacity/cases/standard-chartered-aurora-banking/" data-link-title="9.C14 Standard Chartered：受監管銀行的 Aurora 4000 TPS 容量提升" data-link-desc="Standard Chartered 銀行遷移到 Aurora 後吞吐量提升 10 倍至 4000 TPS、跨 7 個受監管市場">9.C14 Standard Chartered</a> 7 個市場各自獨立。</li>
</ul>
<p>判讀重點：sharding 不是「擴容到不夠才做」、是「業務模型決定的初始設計」。等到 single cluster 撐不住才開始 shard、會踩進「跨 shard 一致性」的工程地雷區、修改成本遠高於初期設計成本。Managed DB（Aurora、Hyperscale）的容量上限是 <em>已知</em> 的、設計時就該知道未來何時觸發 sharding。對應 <a href="/blog/backend/01-database/high-concurrency-access/" data-link-title="1.1 高併發下的 SQL 讀寫邊界" data-link-desc="說明高併發服務如何共用資料庫 client、控制 transaction、管理 connection pool、避免資料庫成為瓶頸">1.1 高併發資料存取</a> 的 storage 層 replication 段 — Hyperscale / Aurora / Spanner 同類設計的容量上限同樣是 sharding 觸發點。</p>
<h2 id="案例對照">案例對照</h2>
<table>
  <thead>
      <tr>
          <th>案例</th>
          <th>教學重點</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/blog/backend/09-performance-capacity/cases/spanner-planetary-scale-database-gcp/" data-link-title="9.C10 Cloud Spanner：每秒 10 億請求的全球一致性資料庫" data-link-desc="Google Cloud Spanner 內部峰值 10 億 req/sec、跨地區強一致 — 全球分散式 OLTP 容量參考">9.C10 Spanner</a></td>
          <td>10 億 req/sec 線性擴展、TrueTime 實作</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/09-performance-capacity/cases/minecraft-earth-cosmos-db-global/" data-link-title="9.C11 Minecraft Earth：Azure Cosmos DB 上的全球分散式 AR 遊戲" data-link-desc="Minecraft Earth 用 Cosmos DB 跨地區分散、測試到 100 萬 RU/s 仍維持承諾延遲">9.C11 Minecraft Earth Cosmos DB</a></td>
          <td>turnkey global distribution、5 consistency levels</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/09-performance-capacity/cases/standard-chartered-aurora-banking/" data-link-title="9.C14 Standard Chartered：受監管銀行的 Aurora 4000 TPS 容量提升" data-link-desc="Standard Chartered 銀行遷移到 Aurora 後吞吐量提升 10 倍至 4000 TPS、跨 7 個受監管市場">9.C14 Standard Chartered</a></td>
          <td>受監管金融跨市場、必須各自獨立 cluster</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/09-performance-capacity/cases/asos-cosmos-db-black-friday/" data-link-title="9.C21 ASOS：Cosmos DB 在 Black Friday 撐 1.67 億請求" data-link-desc="ASOS 在 2016 Black Friday 用 Azure Cosmos DB 撐 24 小時 1.67 億請求、3500 req/sec、48ms 平均延遲">9.C21 ASOS Cosmos DB</a></td>
          <td>全球零售 multi-region、Black Friday 持續高峰</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/09-performance-capacity/cases/genesys-dynamodb-99999-availability/" data-link-title="9.C24 Genesys：用 DynamoDB 在 15 region 跑出 99.999% 可用性" data-link-desc="Genesys 客服平台用 DynamoDB 為預設資料層、跨 15 主 region &#43; 5 衛星 region、達成 12 個月 99.999% 可用性">9.C24 Genesys 99.999%</a></td>
          <td>跨 15 region active-active 達 5 個 9 可用性</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/09-performance-capacity/cases/clearent-azure-sql-hyperscale-payments/" data-link-title="9.C32 Clearent：Azure SQL Hyperscale 撐每年 5 億筆支付交易" data-link-desc="Clearent 在 Azure SQL Hyperscale 上處理每年 5 億筆支付交易、autoscale &#43; 微服務架構">9.C32 Clearent Azure SQL Hyperscale</a></td>
          <td>美國支付業、storage / compute 分離擴展</td>
      </tr>
  </tbody>
</table>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>上游：<a href="/blog/backend/01-database/transaction-boundary/" data-link-title="1.3 Transaction 與一致性邊界" data-link-desc="交易邊界、isolation level、retry 策略、distributed transaction（2PC、Saga）與跨 region 強一致取捨">1.3 Transaction Boundary</a>（single-region OLTP）</li>
<li>平行：<a href="/blog/backend/01-database/kv-document-capacity-planning/" data-link-title="1.10 KV / Document DB 容量規劃" data-link-desc="DynamoDB / Cosmos DB / Bigtable / MongoDB 等 KV / Document DB 的容量設計、partition key 取捨、capacity mode 選擇">1.10 KV / Document DB 容量規劃</a>（KV 全球分散）</li>
<li>下游：<a href="/blog/backend/01-database/large-scale-db-migration/" data-link-title="1.12 大規模 DB 遷移實戰" data-link-desc="跨 DB 遷移的 dual-write、[shadow read](/backend/knowledge-cards/shadow-read/)、cutover、rollback 流程 — 從實戰案例提煉的工程做法">1.12 大規模 DB 遷移實戰</a>（含「預設 DB 治理 pattern」— 平台規模化階段的 OLTP 選型治理）</li>
<li>跨模組：<a href="/blog/backend/09-performance-capacity/capacity-planning/" data-link-title="9.6 容量規劃模型" data-link-desc="peak forecast、headroom budget、growth curve、autoscaling sizing">9.6 容量規劃模型</a>、<a href="/blog/backend/09-performance-capacity/slo-performance-budget/" data-link-title="9.12 SLO 與 Performance Budget" data-link-desc="performance budget 跟 SLO / error budget 的對接">9.12 SLO 與 Performance Budget</a>、<a href="/blog/backend/00-service-selection/state-storage-selection/" data-link-title="0.2 狀態與資料儲存選型" data-link-desc="區分 source of truth、快取、搜尋索引、event log 與 object storage 的選型邊界">0.2 State Storage Selection</a>、<a href="/blog/backend/07-security-data-protection/data-residency-deletion-and-evidence-chain/" data-link-title="7.11 資料駐留、刪除與證據鏈" data-link-desc="定義跨區資料駐留、刪除請求與可驗證證據鏈問題">7.11 Data Residency</a></li>
<li>Spanner 深入：<a href="/blog/backend/01-database/vendors/spanner/truetime-api-depth/" data-link-title="Spanner TrueTime API 深度：GPS &#43; 原子鐘、commit wait、為什麼 line-rate scaling 才是設計目的" data-link-desc="TrueTime 是手段、line-rate scaling 才是 Spanner 的設計目的。本文先扣商業邏輯：傳統 OLTP coordinator 為什麼是 bottleneck、Spanner 怎麼用 TrueTime &#43; Paxos 換成拓樸感知多 leader；再展開 TrueTime ε / commit wait 數學、ε 暴衝失敗模式、cross-region voting 對 latency 的影響、跟 9.C10 Google internal dogfood 揭露的線性擴展模式對照">TrueTime API 深入</a>、<a href="/blog/backend/01-database/vendors/spanner/consistency-models-comparison/" data-link-title="Spanner Consistency Models 對照：external consistency vs serializability vs linearizability" data-link-desc="external consistency、serializability、linearizability 是三個常被混用的概念。本文先精確定義三者差異、再用 line-rate scaling 對照表（PG SSI / CockroachDB / Spanner / Aurora DSQL）回答為什麼 Spanner 不只是『更強的 serializable』、最後用 9.C10 揭露的 cross-region quorum 100-200ms 物理硬限解釋『強一致 &#43; 全球部署』的真實 cost">一致性模型對照</a>、<a href="/blog/backend/01-database/vendors/spanner/schema-migration-interleaved-tables/" data-link-title="Spanner Schema Migration Without Downtime &#43; Interleaved Tables" data-link-desc="Spanner DDL 是 long-running operation、用 TrueTime 給每次 schema change 分配 version timestamp、所有 read / write 對應自己 transaction timestamp 看到對應 schema。Interleaved table 是 storage-level parent-child 物理交錯、不是 logical FK。本文走 schema change lifecycle、interleaved layout 機制、backfill capacity 影響、5 production 踩雷、跟 PostgreSQL online schema change 對照">interleaved table schema migration</a></li>
<li>CockroachDB / Aurora DSQL 深入：<a href="/blog/backend/01-database/vendors/cockroachdb/aurora-dsql-spanner-decision-tree/" data-link-title="CockroachDB vs Aurora DSQL vs Spanner：撞牆訊號分型 &#43; 七問題決策樹" data-link-desc="Distributed SQL 三選一決策樹。先用撞牆訊號分型識別 driver path（DoorDash 單主寫入撞牆 / Netflix Cassandra 缺口 / Hard Rock 合規驅動）、再走七問題（跨雲 / 雲商生態 / 風險預算 / PG 相容 / 管理負擔 / team size / vendor sizing barrier）。PostgreSQL 相容性 audit checklist 4 項、Spanner 100 pu sizing barrier、Hard Rock 「省 10-20 工程師」機會成本警示、Netflix Database Platform Team 規模">Aurora DSQL / Spanner / CockroachDB 決策樹</a>、<a href="/blog/backend/01-database/vendors/cockroachdb/transaction-retry-pattern/" data-link-title="CockroachDB Transaction Retry Pattern：serializable default 與 application contract 重塑" data-link-desc="CockroachDB default SERIALIZABLE、application 必須包 retry loop 處理 40001 serialization_failure。本文走 PG → CockroachDB application contract 重塑視角、SAVEPOINT cockroach_restart 語法、5 種失敗模式（retry storm / 非冪等 / cross-statement state / hot row / long-running transaction）。**整篇是跨 case 合成 frame**：DoorDash case 沒揭露 retry pattern、只揭露 PG wire protocol 相容 &#43; SQL 行為仍要 audit、本章 retry contract 重塑屬通用工程議題從 Cockroach Labs 官方 docs 合成">CockroachDB transaction retry pattern</a>、<a href="/blog/backend/01-database/vendors/cockroachdb/survival-goals/" data-link-title="CockroachDB Survival Goals：zone 級 vs region 級配置與業務 SLO 倒推流程" data-link-desc="CockroachDB 用 SURVIVE ZONE FAILURE / SURVIVE REGION FAILURE 兩種 survival goal 宣告式控制 Raft replica 分佈、決定 RTO / RPO。本文走 Hard Rock Digital bet placement RPO=0 倒推流程、Netflix Gaming 48-node 跨 4 region 「為求 survival 而非 latency」的反直覺判讀、配置語法、寫入 latency 暴漲跟 cost 暴漲兩條失敗模式、合規邊界對比">survival goals</a>、<a href="/blog/backend/01-database/vendors/cockroachdb/locality-aware-schema/" data-link-title="CockroachDB Locality-Aware Schema：跨州合規 &#43; 邏輯一個 cluster 的 region placement 策略" data-link-desc="Hard Rock Digital 跨 8 州 sportsbook、用 AWS Outposts &#43; region placement 把運算釘在州內、邏輯上仍是一個 CockroachDB cluster。本文走 REGIONAL BY ROW / REGIONAL BY TABLE / GLOBAL 三種 locality、Hard Rock 拓樸創新對比 Standard Chartered Aurora 7 cluster fleet、AWS Outposts 是合規工具不是 latency 工具的反直覺判讀">locality-aware schema</a></li>
<li>Aurora 多 region 深入：<a href="/blog/backend/01-database/vendors/aurora/global-database-multi-region/" data-link-title="Aurora Global Database：跨 region async replication、&lt; 1 秒 lag 與合規 anti-recommendation" data-link-desc="Aurora Global Database 跨 region storage-level async replication、&lt; 1 秒 typical lag、planned vs unplanned failover RTO 數量級對比、Standard Chartered 合規禁止跨境複製為什麼讓 Global Database 變反指標">global database multi-region</a>、<a href="/blog/backend/01-database/vendors/aurora/cross-az-failover-rto/" data-link-title="Aurora Cross-AZ Failover：RTO 量測、endpoint routing 與 application reconnect 契約" data-link-desc="Aurora cross-AZ failover lifecycle（detection / promotion / DNS update）、&lt; 30 秒 RTO、application DNS cache 跟 connection pool 對齊、Standard Chartered 受監管場景為什麼用獨立 cluster 而非 Global Database failover">跨 AZ failover RTO</a></li>
<li>Cosmos DB 多 region 深入：<a href="/blog/backend/01-database/vendors/cosmosdb/consistency-levels-engineering/" data-link-title="Cosmos DB 5 Consistency Levels：Session 預設、Bounded staleness、Strong 邊界跟跨 collection 分流策略" data-link-desc="Cosmos DB 5 個 consistency level 的工程選擇邏輯、Session 為何是 production 預設、per-request override 跟跨 collection 分流的進階策略、Strong &#43; multi-region 互斥的 cross-link — 從 Minecraft Earth &#43; ASOS 切入">一致性層次工程</a>、<a href="/blog/backend/01-database/vendors/cosmosdb/multi-region-write-conflict/" data-link-title="Cosmos DB Multi-Region Write：active-active、LWW、custom merge、Strong &#43; multi-region 互斥的 AP 取捨" data-link-desc="Multi-region active-active write 的 conflict resolution（LWW / custom merge / conflict feed）、Strong 跟 multi-region write 為什麼互斥、廣告 SLA vs 實測可用性鏈路拆解 — 從 Minecraft Earth &#43; Toyota Connected 切入">多 region write 衝突</a></li>
</ul>
<h2 id="既建知識卡片">既建知識卡片</h2>
<ul>
<li><a href="/blog/backend/knowledge-cards/transaction-boundary/" data-link-title="Transaction Boundary" data-link-desc="說明哪些資料變更應在同一個交易中一起成功或一起回復">Transaction Boundary</a></li>
<li><a href="/blog/backend/knowledge-cards/latency-budget/" data-link-title="Latency Budget" data-link-desc="把 user-perceived latency 拆到每個 stage 的配額、反推架構選擇">Latency Budget</a></li>
<li><a href="/blog/backend/knowledge-cards/universal-scalability-law/" data-link-title="Universal Scalability Law (USL)" data-link-desc="說明系統擴容到一定規模後吞吐反而下降的數學模型">Universal Scalability Law</a></li>
<li><a href="/blog/backend/knowledge-cards/saturation-point/" data-link-title="Saturation Point" data-link-desc="說明系統從線性穩態進入 latency 指數成長區的關鍵流量點">Saturation Point</a></li>
</ul>
]]></content:encoded></item></channel></rss>