<?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>Global on Tarragon</title><link>https://tarrragon.github.io/blog/tags/global/</link><description>Recent content in Global 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/global/index.xml" rel="self" type="application/rss+xml"/><item><title>Google Cloud Spanner</title><link>https://tarrragon.github.io/blog/backend/01-database/vendors/spanner/</link><pubDate>Wed, 13 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/01-database/vendors/spanner/</guid><description>&lt;p>Cloud Spanner 是 Google 內部 2007 年起跑、2017 年開放為 GCP 服務的 &lt;em>全球分散式 SQL OLTP&lt;/em>。內部撐 Google Ads / Play / Search 計費、外部支援 Blockchain.com、Sharechat、ZEE5 等。它的公開案例重點是每秒 10 億請求等級、線性擴展、強一致與 global distribution 可以同時成為 OLTP 設計目標。&lt;/p>
&lt;h2 id="教學路線全球強一致與-truetime-成本">教學路線：全球強一致與 TrueTime 成本&lt;/h2>
&lt;p>Spanner 服務頁的教學目標是把 global strong consistency、TrueTime、Paxos、region layout 與 processing unit 連成一條產品決策線。讀者讀完後要能判斷何時需要全球一致 SQL，並理解這種能力的 latency、成本與雲平台邊界。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>學習段&lt;/th>
 &lt;th>核心問題&lt;/th>
 &lt;th>對應段落&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Global consistency&lt;/td>
 &lt;td>強一致 SQL 為什麼需要時間邊界與 consensus&lt;/td>
 &lt;td>定位、適用場景、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/linearizability/" data-link-title="Linearizability" data-link-desc="每次操作看起來都在單一全域順序中即時生效的一致性語意">Linearizability&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Region layout&lt;/td>
 &lt;td>instance config、leader region、replica 如何影響 latency&lt;/td>
 &lt;td>容量規劃要點、常見陷阱&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Capacity unit&lt;/td>
 &lt;td>node / processing unit 如何取代傳統 shard 心智模型&lt;/td>
 &lt;td>容量特性、案例對照&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Use-case pressure&lt;/td>
 &lt;td>billing、subscription、ticketing、金融交易何時需要 Spanner&lt;/td>
 &lt;td>適用場景、案例對照&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>替代路由&lt;/td>
 &lt;td>何時用 PostgreSQL、CockroachDB、Aurora DSQL、DynamoDB&lt;/td>
 &lt;td>不適用場景、跟其他 vendor 的取捨&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="定位truetime--paxos-的全球線性-sql">定位：TrueTime + Paxos 的全球線性 SQL&lt;/h2>
&lt;p>Spanner 解決的是跨地理位置同時追求 strong consistency、linear scalability 與 global availability 的 OLTP 問題。&lt;/p>
&lt;p>&lt;strong>關鍵設計&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>TrueTime API&lt;/strong>：用 GPS + 原子鐘提供「全球 unambiguous 時間戳」、誤差 &amp;lt; 7ms&lt;/li>
&lt;li>&lt;strong>External consistency&lt;/strong>（線性化）：跨節點交易順序跟 wall clock 一致&lt;/li>
&lt;li>&lt;strong>Paxos-based replication&lt;/strong>：跨 zone / region &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/quorum/" data-link-title="Quorum" data-link-desc="分散式系統以多數節點同意作為提交或讀取有效性的門檻">quorum&lt;/a>&lt;/li>
&lt;li>&lt;strong>線性擴展&lt;/strong>：2 nodes → 45K reads/sec、4 nodes → 90K reads/sec、依此類推&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>容量特性&lt;/strong>（引自 &lt;a href="https://tarrragon.github.io/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 案例&lt;/a>）：&lt;/p>
&lt;ul>
&lt;li>內部峰值：&amp;gt; 10 億 requests / sec&lt;/li>
&lt;li>線性擴展（不像 USL 系統會在某點 plateau）&lt;/li>
&lt;li>跨 region quorum 延遲：50-200ms（視 region 距離）&lt;/li>
&lt;li>最小容量單位：100 processing units（PU）≈ 1/10 node、適合小負載&lt;/li>
&lt;/ul>
&lt;h2 id="適用場景">適用場景&lt;/h2>
&lt;p>&lt;strong>1. 金融交易、ticketing inventory、payment ledger&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>需要強一致，避免 double-spend、oversell 或帳務順序錯亂&lt;/li>
&lt;li>全球用戶但需要原子性&lt;/li>
&lt;li>對應案例：&lt;a href="https://tarrragon.github.io/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&lt;/a> — Google Ads 計費與 Google Play 訂閱都需要把每次計費事件放進可驗證順序&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>2. 全球用戶的 OLTP（不只 read replica）&lt;/strong>：&lt;/p></description><content:encoded><![CDATA[<p>Cloud Spanner 是 Google 內部 2007 年起跑、2017 年開放為 GCP 服務的 <em>全球分散式 SQL OLTP</em>。內部撐 Google Ads / Play / Search 計費、外部支援 Blockchain.com、Sharechat、ZEE5 等。它的公開案例重點是每秒 10 億請求等級、線性擴展、強一致與 global distribution 可以同時成為 OLTP 設計目標。</p>
<h2 id="教學路線全球強一致與-truetime-成本">教學路線：全球強一致與 TrueTime 成本</h2>
<p>Spanner 服務頁的教學目標是把 global strong consistency、TrueTime、Paxos、region layout 與 processing unit 連成一條產品決策線。讀者讀完後要能判斷何時需要全球一致 SQL，並理解這種能力的 latency、成本與雲平台邊界。</p>
<table>
  <thead>
      <tr>
          <th>學習段</th>
          <th>核心問題</th>
          <th>對應段落</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Global consistency</td>
          <td>強一致 SQL 為什麼需要時間邊界與 consensus</td>
          <td>定位、適用場景、<a href="/blog/backend/knowledge-cards/linearizability/" data-link-title="Linearizability" data-link-desc="每次操作看起來都在單一全域順序中即時生效的一致性語意">Linearizability</a></td>
      </tr>
      <tr>
          <td>Region layout</td>
          <td>instance config、leader region、replica 如何影響 latency</td>
          <td>容量規劃要點、常見陷阱</td>
      </tr>
      <tr>
          <td>Capacity unit</td>
          <td>node / processing unit 如何取代傳統 shard 心智模型</td>
          <td>容量特性、案例對照</td>
      </tr>
      <tr>
          <td>Use-case pressure</td>
          <td>billing、subscription、ticketing、金融交易何時需要 Spanner</td>
          <td>適用場景、案例對照</td>
      </tr>
      <tr>
          <td>替代路由</td>
          <td>何時用 PostgreSQL、CockroachDB、Aurora DSQL、DynamoDB</td>
          <td>不適用場景、跟其他 vendor 的取捨</td>
      </tr>
  </tbody>
