跳至主要内容

常见问题解答

何时应为 Prisma Accelerate 启用静态 IP?

当您的安全设置需要 IP 允许列表或您正在实施仅允许来自受信任 IP 的访问的防火墙时,为 Accelerate 启用静态 IP,以确保受控且安全的数据库连接。

Result of enabling static IP Accelerate with a database using IP allowlisting

了解更多信息,请访问如何在平台控制台中为 Accelerate 启用静态 IP.

信息

什么是静态 IP?

静态 IP 地址是固定的 IPv4 或 IPv6 地址。与可以无规律地更改的动态 IP 地址不同,来自静态 IP 地址的流量可以轻松识别。

What is a static IP

ℹ️ 为了在您现有的或新的项目环境中启用对 Accelerate 的静态 IP 支持,您的工作区需要使用我们的专业版企业版计划。请查看定价页面了解更多信息。

为什么有时会看到意外的缓存行为?

当 Accelerate 观察到来自项目的较高负载时,Accelerate 的缓存性能最佳。许多缓存操作(例如将数据提交到缓存和刷新陈旧数据)是异步发生的。在对 Accelerate 进行基准测试时,我们建议使用循环或负载测试方法。这将更好地模拟较高的负载情况,并减少低频操作的异常值。

Prisma 操作通过 HTTP 发送到 Accelerate。因此,对 Accelerate 的第一个请求必须建立 HTTP 握手,并且可能因此导致额外的延迟。我们正在探索将来减少这种初始请求延迟的方法。

Accelerate 的定价是多少?

您可以在我们的Accelerate 定价页面找到更多详细信息。

VS Code 不识别$extends方法

如果您将 Prisma Client 扩展程序添加到当前在 VS Code 中打开的现有项目中,编辑器可能不会立即识别$extends方法。

这可能是 TypeScript 服务器尚未识别出重新生成的 Prisma Client 的问题。要解决此问题,您需要重新启动 TypeScript。

  1. 在 VS Code 中,打开命令面板。您可以通过按 F1 或选择查看>命令面板来执行此操作。
  2. 输入typescript并选择并运行TypeScript: 重新启动 TS 服务器命令。

VS Code 现在应该识别$extends方法。

Accelerate 的缓存节点在哪些区域可用?

Accelerate 运行在 Cloudflare 的网络上,缓存命中从 Cloudflare 的 300 多个位置提供。您可以在此处找到 Accelerate 的缓存节点可用的区域:https://www.cloudflare.com/network/.

Accelerate 的连接池在哪些区域可用?

当未指定缓存策略或在缓存未命中时,Prisma Client 查询将通过 Accelerate 的连接池路由。目前,查询可以通过 16 个可用位置中的任何一个选择的区域路由。

目前,可用区域列表如下

  • 亚太地区,孟买 (ap-south-1)
  • 亚太地区,首尔 (ap-northeast-2)
  • 亚太地区,新加坡 (ap-southeast-1)
  • 亚太地区,悉尼 (ap-southeast-2)
  • 亚太地区,东京 (ap-northeast-1)
  • 加拿大,中部 (ca-central-1)
  • 欧洲,法兰克福 (eu-central-1)
  • 欧洲,爱尔兰 (eu-west-1)
  • 欧洲,伦敦 (eu-west-2)
  • 欧洲,巴黎 (eu-west-3)
  • 欧洲,斯德哥尔摩 (eu-north-1)
  • 南美洲,圣保罗 (sa-east-1)
  • 美国东部,北弗吉尼亚州 (us-east-1)
  • 美国东部,俄亥俄州 (us-east-2)
  • 美国西部,北加州 (us-west-1)
  • 美国西部,俄勒冈州 (us-west-2)

您也可以在设置 Accelerate 时或在 Prisma Cloud Platform 仪表板中 Accelerate 的设置选项卡下的区域部分查看可用区域。

Accelerate 如何知道从哪个区域获取缓存?

在幕后,Accelerate 使用 Cloudflare,Cloudflare 使用Anycast进行网络寻址和路由。传入的请求将被路由到其网络中最近的数据中心或“节点”,该数据中心或“节点”具有有效处理请求的能力。要详细了解其工作原理,我们建议您查看Anycast.

如何在 Accelerate 上使缓存失效?

如果您使用的是付费计划,可以通过$accelerate.invalidate API按需使缓存失效,或者您可以每天最多五次在项目级别使整个缓存失效。此限制根据您的计划设置。您可以通过 Accelerate 配置页面进行管理。

Accelerate 的一致性模型是什么?

Accelerate 没有一致性模型。它不是一个分布式系统,其中节点需要达成一致(因为数据只存储在最靠近用户的缓存节点中)。但是,存储在 Accelerate 的缓存节点中的缓存数据不会传播到其他节点,因此 Accelerate 按照设计不需要一致性模型。

Accelerate 实现了一个读取缓存策略,特别适用于读密集型工作负载。

缓存提供的数据的最新程度取决于您的查询中定义的缓存策略。有关为您的查询选择合适的缓存策略的更多信息,请参阅本节.

Accelerate 与其他缓存工具(例如 Redis)有何不同?

  • Accelerate 是一个专用缓存,允许您使用缓存策略在查询级别优化代码中的数据访问。另一方面,Redis 和 Memcached 等工具是旨在适应性和灵活性的通用缓存。
  • Accelerate 是一种托管服务,可减少构建和维护缓存服务的所需时间、风险和工程量。
  • 默认情况下,Accelerate 是全局分布的,减少了您的查询延迟。其他缓存工具需要额外的配置才能使其在全球范围内可用。

