← Cloudflare Durable Objects / durable-objects / reference
Часто задаваемые вопросы
Цены
Когда с Durable Object начинает взиматься плата за длительность работы?
С Durable Object взимается плата за длительность, когда он активно выполняет JavaScript, обрабатывая запрос или запуская обработчики событий, либо когда он простаивает, но не соответствует условия для перехода в спящий режим. Неактивный Durable Object, соответствующий условиям гибернации, не влечёт начисления платы за длительность выполнения, даже в течение короткого промежутка времени перед тем, как runtime переводит его в гибернацию.
После того как объект вытеснен из памяти, при следующем обращении к нему он будет пересоздан (конструктор будет вызван заново).
Есть несколько факторов, которые могут помешать Durable Object перейти в спящий режим, из-за чего с вас продолжат взимать плату за время выполнения.
Дополнительную информацию можно найти в Жизненный цикл Durable Object.
Учитывается ли пустая таблица или база данных SQLite в объёме моего хранилища?
Да, хотя и минимально. Пустые таблицы могут занимать от нескольких килобайт в зависимости от количества столбцов (ширины таблицы). Пустая база данных SQLite занимает приблизительно 12 КБ.
Учитываются ли метаданные, хранящиеся в Durable Objects, в объёме моего хранилища?
Каждая запись в Durable Object на основе SQLite сохраняет небольшой объём метаданных во внутренних таблицах Durable Object, которые учитываются в оплачиваемом объёме хранилища.
Метаданные остаются в Durable Object, пока вы не вызовете deleteAll().
Лимиты
Какой объём работы может выполнить один 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;
}Метрики и аналитика
Как определить, какой экземпляр Durable Object сформировал запись в журнале?
Вы можете использовать $workers.durableObjectId чтобы определить конкретный экземпляр Durable Object, создавший запись в журнале.