<?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>Multi-Model on Tarragon</title><link>https://tarrragon.github.io/blog/tags/multi-model/</link><description>Recent content in Multi-Model 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/multi-model/index.xml" rel="self" type="application/rss+xml"/><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></channel></rss>