常见问题解答
何时应为 Prisma Accelerate 启用静态 IP?
当您的安全设置需要 IP 允许列表或您正在实施仅允许来自受信任 IP 的防火墙时,请为 Accelerate 启用静态 IP,以确保受控且安全的数据库连接。
在 平台控制台中如何为 Accelerate 启用静态 IP 中了解更多信息。
什么是静态 IP?
静态 IP 地址是固定的 IPv4 或 IPv6 地址。与可能会不可预测地更改的动态 IP 地址不同,来自静态 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。
- 在 VS Code 中,打开命令面板。当您按 F1 或选择 查看 > 命令面板 时,可以执行此操作。
- 输入
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 非常重要。关键用例包括
- **内容更新**:当发生关键更改时,例如已发布文章的编辑、产品更新或个人资料修改,这些更改需要立即显示。
- **库存管理**:在实时应用程序中,例如库存或预订系统,其中库存水平、可用性或预订状态必须反映最新信息。
- **高优先级数据**:对于时间敏感的数据,例如突发新闻或紧急通知,用户必须立即看到最新信息。
在这些场景中使用按需缓存失效有助于仅刷新必要的数据,从而保持系统性能,同时确保用户获得准确、最新的信息。