跳转到内容
搜索文档

传输模式

最后更新 查看 MarkdownAgent 设置

使用传输模式配置 Sandbox SDK 与容器的通信方式。

概览

Sandbox SDK 支持三种在 Durable Object 与容器之间通信的传输模式:

  • HTTP 传输(默认)- 每次 SDK 操作都会向容器发起单独的 HTTP 请求。
  • 新:RPC 传输 - 所有 SDK 操作通过单个持久 WebSocket 连接多路复用。未来将取代 HTTP 成为默认传输。自 0.9.1 起可用。
  • 已弃用:WebSocket 传输 - 所有 SDK 操作通过单个持久 WebSocket 多路复用。已被使用改进协议的 RPC 传输取代。

何时使用 RPC 传输

当 Worker 或 Durable Object 在每个请求中执行大量 SDK 操作时,请使用 RPC 传输。这可避免触及子请求限制

子请求限制

Cloudflare Workers 在向外部服务(包括容器 API 调用)发出请求时适用子请求限制:

  • Workers Free:每个请求 50 个子请求
  • Workers Paid:每个请求 1,000 个子请求

使用 HTTP 传输(默认)时,每次 SDK 操作(exec()readFile()writeFile() 等)都会消耗一个子请求。在单个请求中执行大量 sandbox 操作的应用可能触及这些限制。

RPC 传输如何提供帮助

RPC 传输与容器建立单个持久连接,并在其上多路复用所有 SDK 操作。WebSocket 升级计为 一个子请求,无论之后执行多少操作。

HTTP 传输示例(4 个子请求):

await sandbox.exec("python setup.py");
await sandbox.writeFile("/app/config.json", config);
await sandbox.exec("python process.py");
const result = await sandbox.readFile("/app/output.txt");

相同代码使用 RPC 传输(1 个子请求):

// Identical code - transport is configured via environment variable
await sandbox.exec("python setup.py");
await sandbox.writeFile("/app/config.json", config);
await sandbox.exec("python process.py");
const result = await sandbox.readFile("/app/output.txt");

RPC 传输还消除了 HTTP 传输存在的 32 MiB 限制。可将 ReadableStream 实例传递给 writeFile() 方法。

const req = await fetch("https://example.com/archive.tar.gz");
await sandbox.writeFile("/archive.tar.gz", req.body);

配置

在 Worker 配置中设置 SANDBOX_TRANSPORT 环境变量。SDK 从 Worker 环境绑定读取该变量(而非容器内部)。

HTTP 传输(默认)

HTTP 传输为默认模式,无需额外配置。

RPC 传输

通过将 SANDBOX_TRANSPORT 添加到 Worker 的 vars 来启用 RPC 传输:

{
	"name": "my-sandbox-worker",
	"main": "src/index.ts",
	// Set this to today's date
	"compatibility_date": "2026-08-17",
	"vars": {
		"SANDBOX_TRANSPORT": "rpc"
	},
	"containers": [
		{
			"class_name": "Sandbox",
			"image": "./Dockerfile",
		},
	],
	"durable_objects": {
		"bindings": [
			{
				"class_name": "Sandbox",
				"name": "Sandbox",
			},
		],
	},
}
name = "my-sandbox-worker"
main = "src/index.ts"
# Set this to today's date
compatibility_date = "2026-08-17"

[vars]
SANDBOX_TRANSPORT = "rpc"

[[containers]]
class_name = "Sandbox"
image = "./Dockerfile"

[[durable_objects.bindings]]
class_name = "Sandbox"
name = "Sandbox"

无需更改应用代码。SDK 会自动对所有操作使用已配置的传输。

传输行为

连接生命周期

HTTP 传输:

  • 每次 SDK 操作创建新的 HTTP 请求
  • 无持久连接
  • 每个请求独立且无状态

RPC 传输:

  • 在首次 SDK 操作时建立 WebSocket 连接
  • 为所有后续操作维护持久连接
  • sandbox 休眠或被驱逐时关闭连接
  • 连接断开时自动重连

流式支持

所有传输都支持流式操作(例如带实时输出的 exec()):

  • HTTP 传输 - 使用 Server-Sent Events (SSE)
  • RPC 传输 - 使用 WebSocket 流式消息

无论传输模式如何,你的代码保持相同。

错误处理

所有传输提供相同的错误处理行为。SDK 会在瞬时错误(如 503 响应)时以指数退避自动重试。

WebSocket 特定行为:

  • 连接失败会触发自动重连
  • SDK 透明处理 WebSocket 断开
  • 重连期间进行中的操作不会丢失

选择传输

我们预计 RPC 传输将在未来版本中取代默认的 HTTP 传输。新功能可能仅支持 RPC 传输。现在切换可避免将来迁移。

迁移指南

在传输之间切换无需更改代码。

从 HTTP 切换到 RPC

SANDBOX_TRANSPORT 添加到 wrangler.jsonc

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

然后部署:

npx wrangler deploy

从 RPC 切换到 HTTP

移除 SANDBOX_TRANSPORT 变量(或将其设为 "http"):

{
	"vars": {
		// Remove SANDBOX_TRANSPORT or set to "http"
	},
}
vars = { }

从已弃用的 WebSocket 切换到 RPC

SANDBOX_TRANSPORT 变量设为 "rpc"

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

相关资源

这篇文档对您有帮助吗?