INTEGRITY Документация

Лимиты

Durable Objects являются особым видом Worker, поэтому Лимиты Workers действуют в соответствии с вашим тарифным планом Workers. Кроме того, у Durable Objects есть отдельные ограничения, перечисленные на этой странице.

общие лимиты Durable Objects на основе SQLite

Возможность Лимит
Количество объектов Неограниченно (в пределах аккаунта или заданного класса)
Максимальное количество классов Durable Object (на аккаунт) 500 (Workers Paid) / 100 (Free) 1
Хранилище на аккаунт Неограниченно (Workers Paid) / 5GB (Free) 2
Хранилище на класс Неограниченно 3
Хранилище на один Durable Object 10 ГБ 3
Размер ключа Суммарный размер ключа и значения не может превышать 2 МБ
Размер значения Суммарный размер ключа и значения не может превышать 2 МБ
Размер сообщения WebSocket 32 MiB (только для полученных сообщений)
CPU на запрос 30 секунд (по умолчанию) / настраивается до 5 минут активное время CPU 4
Одновременные исходящие соединения/запрос 6 (так же, как Workers)

Лимиты SQL-хранилища

Для классов Durable Object с Хранилище SQLite действуют следующие ограничения SQL:

SQL Лимит
Максимальное количество столбцов в таблице 100
Максимальное количество строк в таблице Неограниченно (не считая лимитов хранилища на объект)
Максимальная строка, BLOB или размер строки таблицы 2 МБ
Максимальная длина SQL-оператора 100 КБ
Максимальное количество привязанных параметров в запросе 100
Максимальное количество аргументов SQL-функции 32
Максимальное количество символов (байт) в LIKE или GLOB шаблон 50 байт

Общие ограничения Durable Objects на основе ключ-значение

Возможность Ограничение для класса с хранилищем на основе ключ-значение
Количество объектов Неограниченно (в пределах аккаунта или заданного класса)
Максимальное количество классов Durable Object (на аккаунт) 500 (Workers Paid) / 100 (Free) 5
Хранилище на аккаунт 50 GB (можно увеличить, обратившись в Cloudflare) 6
Хранилище на класс Без ограничений
Хранилище на один Durable Object Без ограничений
Размер ключа 2 КиБ (2048 байт)
Размер значения 128 КиБ (131072 байт)
Размер сообщения WebSocket 32 MiB (только для полученных сообщений)
CPU на запрос 30 с (включая сообщения WebSocket) 7
Одновременные исходящие соединения/запрос 6 (так же, как Workers)

Часто задаваемые вопросы

Какой объём работы может выполнить один Durable Object?

Durable Objects могут масштабироваться горизонтально за счёт множества Durable Objects. При этом каждый отдельный объект по своей природе однопоточен.

Durable Object, получающий слишком много запросов, после попытки поставить их в очередь вернёт перегружен ошибку вызывающей стороне.

Сколько Durable Objects можно создать?

Durable Objects спроектированы так, что количество отдельных объектов в системе не ограничено и может масштабироваться горизонтально.

Можно ли увеличить лимит CPU для Durable Objects?

Durable Objects являются скриптами Worker и обладают теми же лимиты CPU на один вызов как и любые другие Workers. Обратите внимание, что процессорное время означает время активной обработки: оно не включает время ожидания сетевых запросов, обращений к хранилищу и прочего ввода-вывода, которое не учитывается в процессорном времени и потреблении вычислительных ресурсов Durable Objects.

По умолчанию максимальное время CPU на один вызов Durable Object (HTTP запрос, сообщение WebSocket или будильник) составляет 30 секунд, но его можно увеличить для всех Durable Objects, связанных с определением Durable Object, задав limits.cpu_ms в конфигурации Wrangler:

{
	// ...rest of your configuration...
	"limits": {
		"cpu_ms": 300000, // 300,000 milliseconds = 5 minutes
	},
	// ...rest of your configuration...
}
[limits]
cpu_ms = 300_000

Что происходит, если Durable Object превышает лимит хранилища?