</table>
<h2 id="定位truetime--paxos-的全球線性-sql">定位：TrueTime + Paxos 的全球線性 SQL</h2>
<p>Spanner 解決的是跨地理位置同時追求 strong consistency、linear scalability 與 global availability 的 OLTP 問題。</p>
<p><strong>關鍵設計</strong>：</p>
<ul>
<li><strong>TrueTime API</strong>：用 GPS + 原子鐘提供「全球 unambiguous 時間戳」、誤差 &lt; 7ms</li>
<li><strong>External consistency</strong>（線性化）：跨節點交易順序跟 wall clock 一致</li>
<li><strong>Paxos-based replication</strong>：跨 zone / region <a href="/blog/backend/knowledge-cards/quorum/" data-link-title="Quorum" data-link-desc="分散式系統以多數節點同意作為提交或讀取有效性的門檻">quorum</a></li>
<li><strong>線性擴展</strong>：2 nodes → 45K reads/sec、4 nodes → 90K reads/sec、依此類推</li>
</ul>
<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 / sec</li>
<li>線性擴展（不像 USL 系統會在某點 plateau）</li>
<li>跨 region quorum 延遲：50-200ms（視 region 距離）</li>
<li>最小容量單位：100 processing units（PU）≈ 1/10 node、適合小負載</li>
</ul>
<h2 id="適用場景">適用場景</h2>
<p><strong>1. 金融交易、ticketing inventory、payment ledger</strong>：</p>
<ul>
<li>需要強一致，避免 double-spend、oversell 或帳務順序錯亂</li>
<li>全球用戶但需要原子性</li>
<li>對應案例：<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> — Google Ads 計費與 Google Play 訂閱都需要把每次計費事件放進可驗證順序</li>
</ul>
<p><strong>2. 全球用戶的 OLTP（不只 read replica）</strong>：</p>
<ul>
<li>跨 region 寫入、各地用戶寫入本地 region 仍維持全球強一致</li>
<li>它承擔的是 multi-region write path，而非 single primary + 跨 region read replica</li>
<li>對應案例：Blockchain.com（高頻 crypto 交易、強一致）</li>
</ul>
<p><strong>3. 想擺脫 sharding 複雜度</strong>：</p>
<ul>
<li>傳統大規模 SQL 常走應用層 sharding（管 shard key、跨 shard query、resharding）</li>
<li>Spanner 自動 partition，application 主要管理 schema、query shape 與 region layout</li>
<li>對應案例：<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> — 「節點數量是容量單位」，shard placement 由 Spanner 管理</li>
</ul>
<p><strong>4. PostgreSQL 相容路徑</strong>：</p>
<ul>
<li>2024 後 Spanner 提供 PostgreSQL dialect interface</li>
<li>從 PostgreSQL 應用遷入 Spanner 變得容易</li>
<li>跟 CockroachDB / Aurora DSQL 類似的策略</li>
</ul>
<h2 id="不適用場景">不適用場景</h2>
<p><strong>1. 跨洲低延遲（&lt; 50ms）需求</strong>：</p>
<ul>
<li>跨洲 quorum 物理上 100ms+ 不可壓縮</li>
<li>替代：single-region OLTP（Aurora、Cloud SQL）+ <a href="/blog/backend/knowledge-cards/eventual-consistency/" data-link-title="Eventual Consistency" data-link-desc="允許短暫不一致、最終收斂到同一資料狀態的一致性語意">eventual consistency</a> 跨 region 同步</li>
</ul>
<p><strong>2. 高 throughput 但容忍 eventual consistency</strong>：</p>
<ul>
<li>Spanner 強一致有溢價，eventual consistency workload 通常有更低成本選項</li>
<li>替代：Bigtable（wide-column、eventual）、DynamoDB Global Tables（KV、eventual）</li>
</ul>
<p><strong>3. 小規模 OLTP</strong>：</p>
<ul>
<li>100 PU 起跳、月費約 $65 起、比 Cloud SQL 貴</li>
<li>流量 &lt; 1000 RPS 的場景、Cloud SQL 更划算</li>
<li>Spanner 主要對 <em>中大規模 + 全球</em> workload</li>
</ul>
<p><strong>4. 跨雲需求</strong>：</p>
<ul>
<li>Spanner 是 GCP managed service，cross-cloud / on-prem 需求要看 CockroachDB、TiDB 或其他自管路線</li>
<li>替代：CockroachDB、TiDB（自管、可跨雲）</li>
</ul>
<p><strong>5. 需要 OLAP 分析能力</strong>：</p>
<ul>
<li>Spanner 定位在 OLTP，analytics workload 交給 BigQuery 或其他 OLAP 系統</li>
<li>替代：跟 BigQuery 整合做 ETL、或用 Spanner Graph（2024 推出）</li>
</ul>
<h2 id="跟其他-vendor-的取捨">跟其他 vendor 的取捨</h2>
<p><strong>vs Aurora DSQL（AWS 2024 推出、概念對標 Spanner）</strong>：</p>
<ul>
<li>Spanner：用 TrueTime hardware、生產驗證 17 年（Google 內部）+ 7 年（公開）</li>
<li>Aurora DSQL：新（2024）、PostgreSQL 相容、serverless</li>
<li>選 Spanner：GCP 生態、需要極致成熟度</li>
<li>選 Aurora DSQL：AWS 生態、需要 PostgreSQL ORM 相容</li>
</ul>
<p><strong>vs CockroachDB</strong>：</p>
<ul>
<li>Spanner：managed、TrueTime hardware、GCP 限定</li>
<li>CockroachDB：自管、HLC + Raft（不靠 TrueTime）、跨雲</li>
<li>選 Spanner：想把 operation 交給 GCP managed service，並需要 Google 規模驗證</li>
<li>選 CockroachDB：跨雲 / on-prem、PostgreSQL 相容、自管彈性</li>
</ul>
<p><strong>vs TiDB</strong>：</p>
<ul>
<li>Spanner：GCP-only、PostgreSQL-like</li>
<li>TiDB：可自管 + Cloud、MySQL 相容、中國 / 亞洲生態深</li>
<li>選 Spanner：英語 / 歐美生態</li>
<li>選 TiDB：MySQL 應用、亞洲市場</li>
</ul>
<p><strong>vs Aurora（traditional single-region scaling）</strong>：</p>
<ul>
<li>Spanner：全球分散式</li>
<li>Aurora：single-region scaling</li>
<li>選 Spanner：流量明確跨 region + 需要強一致</li>
<li>選 Aurora：流量集中一個 region（多數情況）</li>
</ul>
<p><strong>vs Cosmos DB（multi-region write）</strong>：</p>
<ul>
<li>Spanner：strong consistency 跨 region</li>
<li>Cosmos DB：5 個 <a href="/blog/backend/knowledge-cards/consistency-level/" data-link-title="Consistency Level" data-link-desc="資料系統對讀寫一致性語意的可選擇層級">consistency level</a>s、AP 系統（含 strong 但語義不同）</li>
<li>選 Spanner：需要 linearizable（金融、ticketing）</li>
<li>選 Cosmos DB：可接受 session / eventual、Azure 生態、需要 multi-model</li>
</ul>
<p><strong>vs Bigtable</strong>：</p>
<ul>
<li>Spanner：SQL、強一致、OLTP</li>
<li>Bigtable：wide-column、eventual replication、時序 / IoT / 大資料</li>
<li>兩者互補：Bigtable 承擔大資料 / wide-column，Spanner 承擔強一致 OLTP</li>
</ul>
<p><strong>vs PostgreSQL（baseline）</strong>：</p>
<ul>
<li>PostgreSQL：single-primary、跨 region async replication、90% 場景夠用</li>
<li>Spanner：全球線性化、強一致跨 region、需要 GCP + 接受 latency / 成本</li>
<li>從 PostgreSQL 升級 Spanner 的判準：流量明確跨 region，且跨 region 一致性是 product requirement</li>
<li>詳見 <a href="/blog/backend/01-database/vendors/postgresql/" data-link-title="PostgreSQL" data-link-desc="多用途 OLTP 主流關聯式資料庫、MVCC、豐富 SQL 特性、是 Aurora / Cosmos DB / Spanner / CockroachDB / Aurora DSQL 的相容目標">PostgreSQL vendor page</a> 取捨段 + <a href="/blog/backend/01-database/global-distributed-oltp/" data-link-title="1.11 全球分散式 OLTP" data-link-desc="Spanner / Aurora DSQL / Cosmos DB multi-region write / CockroachDB / TiDB 的全球一致性取捨">1.11 全球分散式 OLTP</a></li>
</ul>
<h2 id="容量規劃要點">容量規劃要點</h2>
<p>從 09 案例庫 + Spanner 文件提煉：</p>
<p><strong>1. 節點數量 = 容量單位</strong>：</p>
<ul>
<li>節點配置通常用較長週期 review，並在事件高峰前預先調整</li>
<li>線性擴展讓 forecast 簡單（2x 流量 → 2x 節點）</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> 的「不可水平擴容服務」反向 — Spanner 是 <em>可水平擴容</em> 但需要 <em>提前 provision</em></li>
</ul>
<p><strong>2. 跨 region quorum 配置</strong>：</p>
<ul>
<li>multi-region instance 可選擇哪些 region 是 voting member</li>
<li>voting region 數量決定 failure domain</li>
<li>跨大洲 voting 延遲高、跨大陸內可接受</li>
</ul>
<p><strong>3. 100 PU 起跳的 granular sizing</strong>：</p>
<ul>
<li>早期 Spanner 最小單位 1 node（約 $1000+/month）、中小負載難用</li>
<li>後來推出 100 PU（1/10 node、約 $65/month）、讓小負載也能 evaluate</li>
</ul>
<p><strong>4. 跨環境與新產品能力要查官方文件</strong>：</p>
<ul>
<li>Spanner 的跨環境、graph、PostgreSQL dialect 與 change streams 能力持續演進</li>
<li>實作前要用官方文件確認可用 region、版本、限制與 pricing</li>
</ul>
<p><strong>5. TrueTime 是 Spanner 價值之一</strong>：</p>
<ul>
<li>Spanner 還有 schema migration without downtime、change streams、interleaved tables</li>
<li>評估 Spanner 要同時看跨 region 強一致與整體 SQL 工程能力</li>
</ul>
<h2 id="deep-article已完成">Deep article（已完成）</h2>
<p>本批 4 篇 deep article 已完成、覆蓋 Spanner 從 TrueTime 到 Cloud SQL 遷移的核心 production 議題：</p>
<table>
  <thead>
      <tr>
          <th>主題</th>
          <th>文章</th>
          <th>對應 production 議題</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>TrueTime 是手段、line-rate scaling 才是設計目的、commit wait 數學</td>
          <td><a href="truetime-api-depth/">truetime-api-depth</a></td>
          <td>9.C10 Google internal dogfood 線性擴展模式、ε 暴衝失敗模式、cross-region voting latency 影響</td>
      </tr>
      <tr>
          <td>external consistency / serializability / linearizability 精確定義差異</td>
          <td><a href="consistency-models-comparison/">consistency-models-comparison</a></td>
          <td>PG SSI / CockroachDB / Spanner / Aurora DSQL line-rate scaling 對照、9.C10 cross-region quorum 100-200ms</td>
      </tr>
      <tr>
          <td>Schema migration without downtime + interleaved tables 物理 layout</td>
          <td><a href="schema-migration-interleaved-tables/">schema-migration-interleaved-tables</a></td>
          <td>TrueTime version timestamp、5 production 踩雷、跟 PostgreSQL online schema change 對照</td>
      </tr>
      <tr>
          <td>Cloud SQL for PostgreSQL → Spanner（Type E paradigm shift）playbook</td>
          <td><a href="migrate-from-cloud-sql-pg/">migrate-from-cloud-sql-pg</a></td>
          <td>sizing barrier（100 pu 起跳）+ &lt; 50ms write latency no-go、cost crossover 報告、9.C10 dogfood 邊界</td>
      </tr>
      <tr>
          <td>Change Streams (CDC)：data change record、watch partition、下游整合</td>
          <td><a href="change-streams-cdc/">change-streams-cdc</a></td>
          <td>OLTP 變更餵搜尋 / 快取 / 分析、child partition 接力、retention 失敗、跟 DynamoDB Streams 對照</td>
      </tr>
      <tr>
          <td>PostgreSQL dialect vs GoogleSQL、相容子集邊界、dialect 不可逆</td>
          <td><a href="postgresql-dialect/">postgresql-dialect</a></td>
          <td>PostgreSQL 生態遷入、相容性 audit、dialect 鎖定的高代價回退、何時選 PG dialect</td>
      </tr>
      <tr>
          <td>Spanner Graph (2024)：property graph、跟 relational 共存、GQL</td>
          <td><a href="spanner-graph/">spanner-graph</a></td>
          <td>多跳關係查詢、edge table layout 不可逆設計代價、super node 扇出、何時用專用 graph DB</td>
      </tr>
      <tr>
          <td>Spanner ↔ BigQuery federation：OLTP/OLAP 分工、Data Boost</td>
          <td><a href="bigquery-federation/">bigquery-federation</a></td>
          <td>分析查詢拖垮 OLTP、Data Boost workload 隔離、federation vs change-stream 落地、何時分出去</td>
      </tr>
  </tbody>
