2025 年 2 月 5 日

Cloudflare、Unikernel 与裸金属:Prisma Postgres 查询的生命周期

Prisma Postgres 是市场上最具创新性的 PostgreSQL 数据库。在本文中,我们将深入探讨其技术栈,该技术栈可实现闪电般的查询速度、全局缓存、连接池等功能。

Cloudflare, Unikernels & Bare Metal: Life of a Prisma Postgres Query

回顾:什么是 Prisma Postgres?

如果您还没听说:Prisma Postgres 是第一个基于 unikernel 构建的数据库。如果您错过了,这里有一个快速的 100 秒总结

基于下一代基础设施构建

Prisma Postgres 不仅仅是另一个 AWS 封装!它的架构经过精心设计,遵循第一性原理,并建立在下一代基础设施上,例如 unikernelsUnikraft CloudCloudflare Workers

这些技术的结合提供了独特的优势和强大的功能集。

无冷启动、全局缓存、连接池等

以下是开发人员在使用 Prisma Postgres 作为其无服务器数据库时获得的好处

  • 零冷启动:即时访问您的数据库,无需延迟。
  • 慷慨的免费套餐:每月 10 万次操作,1GiB 存储空间和 10 个数据库。
  • 全局缓存层:查询响应可在边缘轻松缓存。
  • 内置连接池:扩展您的应用程序,无需担心 TCP 连接。
  • 性能提示:AI 驱动的建议,可加快您的查询速度。
  • 简单的按量付费定价:根据操作和存储的可预测成本。

尝试Prisma Postgres

Prisma Postgres 查询的生命周期

回顾完简短的摘要,让我们深入了解 Prisma Postgres 用于实现这些优势的技术栈。剧透:以下是 Prisma Postgres 查询生命周期中涉及的所有组件的完整概述

Future architecture diagram of Prisma Postgres

在接下来的部分中,我们将仔细研究每个阶段,并解释其内部发生了什么。

阶段 1:一切始于 Prisma ORM

Prisma ORM 是 Prisma Postgres 查询自然开始的地方。

使用 Prisma Postgres 时,应用程序服务器上无需查询引擎

如果您过去使用过 Prisma ORM,您可能知道它使用一个用 Rust 实现的 查询引擎,它作为二进制文件在您的应用程序服务器上运行。

请注意,虽然我们在此上下文中仍将查询引擎称为用 Rust 编写,但它目前正在用 TypeScript 重写。在此处了解更多信息 here

查询引擎的核心职责是

  • 根据高级 ORM 查询(用 JS/TS 编写)生成高效的 SQL 查询
  • 管理数据库连接池

然而,将 Prisma ORM 与 Prisma Postgres 结合使用的妙处在于,您不需要在应用程序服务器上运行查询引擎。相反,您将使用一个超轻量级的 Prisma ORM 版本,不带 查询引擎。生成 SQL 查询和管理 TCP 连接的繁重工作被推到堆栈的更深处,进入位于 Prisma Postgres 之上的连接池中。

这种在 Prisma Postgres 基础设施上托管连接池的方法具有重大优势:让应用程序开发人员摆脱连接池的管理,使他们能够专注于自己的数据需求和查询。这在无服务器和边缘函数等短生命周期环境中特别有用,在这些环境中,反复重新创建连接池会导致主要的性能开销。

使用缓存策略定义 Prisma ORM 查询

让我们使用以下 Prisma ORM 查询来撰写本文

此查询从数据库中获取所有已发布的帖子,并额外指定了两个与 Prisma Postgres 缓存相关的参数

  • 生存时间 (ttl):确定缓存数据被视为 新鲜 的时长。当您设置 TTL 值时,Prisma Postgres 将在该持续时间内提供缓存数据,而无需查询数据库。
  • 陈旧时重新验证 (swr):允许 Prisma Postgres 提供 陈旧 缓存数据,同时在后台获取新鲜数据。当您设置 SWR 值时,Prisma Postgres 将在该持续时间内继续提供缓存数据,即使它已经超过 TTL,同时通过数据库中的新数据更新缓存。

