跳转到内容
搜索文档

架构

最后更新 查看 MarkdownAgent 设置

Sandbox SDK 让你从 Workers 安全地执行不受信任的代码。它结合三项 Cloudflare 技术,提供安全、有状态且隔离的执行环境:

  • Workers - 调用 Sandbox SDK 的应用逻辑
  • Durable Objects - 具有唯一标识的持久 sandbox 实例
  • Containers - 实际运行代码的隔离 Linux 环境

架构概览

flowchart TB
    accTitle: Sandbox SDK Architecture
    accDescr: Three-layer architecture showing how Cloudflare Sandbox SDK combines Workers, Durable Objects, and Containers for secure code execution

    subgraph UserSpace["<b>Your Worker</b>"]
        Worker["Application code using the methods exposed by the Sandbox SDK"]
    end

    subgraph SDKSpace["<b>Sandbox SDK Implementation</b>"]
        DO["Sandbox Durable Object routes requests & maintains state"]
        Container["Isolated Ubuntu container executes untrusted code safely"]

        DO -->|HTTP API| Container
    end

    Worker -->|RPC call via the Durable Object stub returned by `getSandbox`| DO

    style UserSpace fill:#fff8f0,stroke:#f6821f,stroke-width:2px
    style SDKSpace fill:#f5f5f5,stroke:#666,stroke-width:2px,stroke-dasharray: 5 5
    style Worker fill:#ffe8d1,stroke:#f6821f,stroke-width:2px
    style DO fill:#dce9f7,stroke:#1d8cf8,stroke-width:2px
    style Container fill:#d4f4e2,stroke:#17b26a,stroke-width:2px

第 1 层:客户端 SDK

你在 Workers 中使用的面向开发者的 API:

import { getSandbox } from "@cloudflare/sandbox";

const sandbox = getSandbox(env.Sandbox, "my-sandbox");
const result = await sandbox.exec("python script.py");

用途:为所有 sandbox 操作提供简洁、类型安全的 TypeScript 接口。

第 2 层:Durable Object

管理 sandbox 生命周期与路由:

export class Sandbox extends DurableObject<Env> {
	// Extends Cloudflare Container for isolation
	// Routes requests between client and container
	// Manages preview URLs and state
}

用途:提供具有唯一标识的持久、有状态 sandbox 实例。

为何使用 Durable Objects:

  • 持久标识 - 相同 sandbox ID 始终路由到同一实例
  • 容器管理 - Durable Object 拥有并管理容器生命周期
  • 地理分布 - Sandbox 在靠近用户的位置运行
  • 自动扩展 - Cloudflare 管理预配

第 3 层:容器运行时

在隔离环境中执行代码,并具备完整 Linux 能力。

用途:安全执行不受信任的代码。

为何使用容器:

  • 基于 VM 的隔离 - 每个 sandbox 在自己的 VM 中运行
  • 完整环境 - Ubuntu Linux,包含 Python、Node.js、Git 等

通信传输

SDK 支持两种传输协议,用于 Durable Object 与容器之间的通信:

HTTP 传输(默认)

每个 SDK 方法都会向容器 API 发起单独的 HTTP 请求。简单可靠,适用于大多数用例。

// Default behavior - uses HTTP
const sandbox = getSandbox(env.Sandbox, "my-sandbox");
await sandbox.exec("python script.py");

WebSocket 传输

通过单个持久 WebSocket 连接复用所有 SDK 调用。在并发执行大量操作时,可避免 子请求限制。

通过在 Worker 配置中设置 SANDBOX_TRANSPORT 变量启用 WebSocket 传输:

{
	"vars": {
		"SANDBOX_TRANSPORT": "websocket"
	},
}
[vars]
SANDBOX_TRANSPORT = "websocket"

传输层对应用代码透明——无论使用哪种传输,所有 SDK 方法的工作方式都相同。有关何时使用各传输方式及配置示例,请参阅 传输模式。

请求流程

当你执行命令时:

await sandbox.exec("python script.py");

HTTP 传输流程:

  1. 客户端 SDK 验证参数并向 Durable Object 发送 HTTP 请求
  2. Durable Object 进行认证,并将 HTTP 请求转发到容器
  3. 容器运行时 验证输入、执行命令并捕获输出
  4. 响应 经各层返回,并完成适当的错误转换

WebSocket 传输流程:

  1. 客户端 SDK 验证参数,并通过持久 WebSocket 连接发送请求
  2. Durable Object 维护 WebSocket 连接,并复用并发请求
  3. 容器运行时 将 WebSocket 消息适配为 HTTP 风格的请求/响应
  4. 响应 经同一 WebSocket 连接返回,并完成适当的错误转换

WebSocket 连接在首次 SDK 调用时建立,并在后续所有操作中复用,从而降低高频操作的开销。

相关资源

这篇文档对您有帮助吗?