</table>
<p>DB4 cross-vendor entry：先看 <a href="../cockroachdb/aurora-dsql-spanner-decision-tree/">CockroachDB / Aurora DSQL / Spanner 決策樹</a> 識別 driver path、再進本 vendor 深度。</p>
<h2 id="後續擴充仍待補">後續擴充（仍待補）</h2>
<ul>
<li>Spanner Graph 進階查詢 lab（GQL pattern、super node 處理、遍歷效能調校）</li>
<li>Data Boost 容量規劃與成本模型 deep dive</li>
<li>Change Streams → Dataflow hands-on lab（建 stream、部署 pipeline、驗證 end-to-end）</li>
<li>Spanner regional → multi-region topology 升級 playbook</li>
</ul>
<h2 id="anti-recommendation-與升級路由">Anti-recommendation 與升級路由</h2>
<p>Spanner 的 global strong consistency 是高價值能力，也會把 latency、region layout 與 GCP lock-in 帶進核心架構。這一段先說何時維持 Cloud SQL / Aurora，再說何時升級 Spanner、CockroachDB、Aurora DSQL 或 Bigtable / DynamoDB。</p>
<table>
  <thead>
      <tr>
          <th>機制 / 路線</th>
          <th>維持簡單設計的條件</th>
          <th>升級訊號</th>
          <th>主要引用路徑</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Cloud SQL / Aurora</td>
          <td>single-region primary 足夠、跨 region 只需 async DR / read</td>
          <td>跨 region 寫入順序是產品契約、double-spend / oversell 代價高</td>
          <td><a href="/blog/backend/01-database/vendors/aurora/" data-link-title="AWS Aurora" data-link-desc="AWS managed PostgreSQL / MySQL、storage / compute 分離、&#43;75% 效能改善的 production 證據">Aurora vendor</a>、<a href="/blog/backend/knowledge-cards/rpo/" data-link-title="RPO" data-link-desc="說明恢復點目標如何定義可接受資料損失範圍">RPO</a></td>
      </tr>
      <tr>
          <td>Spanner regional</td>
          <td>單 region 強一致與水平擴容已足夠</td>
          <td>需要 multi-region availability、regional failure survival</td>
          <td><a href="/blog/backend/knowledge-cards/quorum/" data-link-title="Quorum" data-link-desc="分散式系統以多數節點同意作為提交或讀取有效性的門檻">Quorum</a>、<a href="/blog/backend/knowledge-cards/external-consistency/" data-link-title="External Consistency" data-link-desc="交易可見順序與外部真實時間順序一致的強一致性語意">External Consistency</a></td>
      </tr>
      <tr>
          <td>Spanner multi-region</td>
          <td>GCP 生態、SQL workload、global consistency 是核心需求</td>
          <td>跨洲 p99 目標過低、成本或 GCP lock-in 成為主要風險</td>
          <td><a href="/blog/backend/knowledge-cards/latency-budget/" data-link-title="Latency Budget" data-link-desc="把 user-perceived latency 拆到每個 stage 的配額、反推架構選擇">Latency Budget</a>、<a href="/blog/backend/knowledge-cards/global-oltp/" data-link-title="Global OLTP" data-link-desc="跨地理區域仍維持交易一致性的 OLTP 設計責任與代價">Global OLTP</a></td>
      </tr>
      <tr>
          <td>CockroachDB</td>
          <td>GCP-only managed 服務可接受</td>
          <td>跨雲、on-prem、自管或 PostgreSQL wire 相容是硬需求</td>
          <td><a href="/blog/backend/01-database/vendors/cockroachdb/" data-link-title="CockroachDB" data-link-desc="分散式 SQL、PostgreSQL 相容、跨區強一致、Spanner 的開源 / 跨雲替代">CockroachDB vendor</a></td>
      </tr>
      <tr>
          <td>Aurora DSQL</td>
          <td>團隊已在 GCP 或需要 Spanner 成熟度</td>
          <td>AWS 生態、serverless distributed SQL、PostgreSQL 相容是主訴求</td>
          <td><a href="/blog/backend/01-database/vendors/postgresql/migrate-to-aurora-dsql/" data-link-title="PostgreSQL → Aurora DSQL Migration：PG wire-compatible Distributed SQL 的 Paradigm Shift" data-link-desc="Aurora DSQL（2024-12 re:Invent preview / 2025-05 GA）是 AWS 推的 PG wire-compatible *active-active distributed SQL*、跟 self-managed PG / Aurora PG 不同 paradigm（OCC &#43; snapshot isolation &#43; multi-region strong consistency）。Migration 結構是 *protocol drop-in &#43; paradigm shift*：app SQL 不太改、但 transaction retry / extension 缺位 / 多 region 一致性需重設計。本文走 DSQL vs Aurora PG vs self-managed PG 三軸對比、為什麼遷的三條 driver（global write / operational zero-touch / region resiliency）、Type E phased plan、5 production 踩雷（transaction retry 沒處理 / extension 缺位 / sequence throughput 限制 / Aurora PG 直升 DSQL 不可行 / region failover semantic）、跟 PG → Aurora 跟 PG → CockroachDB 對比">PG → Aurora DSQL Migration</a></td>
      </tr>
      <tr>
          <td>Bigtable / DynamoDB</td>
          <td>workload 可接受 eventual consistency 或 KV / wide-column</td>
          <td>強一致 SQL 的協調成本高於產品收益</td>
          <td><a href="/blog/backend/01-database/vendors/dynamodb/" data-link-title="DynamoDB" data-link-desc="AWS managed key-value、partition-based scaling、9000 萬 RPS sustained 實戰證據">DynamoDB vendor</a></td>
      </tr>
  </tbody>