Когда Durable Object на основе SQLite достигает своего максимальный лимит хранилища (10 ГБ на Workers Paid или 1 ГБ на плане Free), операции записи (например, INSERT, UPDATE, или вызовов put() и sql.exec() storage API) завершатся ошибкой следующего вида:

database or disk is full: SQLITE_FULL

Операции чтения (например, SELECT запросов, get(), а также list() вызовы) продолжат работать, а DELETE операции также будут выполняться успешно, чтобы вы могли удалять данные и освобождать место.

Чтобы обработать эту ошибку в своём Durable Object, перехватите исключение, которое выбрасывает storage API:

try {
	this.ctx.storage.sql.exec(
		"INSERT INTO my_table (key, value) VALUES (?, ?)",
		key,
		value,
	);
} catch (e) {
	if (e.message.includes("SQLITE_FULL")) {
		// Storage limit reached — reads and deletes still work
		// Consider deleting old data or returning a meaningful error to the caller
	}
	throw e;
}

Лимиты астрономического времени по типу вызова

Астрономическое время (также называемое wall-clock time) обозначает общее время, прошедшее от начала до конца вызова, включая время ожидания сетевых запросов, операций ввода-вывода и других асинхронных операций. Это отличается от Процессорное время, который измеряет только время, которое CPU активно тратит на выполнение вашего кода.

В следующей таблице приведены ограничения по фактическому времени выполнения для разных типов вызовов Worker на платформе для разработчиков:

Тип вызова Лимит астрономического времени Подробности
Входящий HTTP-запрос Без ограничений Жёсткое ограничение отсутствует, пока клиент остаётся подключённым. Worker, который продолжает передавать тело ответа потоком, остаётся активным. waitUntil() продлевает выполнение до 30 секунд после ответа или отключения.
Cron Triggers 15 минут Для запланированных Workers максимальное время выполнения составляет 15 минут на один вызов.
Потребители Queue 15 минут Максимальное время выполнения каждого вызова потребителя составляет 15 минут.
Обработчики alarm Durable Object 15 минут Вызовы alarm handler выполняются не более 15 минут.
Durable Objects (RPC / HTTP) Без ограничений Жёсткое ограничение отсутствует, пока вызывающая сторона остаётся подключённой к Durable Object. Durable Object остаётся активным, пока выполняется запрос, RPC-вызов, передача ответа, соединение WebSocket или ожидающая операция ввода-вывода.
Workflows (за шаг) Без ограничений Каждый шаг может выполняться неограниченное время. На отдельные шаги распространяется настроенный Лимит времени CPU.

Сноски

  1. Так же, как и в Workers лимит скрипта. ↩

  2. Durable Objects тарифицируют и измеряют хранилище на основе гигабайт
    (1 ГБ = 1,000,000,000 байт), а не гибибайт (ГиБ).
    ↩

  3. На тарифе Workers Free аккаунты ограничены суммарным объёмом хранилища Durable Objects в 5 ГБ. ↩ ↩2

  4. Каждый входящий HTTP-запрос или WebSocket сообщение сбрасывает оставшееся доступное время CPU до 30 секунд. Это позволяет Durable Object использовать до 30 секунд вычислений после каждого входящего сетевого запроса, причём каждый новый запрос заново запускает таймер. Если между входящими сетевыми запросами расходуется более 30 секунд вычислений, вероятность вытеснения и сброса отдельного Durable Object повышается. Время CPU на один вызов запроса можно увеличить. ↩

  5. Так же, как и в Workers лимит скрипта. ↩

  6. Durable Objects тарифицируют и измеряют хранилище на основе гигабайт
    (1 ГБ = 1,000,000,000 байт), а не гибибайт (ГиБ).
    ↩

  7. Каждый входящий HTTP-запрос или WebSocket сообщение сбрасывает оставшееся доступное время CPU до 30 секунд. Это позволяет Durable Object использовать до 30 секунд вычислений после каждого входящего сетевого запроса, причём каждый новый запрос заново запускает таймер. Если между входящими сетевыми запросами расходуется более 30 секунд вычислений, вероятность вытеснения и сброса отдельного Durable Object повышается. Время CPU на один вызов запроса можно увеличить. ↩