在此示例中,数据将被视为新鲜 30 秒 (TTL)。之后,在接下来的 60 秒 (SWR) 内,Prisma Postgres 的缓存将提供陈旧数据,同时在后台获取新鲜数据。

Prisma Postgres 从靠近您应用程序的边缘位置提供缓存数据。如果您的应用程序部署到多个位置,此全局缓存可以显著提高您的应用程序性能!

通过 HTTP 执行查询

那么,当上述查询在应用程序中执行时,接下来会发生什么?由于查询引擎已被推入堆栈下方,因此在此阶段发生的所有事情都是向 Prisma Postgres 基础设施的第一个身份验证和路由层发送 HTTP 请求。此 HTTP 请求携带查询的轻量级、基于 JSON 的表示。它看起来像这样

请注意,selection 参数指定应从数据库中获取的字段。由于我们没有在查询中使用 selectinclude 选项,因此其值简单地为 "$scalars": true,这意味着将从数据库返回目标模型的所有标量字段。

请求的下一步将由 Prisma Postgres 的身份验证和缓存层进行评估。

阶段 2:验证请求

在查询结果命中缓存以检查是否可以从那里提供之前,需要对查询进行身份验证。Prisma Postgres URL 始终包含一个 apiKey 参数,该参数编码用户凭据

身份验证层是使用 Cloudflare Workers 实现的,因此与查询的来源物理距离很近。它使用 apiKey 值来识别用户、验证访问权限并将请求路由到下一阶段。

阶段 3:缓存还是不缓存

身份验证后,HTTP 请求将命中 Prisma Postgres 基础设施的下一层,该层也通过 Cloudflare Workers 实现

Blog image

此路由层的主要目的是确定是否需要激活 Prisma Postgres 缓存

  • 如果查询设置了 swr 和/或 ttl 选项,则查询将进入 Prisma Postgres 缓存路径。
  • 如果查询没有这些缓存选项,它将直接进入下一阶段。

那么,让我们调查通过 Prisma Postgres 缓存层的路径。

Prisma Postgres 缓存基于 Cloudflare Workers 构建,利用了官方的 Cloudflare Cache API

它使用基于 整个 Prisma ORM 查询(包括查询参数的值,例如上述情况下的 published: true)计算出的哈希作为缓存键。这种方法倾向于缓存未命中,并且仅当 100% 确定此精确查询已发送到数据库且其结果之前已缓存时才从缓存返回数据。

您可以在 Prisma Postgres 仪表板中查看您的缓存行为统计信息

Blog image

现在假设我们之前的查询继续在 Prisma Postgres 堆栈中向下传输,并且没有由缓存提供服务。接下来会发生什么?

阶段 4:命中连接池

如果查询结果尚未缓存,则之前的 HTTP 请求将被转发到下一站:Prisma Postgres 的连接池(部署在与数据库实例物理距离很近的虚拟机上)。

在我们最近的文章中了解有关连接池重要性的更多信息:使用连接池拯救黑色星期五

请注意,这实际上是请求第一次(也是唯一一次)可能传输较长距离,因为它现在离开了 Cloudflare 区域 的区域边界。

这些虚拟机托管了从应用程序服务器移出的查询引擎(如阶段 1 中所述)。因此,在此阶段,Prisma Postgres 的连接池不仅找到一个空闲连接来实际执行查询,它还生成将发送到 Prisma Postgres 的 SQL 语句。这现在通过到数据库的良好旧 TCP 连接完成。

阶段 5:进入 unikernel 数据库

Prisma Postgres 基于 unikernels(可以理解为:“超专业化操作系统”)运行,作为超轻量级微虚拟机运行在我们自己的裸金属服务器上。

查看抢先体验公告,了解该架构的详细信息,我们与 Unikraft 的合作,以及实现 Prisma Postgres 性能优势的毫秒级云堆栈。

