跳至主要内容

常见问题解答

何时应为 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 进行基准测试时,我们建议使用循环或负载测试方法。这将更好地模拟高负载场景并减少低频操作的异常值。

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

Accelerate 的定价是多少?

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

VS Code 无法识别 $extends 方法

如果您将 Prisma Client 扩展程序用于 Accelerate 添加到当前在 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,后者使用 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。在极少数情况下,可能需要更长时间。

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

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

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

什么是按需缓存失效?

按需缓存失效 允许应用程序在数据更改时立即更新特定的缓存数据,而不是等待定期缓存刷新周期。这使信息对用户保持准确和最新。

我应该何时使用缓存失效 API?

当数据一致性无法等待缓存的标准过期或重新验证时,缓存失效 API 非常重要。关键用例包括

  • **内容更新**:当发生关键更改时,例如已发布文章的编辑、产品更新或个人资料修改,这些更改需要立即显示。
  • **库存管理**:在实时应用程序中,例如库存或预订系统,其中库存水平、可用性或预订状态必须反映最新信息。
  • **高优先级数据**:对于时间敏感的数据,例如突发新闻或紧急通知,用户必须立即看到最新信息。

在这些场景中使用按需缓存失效有助于仅刷新必要的数据,从而保持系统性能,同时确保用户获得准确、最新的信息。