← Sandbox SDK / sandbox / configuration
Режимы транспорта
Настройте, как Sandbox SDK взаимодействует с контейнерами с помощью режимов транспорта.
Обзор
Sandbox SDK поддерживает три режима транспорта для взаимодействия между Durable Object и контейнером:
- HTTP-транспорт (по умолчанию) - Каждая операция SDK выполняет отдельный HTTP-запрос к контейнеру.
- Новое: транспорт RPC - Все операции SDK мультиплексируются через одно постоянное WebSocket-соединение. В будущем заменит HTTP в качестве транспорта по умолчанию. Доступно начиная с версии 0.9.1.
- Устарело: транспорт WebSocket - Все операции SDK мультиплексируются через одно постоянное WebSocket-соединение. Заменён транспортом RPC, использующим усовершенствованный протокол.
Когда использовать RPC-транспорт
Используйте транспорт RPC, если ваш Worker или Durable Object выполняет много операций SDK за один запрос. Это позволяет избежать ограничения на подзапросы.
Лимиты подзапросов
У Cloudflare Workers есть ограничения на количество подзапросов, которые действуют при обращении к внешним сервисам, включая вызовы API контейнера:
- Workers Free: 50 подзапросов на запрос
- Workers Paid: 1,000 подзапросов на запрос
При HTTP-транспорте (по умолчанию) каждая операция SDK (exec(), readFile(), writeFile(), и т. д.) расходует один подзапрос. Приложения, которые выполняют много операций с песочницей в рамках одного запроса, могут упереться в эти лимиты.
Чем полезен 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-транспорт также устраняет Ограничение в 32 MiB который есть у HTTP-транспорта. Передайте ReadableStream экземпляр к writeFile() метод.
const req = await fetch("https://example.com/archive.tar.gz");
await sandbox.writeFile("/archive.tar.gz", req.body);Конфигурация
Задайте SANDBOX_TRANSPORT переменную окружения в конфигурации Worker. SDK считывает её из привязок окружения Worker (а не изнутри контейнера).
HTTP-транспорт (по умолчанию)
HTTP-транспорт используется по умолчанию и не требует дополнительной настройки.
RPC-транспорт
Включите RPC-транспорт, добавив SANDBOX_TRANSPORT в конфигурацию вашего Worker vars:
{
"name": "my-sandbox-worker",
"main": "src/index.ts",
// Set this to today's date
"compatibility_date": "2026-08-28",
"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-28"
[vars]
SANDBOX_TRANSPORT = "rpc"
[[containers]]
class_name = "Sandbox"
image = "./Dockerfile"
[[durable_objects.bindings]]
class_name = "Sandbox"
name = "Sandbox"Изменять код приложения не нужно. SDK автоматически использует настроенный транспорт для всех операций.
Поведение транспорта
Жизненный цикл соединения
HTTP-транспорт:
- Создаёт новый HTTP-запрос для каждой операции SDK
- Без постоянного соединения
- Каждый запрос независим и не имеет состояния
RPC-транспорт:
- Устанавливает WebSocket-соединение при первой операции SDK
- Поддерживает постоянное соединение для всех последующих операций
- Соединение закрывается, когда песочница переходит в спящий режим или вытесняется
- Автоматически переподключается при обрыве соединения
Поддержка потоковой передачи
Все транспорты поддерживают потоковые операции (например, exec() с выводом в реальном времени):
- HTTP-транспорт - Использует Server-Sent Events (SSE)
- RPC-транспорт - Использует потоковые сообщения WebSocket
Код остаётся одинаковым независимо от режима передачи.
Обработка ошибок
Все транспорты обеспечивают одинаковое поведение при обработке ошибок. При временных ошибках (например, ответах 503) SDK автоматически повторяет запрос с экспоненциальной задержкой (exponential backoff).
Особенности поведения, характерные для 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"Дополнительные материалы
- Конфигурация Wrangler - Полная конфигурация Worker
- Переменные окружения - Передача конфигурации в песочницы
- Лимиты подзапросов Workers - Изучение лимитов на подзапросы
- Архитектура - Как взаимодействуют компоненты Sandbox SDK