共用方式為


使用 Azure Cosmos DB 與 Azure Functions 的無伺服器資料庫運算

無伺服器運算的核心在於能夠專注於可重複且無狀態的單一邏輯片段。 這些零件不需要基礎設施管理,且只消耗資源在運行時的秒數或毫秒內。 無伺服器運算運動的核心是函數,這些函數由 Azure Functions 在 Azure 生態系統中提供。 想了解 Azure 中其他無伺服器執行環境,請參閱 Azure 無伺服器 頁面。

透過 Azure Cosmos DB 與 Azure Functions 的原生整合,你可以直接從 Azure Cosmos DB 帳號建立資料庫觸發器、輸入綁定和輸出綁定。 利用 Azure Functions 與 Azure Cosmos DB,您可以為全球用戶建立並部署事件驅動的無伺服器應用程式,並以低延遲方式存取豐富資料。

如果資料庫用戶端管理不當,Azure Functions 可能會在每次呼叫中建立隔離的資料庫連線,這可能會影響高並發時的連線效能,尤其是在 Consumption 計畫中。 然而,使用 Cosmos DB 綁定或觸發時,Azure Functions 內部會重用共用的 Cosmos DB SDK 客戶端,確保多次調用間的連線池效率。 Azure Cosmos DB 支援基於 HTTP 與 TCP 的 連接模式。 此架構支援需要動態資料存取的可擴展且高效能的工作負載。

概觀

Azure Cosmos DB 與 Azure Functions 讓您能以以下方式整合資料庫與無伺服器應用程式:

  • 創建一個事件驅動的Azure 函數觸發器用於 Azure Cosmos DB。 此觸發器依賴 變更串流 來監控您的 Azure Cosmos 資料庫容器是否有變更。 當容器有任何變更時,變更串流會被送入觸發器,觸發器會呼叫 Azure 函式。
  • 或者,可以用 輸入綁定將 Azure Function 綁定到 Azure Cosmos DB 容器。 輸入綁定會在函式執行時從容器讀取資料。
  • 輸出綁定將函式綁定到 Azure Cosmos DB 容器。 輸出綁定會在函式完成時將資料寫入容器。

備註

目前,Azure Cosmos DB 的 Azure Functions 觸發器、輸入綁定與輸出綁定僅支援 NoSQL API 使用。 對於所有其他 Azure Cosmos DB API,你應透過靜態客戶端從你的函數存取資料庫。

下圖說明了這三種整合。

Azure Cosmos DB 與 Azure Functions 如何整合

Azure Cosmos 資料庫的 Azure Functions 觸發器、輸入綁定與輸出綁定可以下組合使用:

  • Azure Cosmos DB 的 Azure Functions 觸發器可用於輸出綁定到其他 Azure Cosmos DB 容器。 當函式對變更串流中的項目執行動作後,你可以把它寫到另一個容器(寫到原本的容器會形成遞迴迴圈)。 或者,你也可以使用 Azure Cosmos DB 的 Azure Functions 觸發器,透過輸出綁定,有效地將所有變更的項目從一個容器遷移到另一個容器。
  • Azure Cosmos DB 的輸入綁定與輸出綁定可以在同一個 Azure 函式中使用。 這在你想找某些資料時很有效,因為你想用輸入綁定找到資料,在 Azure 函式中修改,然後在修改後儲存到同一個容器或不同的容器。
  • Azure Cosmos DB 容器的輸入綁定可以與 Azure Cosmos DB 的 Azure Functions 觸發器共用同一函式,且可搭配或不使用輸出綁定。 你可以使用這個組合,將最新的貨幣兌換資訊(透過輸入綁定到交換容器中獲取)套用到購物車服務中新訂單的變更資訊流。 更新後的購物車總數,若套用當前貨幣換算,可透過輸出綁定寫入第三個容器。

使用案例

