我们很高兴分享 @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 问题。如果您对这些改进中的任何一项感兴趣,请留下赞成票或评论。
亲自试用
我们鼓励您试用 @prisma/extension-read-replicas
扩展,并期待听到您的反馈! 🎉
查看此示例应用程序,了解如何开始使用 @prisma/extension-read-replicas
扩展的读取副本。
务必也试用 Prisma Client 扩展,并在 Twitter 或 Discord 上与我们分享您的构建成果。 🙌
不要错过下一篇文章!
注册 Prisma 新闻通讯