2023 年 9 月 13 日

隆重介紹適用於 Prisma Client 的 Read Replicas 擴充功能

我們很高興分享 @prisma/extension-read-replicas Prisma Client 擴充功能!此擴充功能讓您可以使用 Prisma Client,在高流量工作負載中跨資料庫複本分配工作負載。立即試用

Introducing the Read Replicas Extension for Prisma Client

什麼是資料庫複本?為什麼要使用它們?

資料庫複本,也稱為「複本」,是主要資料庫執行個體的副本,可以與您的主要資料庫位於相同或不同的區域。

資料庫複寫的主要用途之一是建立讀取複本。讀取複本可以分散來自應用程式的讀取請求,將主要資料庫保留用於寫入操作。

Read operation query flow from the server to the read replica database

從伺服器到讀取複本資料庫的讀取操作查詢流程

Write operation query flow from the server to the primary database and data propagation to the read replica database

從伺服器到主要資料庫的寫入操作查詢流程,以及資料傳播到讀取複本資料庫

複本可以在全球範圍內分佈,使資料更接近您的應用程式使用者。這可以減少回應應用程式請求時的延遲。

複本的另一個寶貴優勢是它們可以提高資料庫的彈性和可靠性。這可以防止您的主要資料庫成為單點故障。如果主要執行個體發生資料庫故障、資料損壞或資料遺失,則可以將複本升級為主要執行個體。

大多數資料庫供應商都支援讀取複本。以下是一些提供讀取複本支援的供應商範例

搭配 Prisma Client 使用讀取複本

將讀取複本整合到應用程式中有多種方法。從您的應用程式連線到讀取複本的一種方法是設定 DNS 服務,例如 Amazon Route 53,它公開單一連線字串。然後,DNS 服務會根據傳入請求的量,平衡複本之間的負載。

將讀取複本整合到應用程式的另一種方法是透過資料層,例如資料庫驅動程式、查詢產生器或物件關係對應器 (ORM)。在這種情況下,您可以為資料層、主要執行個體和複本提供多個連線字串。然後,資料層會透過將查詢導向到合適的複本來協調請求分配。

在 Node.js 生態系統中,Prisma 是實作應用程式資料層最受歡迎的程式庫之一。Prisma Client 中對讀取複本的支援是最受歡迎的功能之一。

我們很高興分享 @prisma/extension-read-replicas 擴充功能,它透過 Prisma Client 擴充功能實現了這一點!

在底層,此擴充功能會為每個資料庫複本建立和管理 Prisma Client 執行個體。預設情況下,此擴充功能會將每個讀取請求路由到隨機設定的複本。

使用 @prisma/extension-read-replicas 連線到讀取複本

若要利用 @prisma/extension-read-replicas,請確保在您的資料庫供應商中設定了讀取複寫。完成後,您可以使用讀取複本設定擴充功能。

在本文的範例中,我們將使用 Neon 來建立和連線到讀取複本。如果您已經設定了複本,則可以跳到 使用 Prisma Client 連線您的讀取複本

建立和連線到 Neon 讀取複本

Neon

Neon 與傳統 PostgreSQL 供應商不同,因為它們將儲存與運算分離。

最近,他們推出了同區域讀取複本,它使用這些 運算執行個體 作為讀取複本,以向上、向下或縮放至零。這表示 Neon 在設定主要資料庫的讀取複本方面比其他供應商快得多 - 它在底層使用相同的資料儲存。

運算執行個體是一種服務,可提供專案的虛擬化運算資源,例如 CPU、記憶體和儲存空間。如果您想了解更多關於 Neon 讀取複本如何運作的資訊,我們建議您閱讀這篇 部落格文章

本文的其餘部分將使用 Neon 進行讀取複本設定。您可以為您的讀取複本設定選擇不同的供應商。

