00:00:00(欢快的音乐)
00:00:01Cloudflare 最近发布了 Dynamic Workers,
00:00:04这是一种更底层的 Worker 原语,
00:00:06可以由现有的 Worker 以编程方式创建。
00:00:09它们的速度比传统的容器快 100 倍,内存效率更高,
00:00:12因为它们运行在 V8 隔离槽 (Isolates) 上。
00:00:16由于它们的成本非常低,
00:00:18你可以根据需要随时生成,
00:00:20用于运行 AI 生成的代码、开发预览、
00:00:23自定义自动化任务等等。
00:00:25官方甚至表示,如果你愿意,
00:00:29每秒可以运行 100 万个 Dynamic Workers。
00:00:31但是,只能运行 JavaScript 这点
00:00:33会限制它们的使用吗?
00:00:36点个订阅,让我们一探究竟。
00:00:37(欢快的音乐)
00:00:40去年,我做过一段关于 Cloudflare Sandboxes 的视频,
00:00:44它们基本上是运行在 Durable Object 上的
00:00:47短寿命 Linux 容器。
00:00:49如果听起来一头雾水,
00:00:50可以去看看那段视频。
00:00:52但如果你需要一个完整的操作系统容器,
00:00:55拥有文件系统并能运行几乎任何语言
00:00:59和二进制文件,它们就是完美的。
00:01:01但如果你想要更快的东西,
00:01:03实际上是快得多,而且更轻量,
00:01:06能够运行无限的并发沙箱,
00:01:09且限制与常规 Worker 相同,
00:01:12那么你可能需要用到 Dynamic Worker。
00:01:15让我们来看看如何设置。
00:01:16这里是我刚用 Wrangler 创建的一个基础 Worker,
00:01:19里面满是 TypeScript 错误,
00:01:21也许是因为我忘了运行 Wrangler types。
00:01:23但在我们的 Wrangler 配置文件中,
00:01:26我添加了这个 worker loaders 数组,
00:01:28带有一个名为 loader 的绑定。
00:01:30虽然你可以给它起任何名字,
00:01:32但我选择了 loader,因为这更符合惯例。
00:01:34这个绑定允许我们创建
00:01:37并控制其他的 Worker。
00:01:38在更新后的代码中,我们定义了一个新的 worker 常量,
00:01:42它使用这些值通过 loader 绑定进行创建。
00:01:45你可以把这想象成嵌套 Worker 的
00:01:49Wrangler 配置文件,
00:01:50这里的 compatibility date 告诉 Worker
00:01:53它应该使用的运行时版本。
00:01:55这是它将要运行的代码。
00:01:57如你所见,代码与普通的 Worker 非常相似。
00:01:59它也有一个 fetch 函数,
00:02:00接收 request、env 和 context 参数。
00:02:05它在这里所做的只是
00:02:06从沙箱中返回 "Hello World"。
00:02:08然后我们阻止了所有的网络访问,
00:02:10使用初始 Worker 的 request 参数运行 fetch 函数,
00:02:13并返回结果。
00:02:16如果我们本地运行 Worker 并 curl localhost,
00:02:19应该能看到 "Hello from the sandbox"。
00:02:21但如果再次运行同样的 curl 请求,
00:02:24就会报错。
00:02:24这是因为目前
00:02:26我们每次都在加载一个全新的 Worker。
00:02:28不过我们可以改为获取现有的 Worker,
00:02:31给它起名为 worker 1,
00:02:33然后以异步函数的形式运行代码。
00:02:35这意味着现在运行 curl 时,会得到 "Hello from the sandbox"。
00:02:38如果再次运行,它会从
00:02:41现有的 worker 1 沙箱中获取信息。
00:02:43我刚才展示的
00:02:45当然是一个非常简单的例子,
00:02:47但你可以用 Dynamic Workers 做一些很酷的事情,
00:02:50比如定义自定义绑定,
00:02:52像这个 chatroom post 方法来创建一个桩 (stub),
00:02:55Worker 使用 Cap'n Proto over Web 进行通信,
00:02:57没错,我们也做过相关的视频,
00:02:59感兴趣的话可以去看看。
00:03:00你可以使用 Hono 之类的 NPM 依赖,
00:03:03并使用 create worker 函数将它们打包。
00:03:05你甚至可以拦截出站请求,
00:03:08来完成诸如注入凭据之类的操作。
00:03:10使用 Dynamic Workers 的一大重要原因,
00:03:13是运行由 AI 智能体生成的代码。
00:03:17让我们来试一下。
00:03:18这是来自 E2B cookbook 的代码,
00:03:21它使用 Anthropic SDK 来运行 Sonnet 3.5,
00:03:25配合这个系统提示词和一个自定义工具,
00:03:28在 Jupyter 笔记本中执行 Python 代码。
00:03:31它的工作原理是:当检测到
00:03:33使用了自定义工具时,
00:03:34就会在 E2B 沙箱中运行,
00:03:38我们可以在这里看到相关代码。
00:03:40它使用一个非常具体的提示词来运行,
00:03:42通过 1000 次迭代的蒙特卡罗方法
00:03:46来计算圆周率 Pi 的值。
00:03:47因为它有文件系统的访问权限,
00:03:50它可以创建这个 image.png,
00:03:52保存后供用户下载,
00:03:54或用于其他用途。
00:03:56遗憾的是,Dynamic Workers 没有
00:03:58文件系统的访问权,
00:04:00尽管它们可以使用这个 shell 库
00:04:02创建一个虚拟文件系统。
00:04:04但因为它们是通过 Worker 运行的,
00:04:06我们可以为其提供诸如 R2 存储桶的信息,
00:04:08这是 Cloudflare 版的 S3,
00:04:11图片可以保存在里面。
00:04:12让我们看一下代码,
00:04:14它与 E2B 的例子很相似,
00:04:16首先可以看到正在使用的系统提示词。
00:04:19还有自定义的 Python 执行工具,
00:04:22在这里它不使用 Jupyter 笔记本,
00:04:25但会生成可视化内容的 SVG。
00:04:28这里是 Worker 的代码,
00:04:30它除了运行 JavaScript,也能运行 Python。
00:04:33我们可以看到它正在使用 Sonnet 3.5。
00:04:35这是使用的提示词。
00:04:37这里是智能体代码在沙箱中执行的地方。
00:04:41沙箱的响应
00:04:43会返回到主 Worker,
00:04:45主 Worker 会从中提取 SVG 代码,
00:04:47然后将其保存到 R2。
00:04:49访问该 URL 时虽然需要一点时间,
00:04:51但它确实生成了包含
00:04:53来自 Claude 相关信息的页面。
00:04:55向下滚动,
00:04:56就能看到从 R2 加载的这个 SVG。
00:05:01它看起来与 E2B 的那个非常不同,
00:05:03但我相信 Claude Sonnet
00:05:04生成了正确的信息。
00:05:06当然,我提到过
00:05:09以编程方式生成任意数量的 Dynamic Workers 也是可能的,
00:05:13你可以使用这样的代码来实现。
00:05:16这是一个根据 API 返回值
00:05:19创建全新 Worker 的 for 循环。
00:05:21它还会检查 Worker 是否已存在,
00:05:23如果存在则重用。
00:05:25它运行的代码基本上就是 console.log
00:05:27以及来自 Worker 的响应,
00:05:29响应包含基于循环索引的
00:05:31特定 Worker ID。
00:05:32代码运行后,
00:05:34我可以瞬间生成 50 个
00:05:36全新的 Dynamic Workers,可以看到它们瞬间就创建好了。
00:05:40速度非常快。
00:05:41现在让我们尝试 10,000 个,
00:05:43但我不会在本地运行,
00:05:44因为我不想让我的机器爆掉。
00:05:46所以我把父 Worker 部署到了 Cloudflare,
00:05:49这样就能利用他们的基础设施。
00:05:50现在我要生成 10,000 个不同的 Worker。
00:05:53按下回车,它们全部以惊人的速度创建完成。
00:05:56我们可以看到这里每页显示 30 个,
00:05:59我可以翻页查看所有不同的 Worker ID。
00:06:03事实上,翻得越远,显示的页数就越多。
00:06:05我可以与特定的 Worker 通信,
00:06:07比如 worker 1156,
00:06:09它会回复 "Hello from worker 1156"。
00:06:12以上就是 Dynamic Workers 的简要概述,
00:06:15Cloudflare 的 code mode 已经在使用它了,
00:06:18还有 Zite 用它来运行 LLM 生成的应用。
00:06:21但我应该提一下,虽然现在它们是免费的,
00:06:24但不会永远免费。
00:06:25所以,虽然每秒可以运行 100 万个 Dynamic Workers,
00:06:28除非你财力雄厚,
00:06:30否则你可能还是得克制一点。
00:06:32既然聊到了 Cloudflare,
00:06:34如果你想了解更多关于他们开源的 VIBE SDK,
00:06:38它可以让你构建像 v0 和 Lovable 这样的应用生成器,
00:06:42那就请看下一段视频。