以下是 Unikraft Cloud 核心组件 的概述,这些组件实现了 Prisma Postgres 实例闪电般的启动时间

Blog image

这些组件协同工作的方式如下

  • 自定义控制器和代理:一个自定义平台控制器,提供一流的、响应式的、毫秒级语义和可扩展性。为了加速网络处理,Unikraft Cloud 将此控制器与自定义代理结合使用,该代理负责负载平衡,并且能够非常快速地响应传入请求。此代理是 Prisma Postgres 与连接池之间的 TCP 连接的管理位置。
  • 基于 Firecracker 和 unikernels 的快速虚拟机管理器 (VMM):Unikraft Cloud 的 unikernels 使用仅包含 Prisma Postgres 的精简镜像——别无他物。结合修改版的 Firecracker VMM,这些 Prisma Postgres 镜像启动速度极快。
  • 快照:Unikraft Cloud 在将 Prisma Postgres 实例缩减到零之前,会对其进行内存快照。当唤醒它们时,它们会从快照恢复,这意味着虚拟机已经“温暖”,甚至包括已经激活的 TCP 连接!

得益于这种高效的堆栈,数据库实例仅在您实际使用时才会产生费用。这使我们能够提供慷慨的免费套餐,您可以根据需要启动任意数量的免费 Prisma Postgres 实例(与其他提供商不同,在其他提供商中,如果您创建多个数据库实例,通常需要支付固定的月费)。

回到我们的查询:在查询的初始 JSON 表示转换为高效的 SQL 语句后,查询最终通过 TCP 到达数据库层。PostgreSQL 实例使用 Unikraft 的毫秒级云堆栈部署在我们自己的裸金属服务器上,与连接池物理距离很近。

这里的第一站是 Unikraft 代理,它负责维护与连接池的 TCP 连接。

代理现在与 Unikraft 控制器通信,该控制器负责管理 实际的 Prisma Postgres 实例。此时,有两种可能的状态

  • 或者 目标 Prisma Postgres 实例已经启动并运行;在这种情况下,代理将继续将查询直接转发给它。
  • 或者 Prisma Postgres 实例当前处于“暂停”状态;在这种情况下,代理将联系 Unikraft 控制器,该控制器负责识别目标 Prisma Postgres 实例,“唤醒”它并告知代理当前实例状态。

不要被这里的“暂停”和“唤醒”术语混淆。由于超快速的 VM 快照(发生在 内存中)和 unikernels 的轻量级,每个实例都可以在几毫秒内再次唤醒(这是 Prisma Postgres 实例不会遭受冷启动之苦的秘密)。

Prisma Postgres 架构的下一步是什么?

虽然我们已经对当前的技术栈及其为开发人员带来的好处感到非常兴奋,但我们不会止步于此!

我们认为在 Prisma Postgres 的未来迭代中可能存在一些额外的优化,最值得注意的是:我们将把连接池移动到运行 Prisma Postgres 实例的 同一台机器上

Prisma Postgres components

TCP 连接是整个堆栈中最昂贵的部分,因为每次建立连接时都需要进行三次握手。通过将此 TCP 连接减少为在同一台机器上的两个进程之间发生的仅仅是本地连接,连接池和数据库实例之间的物理距离造成的延迟将变得完全可以忽略不计。

这是 Prisma Postgres 相较于其他基于 AWS(或其他云提供商)基础设施的提供商的核心优势:在使用云提供商时,无法保证连接池和数据库实例在同一主机上运行,但总是会有网络跳跃。

结论

在本文中,我们深入探讨了 Prisma Postgres 及其所构建的下一代技术栈。

如果您已经在使用 Prisma ORM,请通过 从现有数据库导入数据 来尝试 Prisma Postgres。否则,请通过在终端中运行此命令从头开始尝试 Prisma Postgres

不要错过下一篇文章!

订阅 Prisma 新闻通讯

© . This site is unofficial and not affiliated with Prisma Data, Inc.