</table>
<p>Spanner 的簡單路徑是先證明跨 region 一致性是產品需求。若只是想要全球 read latency，read replica、cache、edge KV 或 eventual consistency pipeline 可能更划算；Spanner 適合把「全球寫入順序正確」視為產品承諾的資料。</p>
<p>Region layout 的升級路徑要先定義 leader、voting replica 與使用者地理分布。跨洲 quorum 會把物理延遲放進 transaction path，因此 latency budget、降級策略與 read staleness policy 要一起寫進設計。</p>
<h2 id="已知-limitation-與後續路由">已知 limitation 與後續路由</h2>
<p>Spanner overview 目前完成 global SQL 判斷。下一輪 deep article / playbook 應補 TrueTime、external consistency、PostgreSQL dialect、interleaved tables、change streams、Cloud SQL / PostgreSQL → Spanner migration 與 Spanner / BigQuery federation。</p>
<h2 id="案例對照">案例對照</h2>
<table>
  <thead>
      <tr>
          <th>案例</th>
          <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 Cloud Spanner</a></td>
          <td>&gt; 10 億 req/sec、線性擴展</td>
          <td>全球強一致 OLTP 標竿</td>
      </tr>
  </tbody>
</table>
<p>Spanner case 的讀法是先看一致性需求，再看容量數字。10 億 req/sec 證明它能水平擴展，但讀者真正要回收的是「計費、訂閱、庫存、交易順序」這類需要 global external consistency 的產品壓力。</p>
<h2 id="反向-sibling-路由">反向 sibling 路由</h2>
<p>Spanner 的反向 sibling 路由用來把 global strong consistency 和雲端代管責任一起判讀。若讀者從 PostgreSQL / MySQL 過來，先確認是否具產品契約等級的 external consistency 需求；若只是 managed SQL 與 replica scaling，回 <a href="/blog/backend/01-database/vendors/aurora/" data-link-title="AWS Aurora" data-link-desc="AWS managed PostgreSQL / MySQL、storage / compute 分離、&#43;75% 效能改善的 production 證據">Aurora vendor</a>；若要 PostgreSQL-like distributed SQL 且需要自管或多雲彈性，對照 <a href="/blog/backend/01-database/vendors/cockroachdb/" data-link-title="CockroachDB" data-link-desc="分散式 SQL、PostgreSQL 相容、跨區強一致、Spanner 的開源 / 跨雲替代">CockroachDB vendor</a>；若 access pattern 是固定 KV / document，先看 <a href="/blog/backend/01-database/vendors/dynamodb/" data-link-title="DynamoDB" data-link-desc="AWS managed key-value、partition-based scaling、9000 萬 RPS sustained 實戰證據">DynamoDB vendor</a> 或 <a href="/blog/backend/01-database/vendors/cosmosdb/" data-link-title="Azure Cosmos DB" data-link-desc="全球分散式 multi-model DB、5 個 consistency levels、Microsoft 自家 dogfood 證據">Cosmos DB vendor</a>。</p>
<p>這條路由的判準是交易順序是否跨 region 影響產品正確性。Spanner 的價值在 external consistency、schema 與 SQL 能力、全球 deployment 與 Google Cloud operation model 的組合；若產品只需要 eventual / session consistency，較輕的 NoSQL 或 managed SQL 常有更低成本。</p>
<h2 id="常見陷阱">常見陷阱</h2>
<ul>
<li><strong>誤以為跨 region 強一致沒有延遲代價</strong>：跨洲 quorum 100-200ms 是物理成本</li>
<li><strong>設計 schema 像傳統 PostgreSQL</strong>：Spanner 有 interleaved tables、適當用能加速查詢</li>
<li><strong>所有讀取都用強一致</strong>：read-only transaction 可選 bounded staleness，reporting 類路徑常能用 <a href="/blog/backend/knowledge-cards/stale-read/" data-link-title="Stale Read" data-link-desc="讀取到落後於最新寫入版本的舊資料">stale read</a> 換較低成本</li>
<li><strong>單 region 用 Spanner</strong>：浪費、Cloud SQL / Aurora 更便宜</li>
<li><strong>不評估 100 PU 起跳</strong>：早年 1 node minimum、現在 100 PU 起、small workload 也可以 POC</li>
</ul>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>完整 T1 對照：<a href="/blog/backend/01-database/vendors/" data-link-title="資料庫 Vendor 清單" data-link-desc="規劃 SQL、managed SQL、document、KV 與 distributed SQL 的服務頁撰寫順序與教學大綱">01-database vendors index</a></li>
<li>平行：<a href="/blog/backend/01-database/vendors/aurora/" data-link-title="AWS Aurora" data-link-desc="AWS managed PostgreSQL / MySQL、storage / compute 分離、&#43;75% 效能改善的 production 證據">Aurora vendor</a>、<a href="/blog/backend/01-database/vendors/dynamodb/" data-link-title="DynamoDB" data-link-desc="AWS managed key-value、partition-based scaling、9000 萬 RPS sustained 實戰證據">DynamoDB vendor</a>、<a href="/blog/backend/01-database/vendors/cockroachdb/" data-link-title="CockroachDB" data-link-desc="分散式 SQL、PostgreSQL 相容、跨區強一致、Spanner 的開源 / 跨雲替代">CockroachDB vendor</a></li>
<li>上游：<a href="/blog/backend/01-database/global-distributed-oltp/" data-link-title="1.11 全球分散式 OLTP" data-link-desc="Spanner / Aurora DSQL / Cosmos DB multi-region write / CockroachDB / TiDB 的全球一致性取捨">1.11 全球分散式 OLTP</a></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> — 全球 OLTP 的容量規劃特殊性</li>
<li>Last reviewed：2026-05-22（processing units / PostgreSQL interface / TrueTime 文件屬時間敏感 claim）</li>
<li>官方：<a href="https://cloud.google.com/spanner">Cloud Spanner</a>、<a href="https://cloud.google.com/spanner/docs/true-time-external-consistency">TrueTime: Time Distributed in Spanner</a></li>
</ul>
]]></content:encoded></item><item><title>Azure Cosmos DB</title><link>https://tarrragon.github.io/blog/backend/01-database/vendors/cosmosdb/</link><pubDate>Wed, 13 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/01-database/vendors/cosmosdb/</guid><description>&lt;p>Azure Cosmos DB 是 Microsoft 全球分散式 multi-model database、提供 SQL / MongoDB / Cassandra / Gremlin / Table 五種 API、五個 consistency levels、自動 multi-region write。Microsoft 自家 Microsoft 365 用它做 analytics、ASOS 在 Black Friday 撐 1.67 億請求 24 小時、Minecraft Earth 測試 1M RU/s — 是 Azure 上 NoSQL / Document 工作負載的旗艦。&lt;/p>
&lt;h2 id="教學路線multi-model-api-與全球寫入">教學路線：Multi-model API 與全球寫入&lt;/h2>
&lt;p>Cosmos DB 服務頁的教學目標是把 API model、consistency level、RU/s、logical partition 與 multi-region write 放在同一個 Azure 服務決策中。讀者讀完後要能判斷 Cosmos DB 是遷移相容層、全球 NoSQL 平台，還是特定 Azure workload 的容量抽象。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>學習段&lt;/th>
 &lt;th>核心問題&lt;/th>
 &lt;th>對應段落&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>API model&lt;/td>
 &lt;td>SQL API、MongoDB API、Cassandra API 各自服務哪種遷移或資料形狀&lt;/td>
 &lt;td>定位、跟其他 vendor 的取捨&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Consistency level&lt;/td>
 &lt;td>session、bounded staleness、strong consistency 如何改變產品語意&lt;/td>
 &lt;td>容量規劃要點、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/consistency-level/" data-link-title="Consistency Level" data-link-desc="資料系統對讀寫一致性語意的可選擇層級">Consistency Level&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>RU/s capacity&lt;/td>
 &lt;td>request unit 如何把 query、index、payload 轉成成本與節流&lt;/td>
 &lt;td>容量特性、案例對照&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Global write&lt;/td>
 &lt;td>multi-region write 何時值得承擔衝突與一致性成本&lt;/td>
 &lt;td>適用場景、案例對照&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>替代路由&lt;/td>
 &lt;td>何時用 MongoDB、DynamoDB、Spanner、PostgreSQL 或 analytics&lt;/td>
 &lt;td>不適用場景、下一步路由&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="定位multi-model--multi-region-write">定位：multi-model + multi-region write&lt;/h2>