以下的使用案例展示了幾種能最大化利用 Azure Cosmos 資料庫資料的方法——將資料連接到事件驅動的 Azure 函式。

物聯網使用案例 - Azure Functions 觸發器及 Azure Cosmos DB 的輸出綁定

在物聯網實作中,當連網車輛顯示引擎故障燈時,你可以呼叫一個功能。

實施: 使用 Azure Functions 觸發器和 Azure Cosmos DB 的輸出綁定

  1. Azure Functions 觸發器 用於觸發 Azure Cosmos 資料庫中的事件,這些事件與汽車警示相關,例如在連網車輛中引擎故障燈亮起。
  2. 當引擎故障燈亮起時,感測器資料會傳送到 Azure Cosmos 資料庫。
  3. Azure Cosmos DB 會建立或更新新的感測器資料文件,然後這些變更會串流到 Azure Cosmos DB 的 Azure Functions 觸發器。
  4. 觸發器會在感測器資料收集的每次資料變更時被觸發,因為所有變更都透過變更串流傳輸。
  5. 在將感測器資料傳送至保固部門的功能中,會使用閾值條件。
  6. 若溫度也超過某個值,也會向擁有者發送警報。
  7. 函式的 輸出綁定 會更新另一個 Azure Cosmos 資料庫容器中的車輛記錄,以儲存檢查引擎事件的資訊。

以下圖片顯示了 Azure 入口網站中為此觸發器所寫的程式碼。

在 Azure 入口網站建立 Azure Cosmos DB 的 Azure Functions 觸發器

財務應用案例 - 計時器觸發與輸入綁定

在財務實作中,當銀行帳戶餘額低於某個金額時,你可以啟動一個函數。

實施: 一個帶有 Azure Cosmos DB 輸入綁定的計時器觸發器

  1. 利用 計時器觸發器,你可以透過 輸入綁定,在定時間隔取得儲存在 Azure Cosmos 資料庫容器中的銀行帳戶餘額資訊。
  2. 如果餘額低於使用者設定的低餘額門檻,則透過 Azure 函式進行後續操作。
  3. 輸出綁定可透過 SendGrid 整合 從服務帳號發送電子郵件至低餘額帳號所指定的電子郵件地址。

以下圖片展示了此情境中 Azure 入口網站的程式碼。

Index.js 檔案,用於財務情境的計時器觸發器

Run.csx 檔案用於財務情境的計時器觸發器

遊戲案例 - Azure Functions 觸發器及 Azure Cosmos DB 的輸出綁定

在遊戲領域,當新用戶被創建時,你可以使用 Azure Cosmos DB for Gremlin 搜尋可能認識他們的其他使用者。 接著你可以把結果寫入 Azure Cosmos 資料庫或 SQL 資料庫,方便檢索。

實施: 使用 Azure Functions 觸發器和 Azure Cosmos DB 的輸出綁定

  1. 利用 Azure Cosmos DB 圖形資料庫 來儲存所有使用者,你可以為 Azure Cosmos DB 建立一個帶有 Azure Functions 觸發器的新函式。
  2. 每當新增使用者時,會呼叫該函式,然後透過 輸出綁定儲存結果。
  3. 該函式會查詢圖資料庫,搜尋所有與新使用者直接相關的使用者,並將該資料集回傳給函式。
  4. 這些資料會儲存在 Azure Cosmos 資料庫中,任何前端應用程式都能輕鬆取得,向新用戶展示他們已連接的朋友。

零售應用情境——多重功能

在零售實作中,當使用者將商品加入購物籃時,你現在可以靈活地建立並呼叫可選的商業管線元件函式。