若要建立讀取複本,請導覽至 Neon 儀表板並登入

  1. 如果您沒有專案,請按一下「New Project (新增專案)」按鈕建立一個專案。
  2. 填寫專案的詳細資訊:專案名稱、PostgreSQL 版本和區域。專案建立完成後,您將被重新導向到專案的儀表板。
  3. 在專案儀表板的側邊欄上選取「Branches (分支)」。
  4. 選取資料庫所在的分支。
  5. 選取「Add compute (新增運算)」。應該會出現「Create Compute Endpoint (建立運算端點)」對話方塊。
  6. 在對話方塊中,選取「Read-Only (唯讀)」作為運算,並為您的工作負載設定運算大小。
  7. 完成運算端點設定後,按一下「Create (建立)」。

在 Neon 上建立讀取複本

接下來,檢索您剛建立的讀取複本的連線字串

  1. 導覽至您的專案「Dashboard (儀表板)」。
  2. 在「Connection Details (連線詳細資訊)」下,選取您要連線到資料庫的分支、資料庫和角色。
  3. 在「Compute (運算)」下拉式選單下,選取您建立的「Read-only (唯讀)」運算類型端點。
  4. 從程式碼範例複製連線字串。您將使用此連線字串連線到您的讀取複本。

在 Neon 上連線到讀取複本

在您的應用程式中,為資料庫複本建立新的環境變數,並貼上您剛從 Neon 儀表板複製的值

使用 @prisma/extension-read-replicas 連線到您的讀取複本

若要開始在您的應用程式中使用讀取複本,請在您的專案中安裝 擴充功能

接下來,透過擴充現有的 Prisma Client 執行個體並將其指向資料庫複本來初始化擴充功能

如果您想要設定多個複本,您可以重複上述步驟以建立其他複本。然後,依照以下方式更新應用程式中的 readReplicas 設定

就這樣!

當您執行應用程式時,此擴充功能會將所有讀取操作 (例如 findMany) 傳送到資料庫複本。如果您定義了多個複本,則會隨機選取一個複本。

任何寫入查詢 (例如 createupdate...) 以及 $transaction 查詢都會轉送到資料庫的主要執行個體,這會導致將產生的變更傳播到現有的資料庫複本。

如果您想要從主要資料庫讀取並繞過讀取複本,則此擴充功能會在擴充的 Prisma Client 執行個體上提供 $primary() 方法

此 Prisma Client 查詢將始終路由到您的主要資料庫,以確保資料為最新。

為什麼我們將讀取複本支援建置為 Prisma Client 擴充功能?

目前將擴充功能作為獨立套件而不是 ORM 的一部分的一個顯著優勢是,它允許我們獨立於 ORM 版本發布對擴充功能的改進。因此,我們將能夠根據需要完善 API,以確保擴充功能解決我們社群的需求。

作為獨立套件/儲存庫發布的副作用是,程式碼庫將保持相對較小且易於管理。這將允許我們的社群成員透過建立提取請求來改進擴充功能。

雖然 Prisma Client 擴充功能自 Prisma 4.16.0 以來已正式發布,但我們也將自己建置擴充功能的經驗作為進一步改進 Prisma Client 擴充功能 API 的機會。例如,在 5.2.0 中,為了準備此擴充功能,我們移除了 Prisma Client 建構函式組態中的資料來源名稱,以簡化程式化連線字串覆寫 (擴充功能使用)。我們也為 Client Extensions 的未來改進建立了一些 GitHub 問題。如果您對這些改進中的任何一項感興趣,請留下贊成票或評論。

親自試用

我們鼓勵您試用 @prisma/extension-read-replicas 擴充功能,並期待收到您的意見反應! 🎉

查看此範例應用程式,以了解如何開始使用 @prisma/extension-read-replicas 擴充功能來執行讀取複本。

也請務必試用 Prisma Client 擴充功能,並在 TwitterDiscord 上與我們分享您建置的內容。 🙌

不要錯過下一篇文章!

訂閱 Prisma 電子報