2023年9月13日

介绍 Prisma Client 的读取副本扩展

我们很高兴地推出 @prisma/extension-read-replicas Prisma Client 扩展!此扩展使您能够使用 Prisma Client 将工作负载分配到数据库副本上,以应对高流量工作负载。 立即体验

Introducing the Read Replicas Extension for 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

Neon 与传统的 PostgreSQL 提供商不同,因为它将存储与计算分离。

最近,他们推出了同区域读取副本,该功能利用这些计算实例作为读取副本,可以向上、向下或归零扩展副本。这意味着 Neon 在设置主数据库的读取副本方面比其他提供商快得多——它在底层使用相同的数据存储。

一个计算实例是一种提供项目虚拟化计算资源(例如 CPU、内存和存储)的服务。如果您想了解更多关于 Neon 读取副本工作原理的信息,我们建议阅读这篇博文

本文的其余部分将使用 Neon 进行读取副本设置。您可以选择不同的提供商进行读取副本设置。

要创建读取副本,请导航到 Neon 控制台并登录

  1. 如果您没有项目,请点击新建项目按钮创建一个。
  2. 填写您的项目详细信息:项目名称、PostgreSQL 版本和区域。项目创建完成后,您将被重定向到项目仪表板。
  3. 在项目仪表板的侧边栏中选择分支
  4. 选择您的数据库所在的分支。
  5. 选择添加计算。应该会出现一个创建计算端点对话框。
  6. 在对话框中,选择只读作为计算类型,并为您的工作负载配置计算大小。
  7. 完成计算端点配置后,点击创建

在 Neon 上创建读取副本

接下来,检索您刚刚创建的读取副本的连接字符串

  1. 导航到您的项目仪表板
  2. 连接详情下,选择您希望连接数据库的分支、数据库和角色。
  3. 计算下拉菜单中,选择您创建的“只读”计算类型端点。
  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 构造函数配置中的数据源名称,以简化扩展使用的程序化连接字符串覆盖。我们还为客户端扩展的未来改进创建了一些 GitHub Issue。如果您对这些改进中的任何一项感兴趣,请点赞或评论。

亲自尝试

我们鼓励您尝试 @prisma/extension-read-replicas 扩展,并期待您的反馈!🎉

查看这个示例应用程序,了解如何使用 @prisma/extension-read-replicas 扩展来启动和运行读取副本。

务必也尝试Prisma Client 扩展,并在TwitterDiscord 上与我们分享您构建的内容。🙌

不要错过下一篇文章!

订阅 Prisma 新闻通讯

© . All rights reserved.