&lt;p>Cosmos DB 跟其他 DB 最大差異是 &lt;em>multi-model&lt;/em>。一個服務同時支援 5 種 API、每個 API 對應不同資料模型。應用層選擇用哪個 API、底層是同一個分散式 KV store。&lt;/p>
&lt;p>&lt;strong>5 個 API&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>SQL API&lt;/strong>：document（JSON）+ SQL-like query、Cosmos DB native&lt;/li>
&lt;li>&lt;strong>MongoDB API&lt;/strong>：wire-protocol 相容 MongoDB&lt;/li>
&lt;li>&lt;strong>Cassandra API&lt;/strong>：wire-protocol 相容 Cassandra&lt;/li>
&lt;li>&lt;strong>Gremlin API&lt;/strong>：graph database&lt;/li>
&lt;li>&lt;strong>Table API&lt;/strong>：簡單 KV（Azure Table Storage 升級版）&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>5 個 consistency levels&lt;/strong>（從強到弱）：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Strong&lt;/strong>：在支援的 account / region 配置內提供最強一致性，通常帶來最高 latency&lt;/li>
&lt;li>&lt;strong>Bounded staleness&lt;/strong>：訂版本 / 時間差異上限&lt;/li>
&lt;li>&lt;strong>Session&lt;/strong>：同 session 內強一致（最常用）&lt;/li>
&lt;li>&lt;strong>Consistent prefix&lt;/strong>：保證寫入順序&lt;/li>
&lt;li>&lt;strong>Eventual&lt;/strong>：最便宜、最終一致&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>容量特性&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>容量單位：RU/s（Request Unit per second）— 把 read / write / query 統一抽象&lt;/li>
&lt;li>1 RU = strongly consistent read of 1KB document&lt;/li>
&lt;li>配置擴容延遲：99 百分位 5 秒內生效&lt;/li>
&lt;li>每個 logical partition 上限：10,000 RU/s&lt;/li>
&lt;li>測試最高：1,000,000 RU/s（&lt;a href="https://tarrragon.github.io/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 仍維持承諾延遲">Minecraft Earth 案例&lt;/a>）&lt;/li>
&lt;/ul>
&lt;h2 id="適用場景">適用場景&lt;/h2>
&lt;p>&lt;strong>1. Azure 生態的 multi-model 需求&lt;/strong>：&lt;/p></description><content:encoded><![CDATA[<p>Azure Cosmos DB 是 Microsoft 全球分散式 multi-model database、提供 SQL / MongoDB / Cassandra / Gremlin / Table 五種 API、五個 consistency levels、自動 multi-region write。Microsoft 自家 Microsoft 365 用它做 analytics、ASOS 在 Black Friday 撐 1.67 億請求 24 小時、Minecraft Earth 測試 1M RU/s — 是 Azure 上 NoSQL / Document 工作負載的旗艦。</p>
<h2 id="教學路線multi-model-api-與全球寫入">教學路線：Multi-model API 與全球寫入</h2>
<p>Cosmos DB 服務頁的教學目標是把 API model、consistency level、RU/s、logical partition 與 multi-region write 放在同一個 Azure 服務決策中。讀者讀完後要能判斷 Cosmos DB 是遷移相容層、全球 NoSQL 平台，還是特定 Azure workload 的容量抽象。</p>
<table>
  <thead>
      <tr>
          <th>學習段</th>
          <th>核心問題</th>
          <th>對應段落</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>API model</td>
          <td>SQL API、MongoDB API、Cassandra API 各自服務哪種遷移或資料形狀</td>
          <td>定位、跟其他 vendor 的取捨</td>
      </tr>
      <tr>
          <td>Consistency level</td>
          <td>session、bounded staleness、strong consistency 如何改變產品語意</td>
          <td>容量規劃要點、<a href="/blog/backend/knowledge-cards/consistency-level/" data-link-title="Consistency Level" data-link-desc="資料系統對讀寫一致性語意的可選擇層級">Consistency Level</a></td>
      </tr>
      <tr>
          <td>RU/s capacity</td>
          <td>request unit 如何把 query、index、payload 轉成成本與節流</td>
          <td>容量特性、案例對照</td>
      </tr>
      <tr>
          <td>Global write</td>
          <td>multi-region write 何時值得承擔衝突與一致性成本</td>
          <td>適用場景、案例對照</td>
      </tr>
      <tr>
          <td>替代路由</td>
          <td>何時用 MongoDB、DynamoDB、Spanner、PostgreSQL 或 analytics</td>
          <td>不適用場景、下一步路由</td>
      </tr>
  </tbody>
</table>
<h2 id="定位multi-model--multi-region-write">定位：multi-model + multi-region write</h2>
<p>Cosmos DB 跟其他 DB 最大差異是 <em>multi-model</em>。一個服務同時支援 5 種 API、每個 API 對應不同資料模型。應用層選擇用哪個 API、底層是同一個分散式 KV store。</p>
<p><strong>5 個 API</strong>：</p>
<ul>
<li><strong>SQL API</strong>：document（JSON）+ SQL-like query、Cosmos DB native</li>
<li><strong>MongoDB API</strong>：wire-protocol 相容 MongoDB</li>
<li><strong>Cassandra API</strong>：wire-protocol 相容 Cassandra</li>
<li><strong>Gremlin API</strong>：graph database</li>
<li><strong>Table API</strong>：簡單 KV（Azure Table Storage 升級版）</li>
</ul>
<p><strong>5 個 consistency levels</strong>（從強到弱）：</p>
<ol>
<li><strong>Strong</strong>：在支援的 account / region 配置內提供最強一致性，通常帶來最高 latency</li>
<li><strong>Bounded staleness</strong>：訂版本 / 時間差異上限</li>
<li><strong>Session</strong>：同 session 內強一致（最常用）</li>
<li><strong>Consistent prefix</strong>：保證寫入順序</li>
<li><strong>Eventual</strong>：最便宜、最終一致</li>
</ol>
<p><strong>容量特性</strong>：</p>
<ul>
<li>容量單位：RU/s（Request Unit per second）— 把 read / write / query 統一抽象</li>
<li>1 RU = strongly consistent read of 1KB document</li>
<li>配置擴容延遲：99 百分位 5 秒內生效</li>
<li>每個 logical partition 上限：10,000 RU/s</li>
<li>測試最高：1,000,000 RU/s（<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 仍維持承諾延遲">Minecraft Earth 案例</a>）</li>
</ul>
<h2 id="適用場景">適用場景</h2>
<p><strong>1. Azure 生態的 multi-model 需求</strong>：</p>
<ul>
<li>同一服務多種 use case（document、graph、KV 共存）</li>
<li>想把多個 NoSQL 資料模型集中在 Azure 服務邊界內治理</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> — Microsoft 自家用 Cosmos DB 撐分析平台</li>
</ul>
<p><strong>2. 全球零售 + 季節性高峰</strong>：</p>
<ul>
<li>multi-region write 讓全球用戶寫入本地 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 24 小時 1.67 億請求、3500 RPS 峰值、48ms 平均延遲</li>
</ul>
<p><strong>3. 全球分散式遊戲後端</strong>：</p>
<ul>
<li>AR / 即時遊戲跨地區同步</li>
<li>session consistency 對遊戲足夠、不需 strong</li>
<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 遊戲玩家位置、跨 region 寫入</li>
</ul>
<p><strong>4. MongoDB 應用想要 <em>managed + 全球分散</em></strong>：</p>
<ul>
<li>Cosmos DB MongoDB API wire protocol compatible</li>
<li>應用層主要驗證相容差異，底層改成分散式架構</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> — MongoDB → Cosmos DB MongoDB API、planet-scale 分析</li>
</ul>
<p><strong>5. 想用 multi-region active-active write</strong>：</p>
<ul>
<li>不像 Spanner / Aurora DSQL 是 PC 系統、Cosmos DB 是 AP 系統</li>
<li>用 LWW（Last-Writer-Wins）或 stored procedure 處理 conflict</li>
<li>適合可接受 eventual / session consistency 的 multi-region write workload；需要 global SQL linearizability 時轉 Spanner / Aurora DSQL</li>
</ul>
<h2 id="不適用場景">不適用場景</h2>
<p><strong>1. 跨雲需求</strong>：</p>
<ul>
<li>Cosmos DB only on Azure</li>
<li>替代：MongoDB Atlas（cross-cloud）、CockroachDB（自管）</li>
</ul>
<p><strong>2. Linearizable 全球 OLTP</strong>：</p>
<ul>
<li>Cosmos DB Strong consistency 的適用範圍要按 account / region 配置判讀；全球 linearizable SQL 需求通常轉 Spanner / Aurora DSQL</li>
<li>替代：Spanner / Aurora DSQL（真正全球 linearizable）</li>
</ul>
<p><strong>3. 預算極敏感的小 workload</strong>：</p>
<ul>
<li>最低 400 RU/s（約 $25/month）</li>
<li>小流量場景、Azure SQL Database 更便宜</li>
</ul>
<p><strong>4. 純 OLAP 分析</strong>：</p>
<ul>
<li>Cosmos DB 定位在 OLTP / document，analytics workload 交給 Synapse、BigQuery 或 Snowflake</li>
<li>替代：Azure Synapse、BigQuery、Snowflake</li>
</ul>
<p><strong>5. 嚴格 ACID 跨 partition transaction</strong>：</p>
<ul>
<li>Cosmos DB Transaction 限 same logical partition</li>
<li>跨 partition 的 multi-row transaction 要改用 workflow、stored procedure 邊界或 distributed SQL</li>
<li>替代：Spanner / Aurora DSQL</li>
</ul>
<h2 id="跟其他-vendor-的取捨">跟其他 vendor 的取捨</h2>
<p><strong>vs DynamoDB（AWS）</strong>：</p>
<ul>
<li>Cosmos DB：multi-model（5 API）、5 consistency levels、multi-region write</li>
<li>DynamoDB：KV 為主、strong / eventual consistency、Global Tables 以 LWW 處理 multi-region conflict</li>
<li>選 Cosmos DB：Azure 生態、需要 multi-model、需要 consistency 細粒度控制</li>
<li>選 DynamoDB：AWS 生態、純 KV、AWS-native 整合（Lambda、Streams）</li>
</ul>
<p><strong>vs Spanner（GCP）</strong>：</p>
<ul>
<li>Cosmos DB：AP 系統、5 consistency levels、multi-model</li>
<li>Spanner：CP 系統、external consistency、SQL only</li>
<li>選 Cosmos DB：可接受 eventual / session、需要 multi-model</li>
<li>選 Spanner：需要 <a href="/blog/backend/knowledge-cards/linearizability/" data-link-title="Linearizability" data-link-desc="每次操作看起來都在單一全域順序中即時生效的一致性語意">linearizability</a> 與 SQL workload</li>
</ul>
<p><strong>vs MongoDB Atlas</strong>：</p>
<ul>
<li>Cosmos DB MongoDB API：Azure-only、managed、global 強</li>
<li>MongoDB Atlas：跨雲（AWS / GCP / Azure）、原生 MongoDB 行為</li>
<li>選 Cosmos DB：已在 Azure、想要更好 global distribution</li>
<li>選 MongoDB Atlas：跨雲、需要 MongoDB 完整功能（aggregation pipeline 等 native 行為）</li>
</ul>
<p><strong>vs Cassandra / ScyllaDB</strong>：</p>
<ul>
<li>Cosmos DB Cassandra API：managed Azure</li>
<li>Cassandra / ScyllaDB：自管、跨雲</li>
<li>選 Cosmos DB：Azure 生態、想把 operation 交給 managed service</li>
<li>選 Cassandra：跨雲、自管、極限 throughput tuning</li>
</ul>
<p><strong>vs Azure SQL Hyperscale</strong>：</p>
<ul>
<li>Cosmos DB：NoSQL / document、global 分散</li>
<li>Azure SQL Hyperscale：傳統 SQL OLTP、storage / compute 分離、AWS Aurora 對應</li>
<li>選 Cosmos DB：document model、global 分散</li>
<li>選 Azure SQL：SQL workload、應用已用 SQL Server</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 Azure SQL Hyperscale</a> — SQL 工作負載選 Hyperscale，document / NoSQL workload 才進 Cosmos DB</li>
</ul>
<p><strong>vs PostgreSQL（SQL baseline）</strong>：</p>
<ul>
<li>PostgreSQL：SQL、強一致、single-primary、跨雲可用</li>
<li>Cosmos DB：NoSQL / multi-model、AP 系統、Azure-only、global 分散</li>
<li>選 PostgreSQL：SQL workload、跨雲、需要進階 SQL 特性</li>
<li>選 Cosmos DB：Azure 生態、document / KV / multi-model、需要 global distribution</li>
</ul>
<p><strong>vs Aurora（AWS managed SQL）</strong>：</p>
<ul>
<li>Aurora：AWS、SQL（PostgreSQL / MySQL）、single-region scaling</li>
<li>Cosmos DB：Azure、NoSQL / multi-model、global write</li>
<li>兩者分別站在 cloud provider 與 data model 兩個維度；同需求下通常先看既有雲平台（AWS → Aurora、Azure → Cosmos / Azure SQL）</li>
</ul>
<p><strong>vs CockroachDB（cross-cloud distributed SQL）</strong>：</p>
<ul>
<li>CockroachDB：跨雲、PostgreSQL wire、distributed SQL、強一致</li>
<li>Cosmos DB：Azure-only、multi-model、5 consistency levels、AP 系統</li>
<li>選 CockroachDB：要 SQL + 跨雲 + 強一致</li>
<li>選 Cosmos DB：要 NoSQL + Azure 生態 + 細粒度 consistency 選擇</li>
</ul>
<h2 id="容量規劃要點">容量規劃要點</h2>
<p><strong>1. RU/s 抽象化把 read / write / query 統一</strong>：</p>
<ul>
<li>不像 DynamoDB 拆 RCU / WCU、Cosmos DB 用單一 RU</li>
<li>簡化容量規劃、但要算「不同操作各吃多少 RU」</li>
<li>1 RU = 1 KB strong read、寫 ~5 RU、複雜 query 數百 RU</li>
</ul>
<p><strong>2. partition key 設計跟 DynamoDB 一樣關鍵</strong>：</p>
<ul>
<li>每個 logical partition 上限 10,000 RU/s</li>
<li>partition key 不均 → hot partition</li>
<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> — synthetic partition key 強制分散</li>
<li>詳見 <a href="/blog/backend/knowledge-cards/hot-partition/" data-link-title="Hot Partition" data-link-desc="說明分散式 KV / OLTP 中、單一 partition 流量遠超其他的容量問題">Hot Partition 卡片</a></li>
</ul>
<p><strong>3. multi-region 配置</strong>：</p>
<ul>
<li>開啟跨 region 後、容量在每個 region 都 mirror、成本乘以 region 數</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> — 跟 DynamoDB Global Tables 同類思維、各 region 獨立容量</li>
</ul>
<p><strong>4. Consistency level 影響成本</strong>：</p>
<ul>
<li>Strong consistency：跨 region quorum、單個 read 約 2x RU</li>
<li>Session：cost 跟 eventual 接近、但提供同 session 一致</li>
<li>Eventual：最便宜</li>
</ul>
<p><strong>5. Autoscale provisioned throughput</strong>：</p>
<ul>
<li>訂 max RU/s、實際用多少算多少（10% min）</li>
<li>適合：流量 unpredictable、想降低 on-demand 成本治理負擔</li>
</ul>
<p><strong>6. Serverless mode</strong>：</p>
<ul>
<li>按 request 計費，適合稀疏與小流量 workload</li>
<li>適合：dev / test、小流量、稀疏 workload</li>
</ul>
<h2 id="deep-article已完成">Deep article（已完成）</h2>
<p>本批 5 篇 deep article 已完成、覆蓋 Cosmos DB 從 consistency level 選擇到 multi-region write conflict 的核心 production 議題：</p>
<table>
  <thead>
      <tr>
          <th>主題</th>
          <th>文章</th>
          <th>對應 production 議題</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Session 預設、Bounded staleness、Strong 邊界跟跨 collection 分流策略</td>
          <td><a href="consistency-levels-engineering/">consistency-levels-engineering</a></td>
          <td>Session 為何是 production 預設、per-request override、Strong + multi-region 互斥 cross-link</td>
      </tr>
      <tr>
          <td>Synthetic / composite / hierarchical partition key + 不可逆性硬約束</td>
          <td><a href="partition-key-design/">partition-key-design</a></td>
          <td>10000 RU/s 上限、不可改、跟 DynamoDB / MongoDB 可逆性對比</td>
      </tr>
      <tr>
          <td>RU/s 思維、payload、index、provisioned vs autoscale vs serverless</td>
          <td><a href="ru-cost-model-sizing/">ru-cost-model-sizing</a></td>
          <td>ASOS Black Friday + Minecraft Earth 1M RU/s 壓測、autoscale reactive 限制</td>
      </tr>
      <tr>
          <td>MongoDB API vs SQL API：三型遷移、dogfood、multi-model、跨雲 hedging</td>
          <td><a href="mongodb-api-vs-sql-api/">mongodb-api-vs-sql-api</a></td>
          <td>Microsoft 365 dogfood 邊界、document model 遷移三型 SSoT</td>
      </tr>
      <tr>
          <td>Multi-region active-active + LWW / custom merge / Strong 互斥</td>
          <td><a href="multi-region-write-conflict/">multi-region-write-conflict</a></td>
          <td>Strong + multi-region 互斥的 AP 取捨 SSoT、廣告 SLA vs 實測可用性鏈路</td>
      </tr>
  </tbody>
</table>
<p>第二批 deep article 把 Cosmos DB 從核心容量 / 一致性議題推進到 server-side 邏輯、CDC、不同產品釐清與 OLTP / OLAP federation：</p>
<table>
  <thead>
      <tr>
          <th>主題</th>
          <th>文章</th>
          <th>對應 production 議題</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Change Feed (CDC)：persistent change log、Azure Functions trigger</td>
          <td><a href="change-feed-cdc/">change-feed-cdc</a></td>
          <td>latest-version vs all-versions-and-deletes、lease container、DynamoDB Streams 對照</td>
      </tr>
      <tr>
          <td>Stored procedure / trigger（JavaScript）：partition-scoped 交易</td>
          <td><a href="stored-procedure-trigger/">stored-procedure-trigger</a></td>
          <td>single-partition atomicity、bounded execution、多數邏輯應在 application 層</td>
      </tr>
      <tr>
          <td>Cosmos DB for PostgreSQL（Citus-based 分散式 PG、不同產品）</td>
          <td><a href="cosmos-for-postgresql/">cosmos-for-postgresql</a></td>
          <td>定位釐清、distribution column、何時選它而非核心 Cosmos / single-node PG</td>
      </tr>
      <tr>
          <td>Cosmos DB ↔ Azure Synapse Link：OLTP / OLAP <a href="/blog/backend/knowledge-cards/federation/" data-link-title="Federation" data-link-desc="跨系統信任與授權交換的聯邦機制">federation</a></td>
          <td><a href="synapse-link-federation/">synapse-link-federation</a></td>
          <td>analytical store、HTAP、RU 隔離、何時 federate 到專用 OLAP</td>
      </tr>
  </tbody>
</table>
<p>Migration playbook：</p>
<table>
  <thead>
      <tr>
          <th>主題</th>
          <th>文章</th>
          <th>對應遷移議題</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>從 MongoDB / Cassandra 遷入 Cosmos DB</td>
          <td><a href="migrate-from-mongodb-cassandra/">migrate-from-mongodb-cassandra</a></td>
          <td>protocol-compat API drop-in（Type B）vs native API paradigm shift（Type E）、相容性邊界、dual-write cutover</td>
      </tr>
  </tbody>
</table>
<p>跨 vendor entry：先看 <a href="../db3-vendor-selection/">DB3 vendor selection</a>（MongoDB / DynamoDB / Cosmos DB 三方選型 + workload shape 前置判讀），再進本 vendor 的 deep article。</p>
<h2 id="後續擴充仍待補">後續擴充（仍待補）</h2>
<ul>
<li>Hierarchical partition key 與 partition split / merge 運維</li>
<li>Autoscale vs serverless 的成本切換決策樹</li>
<li>Hands-on lab 入口（對齊 PostgreSQL / MySQL / SQLite hands-on 形態）</li>
<li>Backup / PITR 與 continuous backup tier 選擇</li>
<li>Gremlin / Table API 的適用邊界與遷入</li>
</ul>
<h2 id="anti-recommendation-與升級路由">Anti-recommendation 與升級路由</h2>
<p>Cosmos DB 的 multi-model 能把遷移阻力降到很低，也會讓 API compatibility、RU/s、partition key 與 consistency level 同時變成設計責任。這一段先說何時維持單一 API model，再說何時升級 multi-region write、Synapse Link、MongoDB Atlas、Spanner 或 Azure SQL。</p>
<table>
  <thead>
      <tr>
          <th>機制 / 路線</th>
          <th>維持簡單設計的條件</th>
          <th>升級訊號</th>
          <th>主要引用路徑</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>單一 API model</td>
          <td>document / MongoDB / Cassandra / Table 語意清楚分工</td>
          <td>多 API 共用同一資料語意、相容層行為差異開始影響 production</td>
          <td><a href="/blog/backend/01-database/vendors/mongodb/" data-link-title="MongoDB" data-link-desc="Document database 代表、Atlas managed、跨雲可用、許多大規模平台從 MongoDB 起家">MongoDB vendor</a>、<a href="/blog/backend/knowledge-cards/database/" data-link-title="Database" data-link-desc="說明 database 在後端系統中如何承擔正式狀態、查詢與一致性責任">Database</a></td>
      </tr>
      <tr>
          <td>Session consistency</td>
          <td>user session 內讀寫一致已滿足產品需求</td>
          <td>金融 / 庫存 / 票務需要更強順序承諾</td>
          <td><a href="/blog/backend/knowledge-cards/consistency-level/" data-link-title="Consistency Level" data-link-desc="資料系統對讀寫一致性語意的可選擇層級">Consistency Level</a>、<a href="/blog/backend/knowledge-cards/linearizability/" data-link-title="Linearizability" data-link-desc="每次操作看起來都在單一全域順序中即時生效的一致性語意">Linearizability</a></td>
      </tr>
      <tr>
          <td>Provisioned RU/s</td>
          <td>流量可預測、partition key 均勻</td>
          <td>Black Friday、遊戲上線、全球事件帶來突發尖峰</td>
          <td><a href="/blog/backend/knowledge-cards/hot-partition/" data-link-title="Hot Partition" data-link-desc="說明分散式 KV / OLTP 中、單一 partition 流量遠超其他的容量問題">Hot Partition</a>、<a href="/blog/backend/knowledge-cards/peak-forecast/" data-link-title="Peak Forecast" data-link-desc="說明預期峰值流量的預測方法 — 容量規劃的第一個輸入">Peak Forecast</a></td>
      </tr>
      <tr>
          <td>Multi-region write</td>
          <td>single-region write + global read 已足夠</td>
          <td>regional write latency、region residency、active-active 是產品需求</td>
          <td><a href="/blog/backend/knowledge-cards/rpo/" data-link-title="RPO" data-link-desc="說明恢復點目標如何定義可接受資料損失範圍">RPO</a>、<a href="/blog/backend/knowledge-cards/rto/" data-link-title="RTO" data-link-desc="說明恢復時間目標如何約束事故回復策略">RTO</a>、<a href="/blog/backend/knowledge-cards/stale-read/" data-link-title="Stale Read" data-link-desc="讀取到落後於最新寫入版本的舊資料">Stale Read</a></td>
      </tr>
      <tr>
          <td>MongoDB Atlas</td>
          <td>Azure global distribution 是主訴求</td>
          <td>跨雲、原生 MongoDB 行為、Atlas ecosystem 是主訴求</td>
          <td><a href="/blog/backend/01-database/vendors/mongodb/" data-link-title="MongoDB" data-link-desc="Document database 代表、Atlas managed、跨雲可用、許多大規模平台從 MongoDB 起家">MongoDB vendor</a></td>
      </tr>
      <tr>
          <td>Spanner / CockroachDB</td>
          <td>session / eventual consistency 可接受</td>
          <td>global SQL、strong transaction、cross-partition ACID 是核心需求</td>
          <td><a href="/blog/backend/01-database/vendors/spanner/" data-link-title="Google Cloud Spanner" data-link-desc="全球分散式 strong-consistency OLTP、TrueTime API、線性擴展到 10 億 req/sec">Spanner vendor</a>、<a href="/blog/backend/01-database/vendors/cockroachdb/" data-link-title="CockroachDB" data-link-desc="分散式 SQL、PostgreSQL 相容、跨區強一致、Spanner 的開源 / 跨雲替代">CockroachDB vendor</a></td>
      </tr>
      <tr>
          <td>Azure SQL Hyperscale</td>
          <td>document / NoSQL 是主要資料形狀</td>
          <td>JOIN-heavy、transaction-heavy、SQL Server 生態是主需求</td>
          <td><a href="/blog/backend/01-database/vendors/aurora/" data-link-title="AWS Aurora" data-link-desc="AWS managed PostgreSQL / MySQL、storage / compute 分離、&#43;75% 效能改善的 production 證據">Aurora vendor</a></td>
      </tr>
  </tbody>
</table>
<p>Cosmos DB 的簡單路徑是先固定 API model 與 consistency level。每個 API 的相容範圍、index 行為與 query cost 都不同；單純因為「同一服務支援多模型」而混用 API，後續 migration、debug 與容量估算會變複雜。</p>
<p>RU/s 的升級路徑要把 partition key 與 query shape 放在同一張圖。單純提高 RU/s 只能提高名義容量；logical partition 熱點、跨 partition query、index policy 與 payload size 仍會決定真實成本。</p>
<h2 id="已知-limitation-與後續路由">已知 limitation 與後續路由</h2>
<p>Cosmos DB overview 目前完成 Azure global NoSQL 判斷。下一輪 deep article / playbook 應補 consistency level 選擇、RU/s cost model、partition key design、multi-region conflict、Change Feed、MongoDB API migration、Cassandra API migration 與 Synapse Link。</p>
<h2 id="案例對照">案例對照</h2>
<table>
  <thead>
      <tr>
          <th>案例</th>
          <th>規模</th>
          <th>教學重點</th>
      </tr>
  </thead>
  <tbody>
      <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</a></td>
          <td>1M RU/s 測試、turnkey global distribution</td>
          <td>AR 遊戲全球分散</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</a></td>
          <td>1.67 億 req / 24h、48ms p99</td>
          <td>全球零售 Black Friday</td>
      </tr>
      <tr>
          <td><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></td>
          <td>planet-scale analytics</td>
          <td>MongoDB → Cosmos DB API-compatible 遷移、Microsoft 自家 dogfood</td>
      </tr>
  </tbody>
</table>
<p>Cosmos DB case 的讀法是分開看三種壓力：Minecraft Earth 提供 global partition 與 RU/s 訊號，ASOS 提供季節性零售尖峰訊號，Microsoft 365 提供 MongoDB API 相容遷移與 Azure dogfood 訊號。</p>
<h2 id="反向-sibling-路由">反向 sibling 路由</h2>
<p>Cosmos DB 的反向 sibling 路由用來把 Azure global NoSQL、DynamoDB 與 document migration 分開。若讀者從 DynamoDB 過來，先比較 RU/s、partition key、multi-region conflict 與 API model；若讀者從 MongoDB 過來，先把 API compatibility 當 migration hypothesis，再用 aggregation、index、change stream / Change Feed 行為驗證；若需求其實是 SQL strong consistency，轉到 <a href="/blog/backend/01-database/vendors/spanner/" data-link-title="Google Cloud Spanner" data-link-desc="全球分散式 strong-consistency OLTP、TrueTime API、線性擴展到 10 億 req/sec">Spanner vendor</a> 或 <a href="/blog/backend/01-database/vendors/cockroachdb/" data-link-title="CockroachDB" data-link-desc="分散式 SQL、PostgreSQL 相容、跨區強一致、Spanner 的開源 / 跨雲替代">CockroachDB vendor</a>。</p>
<p>這條路由的判準是 API model 是否已固定。Cosmos DB 的 multi-model 是產品入口，不代表同一套資料可以在多個 API 之間自由切換；partition key、index policy、RU/s 與 consistency level 一旦進 production，就會成為 migration 與成本邊界。</p>
<h2 id="常見陷阱">常見陷阱</h2>
<ul>
<li><strong>Strong consistency 用太多</strong>：多數互動式業務用 session consistency 就能滿足讀寫體驗</li>
<li><strong>partition key 只用 user_id</strong>：某些業務 user 集中（VIP、bot）會 hot</li>
<li><strong>忽略 Change Feed</strong>：寫入後通知、投影與同步流程適合先評估 Change Feed</li>
<li><strong>MongoDB API behavior 假設</strong>：API compat 仍要驗證 aggregation pipeline / index 行為</li>
<li><strong>忽略 multi-region 成本乘數</strong>：開 3 region active-active = 3 倍 RU 成本</li>
</ul>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>完整 T1 對照：<a href="/blog/backend/01-database/vendors/" data-link-title="資料庫 Vendor 清單" data-link-desc="規劃 SQL、managed SQL、document、KV 與 distributed SQL 的服務頁撰寫順序與教學大綱">01-database vendors index</a></li>
<li>平行：<a href="/blog/backend/01-database/vendors/dynamodb/" data-link-title="DynamoDB" data-link-desc="AWS managed key-value、partition-based scaling、9000 萬 RPS sustained 實戰證據">DynamoDB vendor</a>、<a href="/blog/backend/01-database/vendors/spanner/" data-link-title="Google Cloud Spanner" data-link-desc="全球分散式 strong-consistency OLTP、TrueTime API、線性擴展到 10 億 req/sec">Spanner vendor</a>、<a href="/blog/backend/01-database/vendors/mongodb/" data-link-title="MongoDB" data-link-desc="Document database 代表、Atlas managed、跨雲可用、許多大規模平台從 MongoDB 起家">MongoDB vendor</a></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> / <a href="/blog/backend/01-database/global-distributed-oltp/" data-link-title="1.11 全球分散式 OLTP" data-link-desc="Spanner / Aurora DSQL / Cosmos DB multi-region write / CockroachDB / TiDB 的全球一致性取捨">1.11 全球分散式 OLTP</a></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>（MongoDB → Cosmos 範例）</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/saturation-discovery/" data-link-title="9.4 Saturation Discovery" data-link-desc="找出 throughput plateau 與 latency knee 的方法">9.4 Saturation Discovery</a></li>
<li>Last reviewed：2026-05-22（API compatibility / consistency / RU model 屬時間敏感 claim）</li>
<li>官方：<a href="https://azure.microsoft.com/products/cosmos-db/">Azure Cosmos DB</a>、<a href="https://learn.microsoft.com/azure/cosmos-db/consistency-levels">Cosmos DB consistency levels</a></li>
</ul>
]]></content:encoded></item><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>