跳转到内容
搜索文档

什么是 Durable Objects?

最后更新 查看 MarkdownAgent 设置

Durable Object 是一种特殊的 Cloudflare Worker,它将计算与存储独特地结合在一起。与 Worker 一样,Durable Object 会在首次请求时自动部署到地理上最接近的位置,在需要时快速启动,并在空闲时关闭。你可以在世界各地拥有数百万个 Durable Object。然而,与常规 Worker 不同:

  • 每个 Durable Object 都有一个全局唯一名称,允许你从世界任何地方向特定对象发送请求。因此,Durable Object 可用于协调需要协同工作的多个客户端。
  • 每个 Durable Object 都附带有持久化存储。由于此存储与对象共存,因此具有强一致性且访问速度快。

因此,Durable Objects 使有状态的无服务器应用成为可能。

Durable Objects 亮点

Durable Objects 的特性使其非常适合构建分布式有状态、可扩展的应用。

无服务器计算,零基础设施管理

  • Durable Objects 构建于 Workers 运行时之上,因此支持完全相同的代码(JavaScript 和 WASM),以及类似的内存和 CPU 限制。
  • 每个 Durable Object 会在首次访问时隐式创建。用户应用无需关心其生命周期、创建或销毁。Durable Objects 会在健康的服务器之间迁移,因此应用永远不必管理它们。
  • 每个 Durable Object 在处理请求期间保持活跃,并在空闲数秒后才进入休眠,使应用能够利用内存缓存处理大量连续请求并提升性能。

存储与计算同位

单线程并发

在 Cloudflare 全球网络上弹性水平扩展

  • Durable Objects 可分布在全球各地,您还可以选择性地影响每个实例的位置。Durable Objects 尚未在每个 Cloudflare 数据中心可用;请参阅 where.durableobjects.live 项目了解实时位置。
  • 每种 Durable Object 类型(Cloudflare 术语中的「Namespace 绑定」)对应一个实现实际逻辑的 JavaScript 类。每个 namespace 可创建的 Durable Objects 数量没有硬性限制。
  • 随着应用创建数百万对象,Durable Objects 会弹性扩展。应用无需管理基础设施或提前规划容量。

Durable Objects 功能

内存状态

每个 Durable Object 都有独立的内存状态。应用可以利用内存状态优化性能,将重要信息保留在内存中,从而完全避免访问持久存储。

内存状态的典型用例包括:在持久化到存储之前批量聚合信息,或立即拒绝/处理满足特定条件的传入请求等。

当 Durable Object 空闲一段时间后进入休眠时,内存状态会被重置。因此,如果 Durable Object 在后续收到请求时需要该数据,务必将其持久化到 durable storage。

Storage API

Durable Object Storage API 使 Durable Objects 能够访问快速、事务性、强一致的存储。Durable Object 的附加存储对其唯一实例私有,其他对象无法访问。

Storage API 有两种形式:键值(KV)APISQL API

使用新的 SQLite Durable Objects 存储后端时,您可以同时使用这两种 API。但如果使用旧版存储后端,则只能访问键值 API。

Alarms API

Durable Objects 提供 Alarms API,允许您安排 Durable Object 在未来某个时间被唤醒。当您希望定期或在特定时间点执行某些工作,而无需自行管理作业调度运行器等基础设施时,这非常有用。

您可以将 Alarms 与内存状态和 durable storage API 结合,构建队列、工作流或高级数据管道等批处理和聚合应用。

WebSockets

WebSocket 是长连接 TCP 连接,支持客户端与服务器之间的双向实时通信。由于 WebSocket 会话是长连接的,应用通常使用 Durable Objects 接受客户端或服务器连接。

由于 Durable Objects 在 Cloudflare Workers 之间提供单点协调,单个 Durable Object 实例可与 WebSocket 并行使用,以协调多个客户端,例如聊天室参与者或多人游戏玩家。

Durable Objects 支持 WebSocket 标准 API,以及 WebSockets 休眠 API,后者扩展了 Web 标准 WebSocket API,在不活跃期间不计费以降低成本。

RPC

Durable Objects 支持 Workers 远程过程调用(RPC),使应用能够使用 JavaScript 原生方法和对象在 Workers 与 Durable Objects 之间通信。

使用 RPC 进行通信使应用开发更简单、更易于理解,也更高效。

Actor 编程模型

描述和理解 Durable Objects 的另一种方式是通过 Actor 编程模型的视角。Actor 模型在编程语言层面有多种流行实现,通过运行时或库框架支持,例如 ErlangElixirAkkaMicrosoft Orleans for .NET

Actor 模型通过抽象 Actor 之间的通信(使用可在任何传输协议之上实现的 RPC 调用或消息发送)简化了分布式系统中的许多问题,并避免了通过共享内存进行并发时的大多数并发陷阱,例如多个进程/线程访问同一内存数据时的竞态条件。

每个 Durable Object 实例可视为一个 Actor 实例,接收消息(传入的 HTTP/RPC 请求),在其单线程上下文中使用附加的 durable storage 或内存状态执行逻辑,最后向外部发送消息(传出的 HTTP/RPC 请求或响应),甚至发送给另一个 Durable Object 实例。

每个 Durable Object 在可执行的工作量方面有一定能力,这应影响应用的架构以充分利用平台

Durable Objects 原生集成到 Cloudflare 基础设施中,为您提供终极无服务器平台,以构建利用 Cloudflare 整个网络的分布式有状态应用。

Cloudflare 中的 Durable Objects

Cloudflare 的许多产品都使用 Durable Objects。我们的一些技术博客文章展示了 Durable Objects 使应用构建更简单、更轻松的实际应用和用例。

这些博客文章也可作为灵感,了解如何使用 Durable Objects 架构可扩展应用,以及如何将其与 Cloudflare Developer Platform 的其余部分集成。

最后,以下博客文章可帮助您了解 Durable Objects 的一些技术实现细节及其工作原理。

快速入门

请按照「快速入门」指南创建您的第一个使用 Durable Objects 的应用。

Footnotes

  1. 使用 SQLite 的每个 Durable Object 存储目前为 1 GB。正式发布后将提升至 10 GB。

这篇文档对您有帮助吗?