我們很高興地推出 @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 控制檯並登入
- 如果您沒有專案,請點選新建專案按鈕建立一個。
- 填寫您的專案詳細資訊:專案名稱、PostgreSQL 版本和區域。專案建立完成後,您將被重定向到專案儀表板。
- 在專案儀表板的側邊欄中選擇分支。
- 選擇您的資料庫所在的分支。
- 選擇新增計算。應該會出現一個建立計算端點對話方塊。
- 在對話方塊中,選擇只讀作為計算型別,併為您的工作負載配置計算大小。
- 完成計算端點配置後,點選建立。

在 Neon 上建立讀取副本
接下來,檢索您剛剛建立的讀取副本的連線字串
- 導航到您的專案儀表板。
- 在連線詳情下,選擇您希望連線資料庫的分支、資料庫和角色。
- 在計算下拉選單中,選擇您建立的“只讀”計算型別端點。
- 從程式碼示例中複製連線字串。您將使用此連線字串連線到您的讀取副本。

連線到 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 建構函式配置中的資料來源名稱,以簡化擴充套件使用的程式化連線字串覆蓋。我們還為客戶端擴充套件的未來改進建立了一些 GitHub Issue。如果您對這些改進中的任何一項感興趣,請點贊或評論。
親自嘗試
我們鼓勵您嘗試 @prisma/extension-read-replicas 擴充套件,並期待您的反饋!🎉
檢視這個示例應用程式,瞭解如何使用 @prisma/extension-read-replicas 擴充套件來啟動和執行讀取副本。
務必也嘗試Prisma Client 擴充套件,並在Twitter 或 Discord 上與我們分享您構建的內容。🙌
不要錯過下一篇文章!
訂閱 Prisma 新聞通訊