何时不应使用 Accelerate 的缓存功能?

Accelerate 是一个全球数据缓存和连接池,允许您在查询级别优化代码中的数据访问。虽然使用 Accelerate 进行缓存可以极大地提高应用程序的性能,但它并不总是最适合您的用例的选择。

如果您的应用程序满足以下条件,Accelerate 的全局缓存功能可能不适合您的应用程序

  • 您的应用程序仅在特定区域内使用,并且您的应用程序服务器和数据库都位于同一区域的同一网络中。例如,如果您的应用程序服务器和数据库位于同一区域和网络中,则数据库查询可能会快得多。但是,如果您的应用程序服务器与您的数据库位于不同的区域或网络中,则 Accelerate 会加速您的查询,因为数据将缓存在最靠近您的应用程序的数据中心中。

  • 只需要一个通用缓存。Accelerate 是一个连接池和专用缓存,它只在代码中缓存数据库查询响应。通用缓存(如 Redis)允许您缓存来自多个来源的数据,例如外部 API,而 Accelerate 目前不支持。如果您对通用缓存感兴趣,请通过我们的 Discord 与我们分享您的反馈。

  • 您的应用程序数据始终需要在检索时保持最新,这使得难以建立合理的缓存策略。

即使不使用 Accelerate 的全局缓存,您仍然可以通过使用其连接池从 Accelerate 中获得极大的收益,尤其是在无服务器或边缘函数中,在这些环境中难以管理和扩展数据库连接。您可以了解有关无服务器挑战的更多信息 这里

我可以在其他 ORM/查询构建器/驱动程序中使用 Accelerate 吗?

不可以。我们目前没有计划支持其他 ORM/查询构建器或驱动程序。但是,如果您对支持其他库感兴趣,请随时联系我们,并在我们的 Discord 社区的 #help-and-questions 频道告诉我们。

在配置 cacheStrategy 时,ttl 参数的最大允许值是多少?

可以将生存时间 (ttl) 参数设置为最长一年。但是,重要的是要注意,如果缓存中的项目访问频率不高,则可能会被逐出。

根据我们的实验,我们发现缓存项目可以持续大约 18 小时。虽然项目如果被积极访问,可能会在缓存中保留更长时间,但没有保证。

注意:即使访问频率很高的项目也可能会偶尔被逐出缓存。无论其活动级别如何,项目都不可能生存长达一个月或更长时间。

为什么 Accelerate 在服务中断时不回退到直接连接字符串?

在极少数情况下,如果发生服务中断,回退到直接连接将绕过连接池。这可能会耗尽数据库的可用连接,并在数据库级别引起其他问题。

如果发生服务中断,建议在 状态页面 上进行验证。您可以联系 Prisma 的 支持渠道 获取帮助。

注意:此外,值得注意的是,一些边缘函数运行时环境可能不支持使用 Prisma ORM 进行直接连接。有关更多详细信息,请参阅我们的 边缘函数文档

交互式事务中的每个查询在计费方面是否单独计算?

是的,交互式事务 根据事务中的单个操作进行计费。事务本身的开始、提交或回滚不会产生任何费用。例如,在以下查询中,有两个可计费查询

await prisma.$transaction(async (tx) => {
await tx.user.deleteMany({ where: { name: 'John Doe' } });
await tx.user.createMany({ data });
});

但是,当使用 $transaction API 进行顺序客户端操作 时,无论数组中包含多少个查询,都只计为一个可计费查询。例如

await prisma.$transaction([
prisma.user.deleteMany({ where: { name: 'John Doe' } }),
prisma.user.createMany({ data }),
]);

如果您不需要 交互式事务,可以使用 顺序操作事务 来节省成本并提高性能。顺序操作事务在 Accelerate 上执行得更好,因为它们以一次往返方式执行到数据库,而交互式事务需要分别进行往返以开始、提交和对事务上的每个单独操作。

Accelerate 和 Pulse 的静态 IP 范围是否不同?

不,如果您使用相同的数据库 URL 为 Accelerate 和 Pulse 启用了静态 IP,则为这两个产品生成的静态 IP 范围将相同。

我可以增加我的 Accelerate 查询持续时间和响应大小限制吗?

是的,您可以根据您的订阅计划增加 Accelerate 限制。以下是可配置的限制

限制入门版专业版企业版
查询超时最长 10 秒最长 20 秒最长 60 秒
交互式事务超时最长 15 秒最长 30 秒最长 90 秒
响应大小最长 5 MB最长 10 MB最长 20 MB

请查看 定价页面,以详细了解可用的计划及其相应的限制。

警告

虽然您可以根据您的订阅计划增加这些限制,但仍然建议优化您的数据库操作。 在我们的故障排除指南中了解更多信息。

使缓存查询结果失效需要多长时间?

由于需要全局清除缓存,因此难以提供具体的时间范围。但是,缓存数据最终是一致的,通常会在几秒钟内传播到所有 PoP。在极少数情况下,可能需要更长的时间。

失效重新验证有什么区别?

失效:删除缓存条目,并在下次请求时获取新数据,导致缓存未命中。这会删除陈旧数据,但可能会导致响应速度变慢,直到缓存重新填充。

重新验证:主动更新缓存条目,确保下次请求使用缓存中的新鲜数据。这会使缓存保持有效,并通过避免缓存未命中来保持更快的响应时间。