實施: 多個 Azure Functions 觸發器用於啟用 Azure Cosmos DB,以監聽一個容器

  1. 你可以透過在每個 Azure Functions 中加入 Azure Cosmos DB 的 Azure Functions 觸發器來建立多個 Azure Functions——這些觸發器都會監聽同一個購物車資料的變更資訊流。 當多個函數同時監聽同一個變更流時,每個函數都需要一個新的租約集合。 欲了解更多租賃收款資訊,請參閱 「了解變更訂閱處理工具庫」。
  2. 每當新增商品加入使用者購物車時,每個功能都會由購物車容器的變更資訊流獨立調用。
    • 其中一個功能可能利用當前購物籃的內容來改變使用者可能感興趣的其他項目的顯示。

    • 另一個功能則可能更新庫存總數。

    • 另一個功能則是將特定產品的顧客資訊傳送給行銷部門,行銷部門會寄送促銷郵件給他們。

      任何部門都可以透過監聽變更回饋來建立用於 Azure Cosmos 資料庫的 Azure Functions,並確保不會延誤重要的訂單處理事件。

在所有這些使用情境中,因為函式本身已經將應用程式解耦,你不需要一直啟動新的應用程式實例。 相反地,Azure 函式會啟動個別函數,以完成所需的離散程序。

Tooling

Azure Cosmos DB 與 Azure Functions 之間的原生整合可在 Azure 入口網站及 Visual Studio 中取得。

為什麼選擇 Azure Functions 整合來進行無伺服器運算?

Azure Functions 提供建立可擴展的工作單元,或簡潔的邏輯片段,可隨需執行,無需配置或管理基礎設施。 使用 Azure Functions 後,你不必建立完整的應用程式來回應 Azure Cosmos 資料庫的變更,你可以為特定任務建立小型可重複使用的函式。 此外,你也可以使用 Azure Cosmos 資料庫資料作為 Azure 函式的輸入或輸出,回應像是 HTTP 請求或定時觸發器等事件。

Azure Cosmos DB 是你無伺服器運算架構推薦的資料庫,原因如下:

  • 即時存取所有資料:你可以細緻存取每個儲存的值,因為 Azure Cosmos DB 預設 會自動索引 所有資料,並立即提供這些索引。 這代表你可以持續查詢、更新並新增資料庫中的項目,並透過 Azure 函式即時存取。

  • 無圖式。 Azure Cosmos DB 是無結構的——所以它能獨特地處理 Azure 函式的任何資料輸出。 這種「處理任何事情」的方法讓建立各種函式變得簡單,這些函式都能輸出到 Azure Cosmos DB。

  • 可擴展的吞吐量。 在 Azure Cosmos 資料庫中,吞吐量可以即時調整。 如果你有數百甚至數千個函式查詢並寫入同一個容器,你可以擴充 RU/s 來處理負載。 所有功能都可以並行使用你分配的 RU/s,且資料能保證一致。

  • 全球複製。 你可以在全球複製 Azure Cosmos 資料庫資料以 降低延遲,並將資料定位最接近使用者所在位置。 與所有 Azure Cosmos DB 查詢一樣,事件驅動觸發器會從最接近使用者的 Azure Cosmos DB 讀取資料。

如果你想整合 Azure Functions 來儲存資料,不需要深度索引,或是需要儲存附件和媒體檔案, Azure Blob Storage 觸發 器可能是更好的選擇。

Azure Functions 的優點:

  • 事件驅動。 Azure Functions 是事件驅動的,可以監聽來自 Azure Cosmos DB 的變更串流。 這表示你不需要建立聆聽邏輯,只要留意你正在聆聽的變化即可。

  • 沒有限制。 函式會平行執行,服務會根據你需要啟動多個功能。 你自己設定參數。

  • 適合快速完成任務。 每當事件觸發時,服務會啟動新的函式實例,並在函式完成後立即將其關閉。 你只為功能運行的時間付費。

如果你不確定 Flow、Logic Apps、Azure Functions 或 WebJobs 哪個最適合你的實作,請參考「 選擇流程、邏輯應用程式、函式與 WebJobs」。

後續步驟

現在讓我們真正連接 Azure Cosmos DB 和 Azure Functions: