跳转到内容
搜索文档

Durable Objects 的控制平面与数据平面架构模式

最后更新 查看 MarkdownAgent 设置

简介

Durable Objects 构建于 Cloudflare Workers 之上,跨越我们全球基础设施网络的多个位置。每个 Durable Object 实例都拥有跨请求持久化的持久存储、内存状态、单线程执行,并可放置在特定区域。

单个 Durable Object 实例具有一定的性能和存储能力。因此,为了在不受单个实例限制的情况下扩展应用程序,我们需要尽可能对应用程序数据进行分片,并利用 Cloudflare 基础设施将 Durable Object 实例分布到全球各地,使数据和计算尽可能靠近用户。

本文档描述了一种实用的架构模式,用于将应用程序的控制平面与数据平面分离,在不影响功能的前提下实现卓越的性能和可靠性。

  • 控制平面提供用于管理资源元数据的管理 API。例如,用户创建和删除 Wiki,或列出用户的所有 Wiki。
  • 数据平面提供应用程序的主要功能,直接处理对资源数据的操作。例如,获取和更新 Wiki 的内容,或更新协作文档的内容。数据平面故意设计得更简单,通常处理更大量的请求。
  • 管理平面是系统的可选组件,提供比控制平面更高级别的交互,以简化配置和操作。本文档不会重点介绍管理平面,因为其适用的原则与控制平面相同。

控制平面与数据平面分离模式

在此模式中,我们的应用程序由至少一个 Durable Object 实例(处理所有控制平面操作)加上根据数据平面操作需要创建的 Durable Object 实例(应用程序中每个已创建资源实例各一个)组成。

您可以扩展到数百万个 Durable Object 实例,为每个资源提供一个。

此架构模式的主要优势在于,数据平面操作(通常比控制平面操作具有更大的请求量)直接由持有资源数据的 Durable Object 实例处理,无需经过控制平面 Durable Object 实例。因此,应用程序的性能和可用性不受单个 Durable Object 实例的限制,而是在数千或数百万个 Durable Objects 之间共享。

以通用资源类型 XYZ 为例,XYZ 在实践中可以是 Wiki、协作文档、每个用户的数据库,或应用程序中的任何其他资源类型。

图 1:Durable Objects 的控制平面与数据平面架构模式
图 1:Durable Objects 的控制平面与数据平面架构模式
  1. 伦敦 (LHR) 的用户发起资源 XYZ 的创建请求。该请求被路由到最近的 Cloudflare 数据中心,并由处理应用程序 API 的 Workers 集群接收。
  2. Worker 代码将请求路由到管理 XYZ 类型资源的适当控制平面 Durable Object 实例。我们使用 idFromName 方法按名称(control-plane-xyz)引用 Durable Object 实例。这允许立即访问控制平面 Durable Object 实例,无需维护映射关系。
    • 控制平面 Durable Object 的位置将靠近首次访问它的请求,或靠近我们使用位置提示指定的显式区域。
  3. 控制平面 Durable Object 实例(control-plane-xyz)接收请求,并立即在用户请求位置附近(使用位置提示)创建另一个 Durable Object 实例(data-plane-xyz-03),使实际持有资源内容的 Durable Object 实例靠近创建它的用户。 - 我们在创建的 Durable Object 实例(data-plane-xyz-03)上调用自定义 init(...) 函数,传递开始处理用户请求所需的任何元数据信息。 Durable Object 实例将此信息存储在其本地存储中并执行任何必要的初始化。 如果后续对已创建资源的每个请求都包含处理该请求所需的所有信息(例如,请求 URL 包含所有路径和查询参数形式的信息),则可跳过此步骤。 - 我们使用 idFromName 方法引用 Durable Object(data-plane-xyz-03),这允许使用基于名称的资源标识符。 - 或者,我们可以使用 newUniqueId 方法引用 Durable Object,这将给我们一个随机资源标识符,而不是基于名称的标识符。此随机标识符需要传递回用户,以便他们在后续访问资源时提供。
  4. 控制平面 Durable Object 实例(control-plane-xyz)将生成的标识符(data-plane-xyz-03)存储到其本地存储,以便能够列出/删除所有已创建的资源,然后将其返回给 Worker。
  5. 用户收到资源创建成功的响应和对应的标识符,并(可选地)被重定向到资源本身。
  6. 用户向 API 发送针对上一步返回的资源标识符的写入请求,以更新资源内容。
  7. Worker 代码使用提供的资源标识符直接引用该资源的数据平面 Durable Object 实例(data-plane-xyz-03)。Durable Object 实例将通过将内容写入其本地持久存储来适当处理请求,并相应地返回响应。
  8. 波特兰 (PDX) 的另一个用户正在向之前创建的资源(data-plane-xyz-01)发送读取请求。
  9. Worker 代码直接引用持有给定资源标识符数据的 Durable Object 实例(data-plane-xyz-01),Durable Object 实例将通过读取其本地存储返回内容。

只要应用程序数据模型允许在资源级别进行分片,您就可以根据需要进行扩展,同时利用靠近访问该资源的用户的数据局部性优势。

同样的模式可以根据需要多次应用,以实现所需的性能。

例如,根据我们的负载,我们可以进一步将控制平面 Durable Object 分片为多个 Durable Objects。与其为所有 XYZ 类型的资源设置一个 Durable Object 实例,不如为每个区域设置一个。基于名称的方法引用 Durable Object 实例,可简化对适当实例的定向。

总之,只要您找到一种方法将应用程序的数据模型分片为细粒度的自包含资源,就可以为每个资源专门分配至少一个 Durable Object 实例并进行横向扩展。

相关资源

这篇文档对您有帮助吗?