Microsoft AZ-204: Azure Cosmos DB — 學習指南
屬於 Microsoft Azure Developer Associate AZ-204 — 學習指南. 使用經過驗證的解答練習: Microsoft 考試中心, 或參加限時模擬考試: ExamRoll.io.
總覽
Azure Cosmos DB 是一個完全受控、全球分佈的多模型資料庫,專為低延遲、彈性擴展的應用程式而設計。它在一個共用的分割區儲存與複寫引擎之上,公開了多種 API,提供五種可調整的一致性層級,並針對可用性、延遲、輸送量與一致性提供全方位的 SLA。資料被組織成帳戶、資料庫和容器 (依 API 不同,也可能稱為集合/資料表/圖形)。容器透過分割區索引鍵進行水平分割與擴展,所有操作都以要求單位 (Request Units, RU) 計量,RU 是一種標準化的貨幣,它抽象化了 CPU、IOPS 和記憶體。
API 與可程式性
Cosmos DB 支援多種線路相容的 API,讓您可以使用原生的 SDK 和驅動程式,而無需重寫您的資料模型:
- SQL (Core) API:建議用於新工作負載的預設選項。儲存 JSON 文件,並提供豐富的類 SQL 查詢 (SELECT、WHERE、ORDER BY、文件內的 JOIN、彙總) 以及用於計算述詞/投影的具決定性 UDF。伺服器端商業邏輯以 JavaScript 預存程序和前/後觸發程序的形式,在單一邏輯分割區內執行,從而能在共用相同分割區索引鍵的多個項目上實現 ACID 交易。Transactional
分割與輸送量 (RU)
Cosmos DB 將邏輯分割區與實體分割區分開:
- 邏輯分割區會根據分割區索引鍵值將項目分組。所有共用相同索引鍵的項目會一起參與交易批次和伺服器端指令碼。
- 實體分割區由服務管理,並託管多個邏輯分割區。輸送量 (RU) 和儲存空間會分散到各個實體分割區;「熱」邏輯分割區可能會成為實體分割區輸送量的瓶頸。
選擇一個具有高基數 (high cardinality) 且存取分佈隨時間均勻的有效分割區索引鍵。好的索引鍵應與您的主要存取路徑相關 (例如,userId、deviceId、tenantId 或 orderId)。避免使用會導致偏斜 (skew) 的低基數或時間分桶 (time-bucketed) 索引鍵 (例如,country、status 或 day)。當沒有單一屬性適合時:
- 使用串連多個屬性的合成索引鍵。
- 附加一個隨機或雜湊的後綴,以將負載分散到各個分割區,同時透過前綴查詢或維護一個查詢表來保持可查詢性。
- 考慮使用階層式分割區索引鍵來結合多個屬性,以實現更好的分佈和高效的前綴查詢。
輸送量模型:
- 佈建的輸送量:在容器或資料庫 (由子容器共用) 上預留 RU/s。可預測的效能與穩定的成本。手動或透過 API/CLI 進行擴展。
- 自動調整規模 (Autoscale):設定一個最大的 RU/s;Cosmos DB 會根據負載在該最大值的 10% 到 100% 之間彈性擴展。根據每小時使用的最高 RU 計費;非常適合變動的工作負載和未知的尖峰。
- 無伺服器 (Serverless):無須佈建 RU/s;按每次操作的 RU 消耗量付費。適合開發、突發性或沒有可預測基準線的低輸送量工作負載。
RU 優化技術包括透過 id+分割區索引鍵進行的點讀取 (point reads)、參數化查詢、選擇性投影 (selective projections)、反正規化以減少類似 JOIN 的模式,以及使用變更摘要 (change feed) 來建立衍生檢視,而非使用複雜的多容器查詢。使用 ETags 搭配 If-Match 進行並行控制,以避免耗費大量 RU 的重試。監控 RU 指標和節流 (HTTP 429),並在 SDK 中實作帶有抖動 (jitter) 的重試策略。
全球分佈與變更摘要
Cosmos DB 的一站式多區域分佈功能,讓您能隨時新增或移除區域。所有區域皆可讀取;啟用多區域寫入後,可在任何地方進行並行寫入,且在鄰近區域的第 99 個百分位數,讀取延遲低於 10 毫秒。用戶端 SDK 應設定偏好區域,以便將流量路由到本地並順暢地進行容錯移轉。在 .NET 中,透過 CosmosClientOptions 的 ApplicationPreferredRegions (或其他 SDK 中的對應項目) 來提供偏好區域。多區域寫入需要一個衝突解決原則:
- 最後寫入者獲勝 (Last Write Wins):使用一個衝突解決路徑 (例如,時間戳或版本屬性)。若未指定,可使用系統時間戳。
- 自訂解決方案 (Custom Resolution):使用一個合併預存程序 (merge stored procedure) 以確定性的方式協調衝突。
- 手動 (Manual):檢查衝突摘要 (conflicts feed) 並明確地解決。
變更摘要 (change feed) 為每個邏輯分割區索引鍵提供一個有序、僅供附加 (append-only) 的變更日誌。它非常適合用於:
- 事件驅動架構與 CQRS (將文件投影到為讀取最佳化的檢視表中)。
- 下游管線 (資料湖擷取、搜尋索引、快取失效)。
- 近乎即時的分析與稽核。 主要有兩種使用模式:
- Change Feed Processor 程式庫:分散式、容錯的處理方式,使用一個租用容器 (leases container) 來平衡工作者之間的分割區並安全地向外擴展。
- 使用 FeedIterator 的提取模型 (Pull model):透過您自己控制的檢查點邏輯,明確地迭代變更;跨 FeedRange 分割工作以進行平行處理。 Azure Functions 提供一個 Cosmos DB 觸發器,它封裝了 processor 模式,可用於無伺服器處理。您可以從頭開始或從「現在」開始,而全逼真度 (full-fidelity) 變更摘要會擷取中繼的更新與刪除,以提供完整的稽核軌跡。設計您的租用容器時,需具備足夠的輸送量,並選擇冪等 (idempotent) 的處理常式,以應對重試和至少一次 (at-least-once) 的傳遞。
實務問題情境
Spotify 需要提供一個全球可用的個人化服務,該服務能即時擷取使用者互動、更新每個使用者的推薦內容,並從最近的區域提供低延遲的讀取服務。寫入可能來自全球各地的行動用戶端,且推薦內容的更新必須扇出 (fan out) 到下游系統。
- 選擇 Cosmos DB SQL (Core) API 並啟用多區域寫入
- 原因:Core API 提供豐富的查詢功能與伺服器端程式設計能力。多區域寫入能將全球的寫入延遲降至最低,並在區域性容錯移轉時不會造成寫入中斷。
- 定義一個高基數的分割區索引鍵與階層式索引鍵
- 方法:以 userId 進行分割;對於極度活躍的使用者,可使用階層式索引鍵,例如 [“userId”, “bucket”],其中 bucket 是一個雜湊後綴。
- 原因:均勻分佈寫入與讀取負載,實現每個使用者的交易式更新,並避免熱分割區 (hot partitions)。
- 在主要容器上設定自動擴展輸送量
- 原因:流量有日夜變化且受活動驅動;自動擴展能處理高達設定最大 RU/s 的突發流量,同時讓成本與實際負載成正比。
- 在帳戶層級將一致性設定為 Session
- 原因:行動用戶端需要「讀取自己的寫入」(read-your-writes) 以提升使用者體驗,但又不受 Strong 一致性的延遲限制。Session token 由用戶端和閘道層攜帶,以在節點之間保留 session 語意。
- 使用 Azure Functions 和 Change Feed Processor 實作變更摘要處理
- 方法:建立一個 Functions 應用程式,其 Cosmos DB 觸發器綁定到互動容器。使用一個專用的租用容器 (leases container) 並啟用多個執行個體以進行平行處理。
- 原因:這提供了彈性、可擴展且低維運的處理方式,可用於更新具體化檢視 (materialized views) (例如,一個推薦容器),並將事件發佈到 Event Hubs 以進行串流分析。
- 建立一個衍生的推薦容器,並採用量身訂做的索引原則
- 方法:將大型、寫入頻繁的屬性從索引中排除;為 (userId, score DESC) 新增複合索引,以支援 TOP-K 查詢。
- 原因:降低 RU 寫入成本,同時實現高效率的排序查詢,以提供個人化摘要。
- 在 SDK 中啟用全球分佈並設定偏好區域
- 方法:在北美、歐洲和亞太地區新增區域。根據應用程式的部署區域,使用 ApplicationPreferredRegions 設定 CosmosClientOptions。
- 原因:確保讀取由本地提供服務以達到低於 10 毫秒的延遲,並使容錯移轉對應用程式透明。
- 設定衝突解決與可觀察性
- 方法:使用「最後寫入者獲勝」(Last Write Wins) 搭配伺服器產生的邏輯時鐘 (版本屬性) 進行冪等更新,並將衝突路由到監控佇列以處理罕見的邊緣案例。
- 原因:在並行的多區域寫入下保證確定性收斂,並提供維運可見性。
此架構提供了全球低延遲的讀寫、透過變更摘要實現的彈性事件處理、具成本效益的自動擴展,以及適合個人化工作負載的穩健一致性語意。
← Azure Storage 和 Blob Storage · 所有領域 · Azure 容器解決方案 →
練習這些題目 → · 在 ExamRoll.io 上限時練習 →
Pass the whole exam — not just this question
You found this answer. Get every verified question and explanation in one place, and save hours of prep. Free to start.
通過考試 →