订阅以接收新文章的通知:

Durable Objects — 现已正式发布

2021-11-15

4 分钟阅读时间
这篇博文也有 EnglishDeutsch日本語Français版本。

Full Stack Week 旨在介绍开发人员如何拥抱 Cloudflare 网络的力量,打造默认全球性的完整应用。Workers 的承诺不仅仅是改善了延迟——而是从根本上改变了编程范式,使开发人员更轻松,应用程序更有韧性。

去年 我们发布了 Durable Objects — 用于对在 Cloudflare 边缘上运行的 Workers 的状态进行协调。通过 Durable Objects,仅需几行代码,开发人员就能实施过去比较复杂的应用程序,例如协作白板、游戏服务器或全球队列。

今天,我们宣布 Durable Objects 已普遍可用,并可用于生产环境。

为何 Durable Objects 如此强大?

对很多传统应用程序而言,状态协调都是通过数据库进行的。基于Workers 构建的应用程序对数据库提出了一些独特的挑战——即需要处理原生的全球规模和大量并发,这可能会导致在协调共享键时发生频繁的事务回滚。数据库本身很难配置和扩展,特别是在全球规模上,因此开发人员需要针对 Workers 的访问模式专门调整数据库。

Durable Objects 提供一个更简单的范式:编写一个 JavaScript 类,您的应用程序可以创建该类的命名实例——确保在 Cloudflare 的整个网络中是唯一的。该实例是一个 Durable Object ——Workers (及其他Durable Object!) 可以通过它的 ID 向它发送消息。Durable Object 以单线程方式按顺序处理消息,允许在消息之间进行协调。我们还提供了一个强一致的存储 API,可存储对象需持久化的键值对。

以在线文档编辑器为例。典型架构会将文档的状态保存在一个数据库中,并让用户将更改持久化到数据库中。这导致协作变得困难——多个用户如何确保他们都能看到对文档更改的最新副本?

通过使用 Durable Objects,这个问题变得简单了很多。通过编写一个 Document 类,可以将每个文档的状态存储在内存中的持久对象中。在用户连接时,他们会看到文档的最新副本——并能与其他用户同步进行更改。当用户离开文档时,Durable Object 将离开内存并停止产生更改,同时其状态将持久保存。即使不需要配置网络,不需要管理数据库,也不需要实施自动扩展策略——也能正常工作。

虽然个别对象是单线程的,但 Durable Objects 的设计意味着对象集合可以有效地无限扩展。对象的生命周期是托管的,意味着不需要运行清理任务或缩减系统——Durable Objects 可以即时扩展到每秒数十万个请求,然后再缩减,无需开发人员交互。

发布提前体验以来,我们做了什么?

首先,我们一直致力于提高可靠性和性能。Durable Objects 支持 Cloudflare 正在开发的多个产品,包括 R2 存储Cloudflare 等候室

具体来说,等候室使用 Durable Objects 就试图访问特定站点的当前用户数量提供一个强一致性视图。将这种频繁更新的状态存储在传统数据库中将难以扩展,在全球规模上内运行则要困难得多。

我们的客户也拥抱了 Durable Objects。我们已经看到一家大型游戏公司在 Durable Objects 对象上构建了他们新的后端架构——协调个人游戏状态和多人游戏大厅。Durable Object 具有无需管理服务器或数据库而动态扩展的能力,使其成为他们的一个简单选择,让他们凭借一个相对较小的团队来开发自己的游戏。

客户已经构建了更多的应用——从状态页面监视器到协作白板应用程序。我们已经看到了在 WebSockets 中使用 Durable Objects 来创建完全响应式应用的特别兴趣,并且已经发布了一个参考架构来帮助客户进一步发展。

我们在运行系统方面也做得更好了,尤其是在响应大量请求的情况下。Durable Objects 现在可以在对象之间处理每秒数十万个请求,在单一对象上每秒处理数百个请求,这使得它们甚至能满足最苛刻的客户的生产要求。

我们已经发布了 Jurisdictional Restrictions(司法管辖区限制) ,让开发人员能为 Durable Object 添加区域标记,确保它在该区域中处理和存储数据,从而使 Durable Object 的扩展变得简单。

我们在 Durable Object 存储请求前添加了一个缓存,使读写操作迅如闪电,也使编写正确的并发代码更加容易。

除此之外,我们还做了一些较小的改进,包括:简化新 Durable Objects 类的上传,仪表板 UI,以及支持 `wrangler dev` 和 `wrangler tail` 进行实时调试。

Durable Objects 下一步发展是什么?

我们继续致力于使 Durable Objects 成为构建无限扩展应用的最简单平台。

现在,在对象可被分区时,Durable Objects 能很好地扩展,但个别对象被限制于单一执行线程。很多工作负载可在多个线程中扩展,提供对某个对象的状态的只读访问,并仅在状态发生变化时进行同步。我们将此称为 Durable Objects 的复制。我们正在开发这个功能。

我们也在为添加一个 API 来获得对某个 Durable Object 的保证回调,让开发人员在未来指定的时间唤醒一个 Durable Object 来运行一个函数。这简化了生命周期管理,使得在 Durable Object 上构建可靠队列等基元变得容易。

我们还在研究如何更好地在地理上分布对象,包括我们在最初宣布时谈到的对象自动迁移愿景。

如果您有任何功能希望我们添加,欢迎给我们写邮件扫码关注微信公众号进一步交流。

我们如何使用 Durable Objects?

在 Cloudflare 仪表板中启用 Durable Objects 并选择定价,然后在这里查看我们的示例聊天应用参考架构

祝您构建之旅愉快!

我们保护整个企业网络,帮助客户高效构建互联网规模的应用程序,加速任何网站或互联网应用程序抵御 DDoS 攻击,防止黑客入侵,并能协助您实现 Zero Trust 的过程

从任何设备访问 1.1.1.1,以开始使用我们的免费应用程序,帮助您更快、更安全地访问互联网。要进一步了解我们帮助构建更美好互联网的使命,请从这里开始。如果您正在寻找新的职业方向,请查看我们的空缺职位
Full Stack WeekDurable Objects

在 X 上关注

Greg McKeon|@wegmckeon
Cloudflare|@cloudflare

相关帖子

2024年10月24日 13:05

Build durable applications on Cloudflare Workers: you write the Workflows, we take care of the rest

Cloudflare Workflows is now in open beta! Workflows allows you to build reliable, repeatable, long-lived multi-step applications that can automatically retry, persist state, and scale out. Read on to learn how Workflows works, how we built it on top of Durable Objects, and how you can deploy your first Workflows application....

2024年10月24日 13:00

Durable Objects aren't just durable, they're fast: a 10x speedup for Cloudflare Queues

Learn how we built Cloudflare Queues using our own Developer Platform and how it evolved to a geographically-distributed, horizontally-scalable architecture built on Durable Objects. Our new architecture supports over 10x more throughput and over 3x lower latency compared to the previous version....

2024年9月27日 13:00

Our container platform is in production. It has GPUs. Here’s an early look

We’ve been working on something new — a platform for running containers across Cloudflare’s network. We already use it in production, for AI inference and more. Today we want to share an early look at how it’s built, why we built it, and how we use it ourselves. ...