← Cloudflare Durable Objects / durable-objects / platform
Лимиты
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. При этом каждый отдельный объект по своей природе однопоточен.
- Для отдельного объекта установлено мягкое ограничение в 1000 запросов в секунду. Количество отдельных объектов в пределах одного пространства имён не ограничено.
- Простой хранилище
get()над небольшим значением, которое напрямую возвращает ответ, может обеспечить более высокую пропускную способность запросов по сравнению с Durable Object, который, например, сериализует и (или) десериализует большие JSON-значения. - Аналогично, Durable Object, который выполняет несколько
list()операции могут быть более ограничены по пропускной способности запросов.
Durable Object, получающий слишком много запросов, после попытки поставить их в очередь вернёт перегружен ошибку вызывающей стороне.
Сколько Durable Objects можно создать?
Durable Objects спроектированы так, что количество отдельных объектов в системе не ограничено и может масштабироваться горизонтально.
- Вы можете создавать и запускать сколько угодно отдельных Durable Objects в рамках заданного пространство имён.
- На плане Workers Paid ограничений на объём хранилища на аккаунт для Durable Objects на основе SQLite нет.
- Каждый Durable Object с хранилищем SQLite имеет ограничение хранилища в 10 GB на тарифе Workers Paid.
- См. Лимиты Durable Object, где это описано подробнее.
Можно ли увеличить лимит 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. |
Сноски
-
Так же, как и в Workers лимит скрипта. ↩
-
Durable Objects тарифицируют и измеряют хранилище на основе гигабайт
(1 ГБ = 1,000,000,000 байт), а не гибибайт (ГиБ).
↩ -
На тарифе Workers Free аккаунты ограничены суммарным объёмом хранилища Durable Objects в 5 ГБ. ↩ ↩2
-
Каждый входящий HTTP-запрос или WebSocket сообщение сбрасывает оставшееся доступное время CPU до 30 секунд. Это позволяет Durable Object использовать до 30 секунд вычислений после каждого входящего сетевого запроса, причём каждый новый запрос заново запускает таймер. Если между входящими сетевыми запросами расходуется более 30 секунд вычислений, вероятность вытеснения и сброса отдельного Durable Object повышается. Время CPU на один вызов запроса можно увеличить. ↩
-
Так же, как и в Workers лимит скрипта. ↩
-
Durable Objects тарифицируют и измеряют хранилище на основе гигабайт
(1 ГБ = 1,000,000,000 байт), а не гибибайт (ГиБ).
↩ -
Каждый входящий HTTP-запрос или WebSocket сообщение сбрасывает оставшееся доступное время CPU до 30 секунд. Это позволяет Durable Object использовать до 30 секунд вычислений после каждого входящего сетевого запроса, причём каждый новый запрос заново запускает таймер. Если между входящими сетевыми запросами расходуется более 30 секунд вычислений, вероятность вытеснения и сброса отдельного Durable Object повышается. Время CPU на один вызов запроса можно увеличить. ↩