我們很高興分享 @prisma/extension-read-replicas
Prisma Client 擴充功能!此擴充功能讓您可以使用 Prisma Client,在高流量工作負載中跨資料庫複本分配工作負載。立即試用。
什麼是資料庫複本?為什麼要使用它們?
資料庫複本,也稱為「複本」,是主要資料庫執行個體的副本,可以與您的主要資料庫位於相同或不同的區域。
資料庫複寫的主要用途之一是建立讀取複本。讀取複本可以分散來自應用程式的讀取請求,將主要資料庫保留用於寫入操作。

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

從伺服器到主要資料庫的寫入操作查詢流程,以及資料傳播到讀取複本資料庫
複本可以在全球範圍內分佈,使資料更接近您的應用程式使用者。這可以減少回應應用程式請求時的延遲。
複本的另一個寶貴優勢是它們可以提高資料庫的彈性和可靠性。這可以防止您的主要資料庫成為單點故障。如果主要執行個體發生資料庫故障、資料損壞或資料遺失,則可以將複本升級為主要執行個體。
大多數資料庫供應商都支援讀取複本。以下是一些提供讀取複本支援的供應商範例
搭配 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 與傳統 PostgreSQL 供應商不同,因為它們將儲存與運算分離。
最近,他們推出了同區域讀取複本,它使用這些 運算執行個體 作為讀取複本,以向上、向下或縮放至零。這表示 Neon 在設定主要資料庫的讀取複本方面比其他供應商快得多 - 它在底層使用相同的資料儲存。
運算執行個體是一種服務,可提供專案的虛擬化運算資源,例如 CPU、記憶體和儲存空間。如果您想了解更多關於 Neon 讀取複本如何運作的資訊,我們建議您閱讀這篇 部落格文章。
本文的其餘部分將使用 Neon 進行讀取複本設定。您可以為您的讀取複本設定選擇不同的供應商。
若要建立讀取複本,請導覽至 Neon 儀表板並登入
- 如果您沒有專案,請按一下「New Project (新增專案)」按鈕建立一個專案。
- 填寫專案的詳細資訊:專案名稱、PostgreSQL 版本和區域。專案建立完成後,您將被重新導向到專案的儀表板。
- 在專案儀表板的側邊欄上選取「Branches (分支)」。
- 選取資料庫所在的分支。
- 選取「Add compute (新增運算)」。應該會出現「Create Compute Endpoint (建立運算端點)」對話方塊。
- 在對話方塊中,選取「Read-Only (唯讀)」作為運算,並為您的工作負載設定運算大小。
- 完成運算端點設定後,按一下「Create (建立)」。

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

在 Neon 上連線到讀取複本
在您的應用程式中,為資料庫複本建立新的環境變數,並貼上您剛從 Neon 儀表板複製的值
使用 @prisma/extension-read-replicas
連線到您的讀取複本
若要開始在您的應用程式中使用讀取複本,請在您的專案中安裝 擴充功能
接下來,透過擴充現有的 Prisma Client 執行個體並將其指向資料庫複本來初始化擴充功能
如果您想要設定多個複本,您可以重複上述步驟以建立其他複本。然後,依照以下方式更新應用程式中的 readReplicas
設定
就這樣!
當您執行應用程式時,此擴充功能會將所有讀取操作 (例如 findMany
) 傳送到資料庫複本。如果您定義了多個複本,則會隨機選取一個複本。
任何寫入查詢 (例如 create
、update
...) 以及 $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 擴充功能,並在 Twitter 或 Discord 上與我們分享您建置的內容。 🙌
不要錯過下一篇文章!
訂閱 Prisma 電子報