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