跳转到内容
搜索文档

Hyperdrive 工作原理

最后更新 查看 MarkdownAgent 设置

从 Cloudflare 全球网络(包含 300 多个数据中心)连接传统集中式数据库时,查询可能从任意位置发起,这会带来一些挑战。

若数据库集中部署,查询往返数据库可能需要较长时间。在 Workers 等无状态环境中,每次调用都需建立新连接,情况会更糟,每个 Worker 调用都需要多次往返。

传统数据库通常有最大连接数限制。在分布式流量较大时,很容易耗尽这些连接。

Hyperdrive 通过管理到源数据库的全局连接数、有选择地解析并决定缓存哪些查询响应,同时减轻数据库负载并加速查询,从而解决上述问题。

Hyperdrive 如何实现全球数据库加速

Hyperdrive 通过以下方式加速数据库查询:

  • 在 Worker 附近完成新数据库连接的建立
  • 在数据库附近池化现有连接
  • 缓存查询结果

这确保从 Workers 连接数据库时(无论查询是否命中缓存)都能获得最佳性能。

Hyperdrive 连接

1. 边缘连接建立

当数据库驱动从 Cloudflare Worker 直接连接数据库时,首先会经历连接建立过程。这可能需要多次往返数据库以验证并建立安全连接。由于 Worker 与数据库之间的地理距离,可能产生额外网络延迟。

使用 Hyperdrive 时,连接建立发生在 Worker 与 Hyperdrive 之间的边缘,尽可能靠近 Worker(见示意图,标签 1. Connection setup)。由于连接建立在同一位置完成,延迟显著降低。

了解更多 Workers 与 Hyperdrive 之间的连接机制,请参阅连接生命周期

2. 连接池

Hyperdrive 创建可复用的数据库连接池,供应用执行查询时使用。

连接池部署在靠近源数据库的一个或多个区域,以最小化 Workers 与数据库之间建立新连接的往返延迟,并确保未缓存查询的网络延迟尽可能低。

若连接池已有连接,将尝试复用(见示意图,标签 _2. Existing warm connection)。 若没有可用连接,将建立新连接并用于路由查询,目标是尽可能少地创建和复用连接以满足应用需求。

了解更多连接池行为与配置,请参阅连接池

3. 查询缓存

Hyperdrive 支持缓存发往数据库的非变更(读)查询。

查询经 Hyperdrive 发送时,Hyperdrive 会解析查询并判断是变更(写)还是非变更(读)查询。

对于非变更查询,Hyperdrive 会按配置的 max_age 缓存响应。当 Worker 稍后发送与原始查询匹配的查询时,Hyperdrive 返回缓存响应,而非将查询发回源数据库。

缓存可减轻源数据库负担并加速查询响应。

当应用写入数据库时,Hyperdrive 不会使已缓存的读查询结果失效。若应用需要写后读一致性,请参阅查询缓存,了解如何为必须返回最新数据的读操作使用单独的禁用缓存 Hyperdrive 配置。

了解更多查询缓存行为与配置,请参阅查询缓存

池化模式

Hyperdrive 连接池以事务模式运行:执行查询的客户端在事务期间通过单一连接通信。事务完成后,连接归还池中。

Hyperdrive 在事务或查询期间支持 SET 语句。例如,若手动用 BEGIN/COMMIT 创建事务,SET 语句在事务内生效。包含 SET 的查询(SET X; SELECT foo FROM bar;)也会应用该 SET。连接归还池时会执行 RESET,后续查询不会受先前 SET 影响。

这意味着单个 Worker 调用可能获取多个连接以执行数据库操作,且可能需要在每次查询或事务中 SET 配置。不建议用单一事务包装多个数据库操作以维持 SET 状态,否则会损害 Hyperdrive 的性能与扩展性,因为事务期间连接无法被其他 Worker isolate 复用。

Hyperdrive 支持 postgres.jsnode-postgres 驱动实现的命名 prepared statement。其他驱动的命名 prepared statement 可能性能较差或不受支持。

相关资源

这篇文档对您有帮助吗?