← Cloudflare Durable Objects / durable-objects / api
Хранилище Durable Object на основе KV (устаревшее)
Durable Object Storage API позволяет Durable Objects для доступа к транзакционному и строго согласованному хранилищу. Хранилище, привязанное к Durable Object, доступно только его уникальному экземпляру и недоступно другим объектам.
Durable Object Storage API включает несколько методов: SQL, восстановление на момент времени (PITR), ключ-значение (KV) и alarm API. Доступные методы API зависят от бэкенда хранилища класса Durable Objects: либо SQLite или KV.
| Методы 1 | класс Durable Object на основе SQLite | Класс Durable Object на основе KV |
|---|---|---|
| SQL API | ✅ | ❌ |
| PITR API | ✅ | ❌ |
| Синхронный KV API | ✅ 2, 3 | ❌ |
| Асинхронный KV API | ✅ 3 | ✅ |
| Alarms API | ✅ | ✅ |
Сноски
1 Каждый метод неявно оборачивается в транзакцию, поэтому его результаты атомарны и изолированы от всех остальных операций хранилища, даже при обращении к нескольким парам «ключ-значение».
2 методы KV API, такие как get(), put(), delete(), или list() хранят
данные в скрытой таблице SQLite __cf_kv. Обратите внимание: эта таблица будет отображаться при перечислении всех таблиц, но доступ к её содержимому через SQL API получить не удастся.
3 Durable Objects на основе SQLite также используют синхронные методы API KV с помощью ctx.storage.kv, тогда как Durable Object на основе KV предоставляют только асинхронные методы KV API.
Доступ к хранилищу
Durable Objects получают доступ к Storage API через DurableObjectStorage интерфейс и доступен через DurableObjectState::storage свойство. К нему часто обращаются через this.ctx.storage на ctx параметр, передаваемый в конструктор Durable Object.
Следующий фрагмент кода показывает, как сохранять и получать данные с помощью Durable Object Storage API.
export class Counter extends DurableObject {
constructor(ctx, env) {
super(ctx, env);
}
async increment() {
let value = (await this.ctx.storage.get("value")) || 0;
value += 1;
await this.ctx.storage.put("value", value);
return value;
}
}export class Counter extends DurableObject {
constructor(ctx: DurableObjectState, env: Env) {
super(ctx, env);
}
async increment(): Promise<number> {
let value: number = (await this.ctx.storage.get("value")) || 0;
value += 1;
await this.ctx.storage.put("value", value);
return value;
}
}from workers import DurableObject
class Counter(DurableObject):
def __init__(self, ctx, env):
super().__init__(ctx, env)
async def increment(self):
value = (await self.ctx.storage.get("value")) or 0
value += 1
await self.ctx.storage.put("value", value)
return valueJavaScript является однопоточным, событийно-ориентированным языком программирования. Это означает, что среды выполнения JavaScript по умолчанию допускают чередование запросов друг с другом, что может приводить к ошибкам параллелизма. Среда выполнения Durable Objects использует сочетание входные шлюзы и выходные шлюзы, чтобы избежать такого рода ошибок конкурентного доступа при выполнении операций с хранилищем. Подробнее в нашем запись в блоге ↗.
Асинхронный KV API
Durable Objects на основе KV предоставляют методы KV API, которые являются асинхронными.
get
-
ctx.storage.get(key:string, optionsObjectoptional)Promise<any>- Возвращает значение, связанное с указанным ключом. Тип возвращаемого значения соответствует тому, что было ранее записано для этого ключа, либо undefined, если ключ не существует.
-
ctx.storage.get(keys:Array<string>, optionsObjectoptional)Promise<Map<string, any>>- Возвращает значения, связанные с каждым из указанных ключей. Тип каждого возвращаемого значения в
Map↗ будет равно тому, что было ранее записано для соответствующего ключа. Приводит кMapбудут отсортированы в порядке возрастания их UTF-8 кодировок, при этом запрошенные ключи, которых не существует, будут пропущены. Поддерживается до 128 ключей за раз.
- Возвращает значения, связанные с каждым из указанных ключей. Тип каждого возвращаемого значения в
Поддерживаемые параметры
-
allowConcurrency:boolean- По умолчанию система приостанавливает доставку событий ввода-вывода объекту, пока выполняется операция с хранилищем, чтобы избежать непредвиденных состояний гонки. Передайте
allowConcurrency: trueчтобы отключить это поведение и разрешить доставку параллельных событий.
- По умолчанию система приостанавливает доставку событий ввода-вывода объекту, пока выполняется операция с хранилищем, чтобы избежать непредвиденных состояний гонки. Передайте
-
noCache:boolean- Если значение true, пара ключ-значение не добавляется в кэш в памяти. Если ключ уже есть в кэше, будет возвращено кэшированное значение, однако время его последнего использования не обновится. Используйте этот флаг, если вы не ожидаете повторного использования этого ключа в ближайшее время. Флаг является лишь подсказкой: он никогда не меняет семантику вашего кода, но может повлиять на производительность.
put
-
put(key:string, valueany, optionsObjectoptional)Promise-
Сохраняет значение и связывает его с указанным ключом. Значение может быть любого типа, поддерживаемого алгоритм структурного клонирования ↗, что верно для большинства типов.
Ограничения на размер ключей и значений зависят от используемого бэкенда хранилища Durable Object. См. один из следующих материалов:
Если в Durable Object с хранилищем на основе KV сериализованное значение превышает лимит размера 128 KiB (131072 байт),
put()выбрасываетRangeError(например,Values cannot be larger than 131072 bytes.) до применения записи.
-
-
put(entries:Object, optionsObjectoptional)Promise- Принимает объект и сохраняет каждый его ключ и значение в хранилище.
- Каждое значение может быть любого типа, поддерживаемого алгоритм структурного клонирования ↗, что верно для большинства типов.
- Одновременно поддерживается до 128 пар «ключ-значение». Размер ключей и значений ограничен по-разному в зависимости от типа используемого Durable Object. См.:
удалить
-
delete(key:string, optionsObjectoptional)Promise<boolean>- Удаляет ключ и связанное с ним значение. Возвращает
true, если ключ существовал, илиfalse, если этого не произошло.
- Удаляет ключ и связанное с ним значение. Возвращает
-
delete(keys:Array<string>, optionsObjectoptional)Promise<number>- Удаляет переданные ключи и связанные с ними значения. Поддерживает до 128 ключей за один вызов. Возвращает количество удалённых пар «ключ-значение».
Поддерживаемые параметры
-
put(),delete()иdeleteAll()поддерживают следующие параметры: -
allowUnconfirmedboolean-
По умолчанию система приостанавливает исходящие сетевые сообщения от Durable Object, пока не будет подтверждено, что все предыдущие записи сброшены на диск. Если запись завершается ошибкой, система сбрасывает объект, отбрасывает все исходящие сообщения и вместо них отвечает клиентам ошибками.
-
Благодаря этому Durable Objects могут продолжать выполняться параллельно с операцией записи, не рискуя преждевременно подтвердить запись, потому что никакая внешняя сторона не может увидеть действия объекта, пока запись действительно не завершится успешно.
-
После любой записи последующие сетевые сообщения могут немного задерживаться. Для некоторых приложений допустимо обмениваться данными на основе неподтверждённых записей. Другие программы могут предпочесть пропускать сетевой трафик немедленно. В этом случае задайте
allowUnconfirmedкtrueчтобы отказаться от поведения по умолчанию. -
Если вы хотите, чтобы одни исходящие сетевые сообщения отправлялись немедленно, а другие нет, используйте опцию allowUnconfirmed, чтобы не блокировать нужные сообщения, а затем отдельно вызовите
sync()метод, который возвращает промис, разрешающийся только после того, как все предыдущие операции записи будут успешно сохранены на диск.
-
-
noCacheboolean-
Если значение true, пара ключ-значение удаляется из памяти сразу после завершения записи на диск.
-
Используйте
noCache, если ключ не понадобится в ближайшем будущем.noCacheникогда не изменит семантику вашего кода, но может повлиять на производительность. -
Если вы используете
get()чтобы получить ключ до завершения записи, будет возвращена копия из буфера записи, что обеспечивает согласованность с последним вызовомput().
-
список
list(options:Objectoptional)Promise<Map<string, any>>-
Возвращает все ключи и значения, связанные с текущим Durable Object, отсортированные по возрастанию на основе представления ключей в кодировке UTF-8.
-
Тип каждого возвращаемого значения в
Map↗ будет равно тому, что было ранее записано для соответствующего ключа. -
Учитывайте, какой объём данных может храниться в вашем Durable Object, прежде чем вызывать эту версию
listбез параметров, поскольку все данные будут загружены в память Durable Object, что потенциально может привести к достижению лимит. Если это имеет значение, передайте параметры вlistкак описано ниже.
-
Поддерживаемые параметры
-
startstring- Ключ, с которого начинаются результаты списка, включая его.
-
startAfterstring- Ключ, после которого должны начинаться результаты списка, не включая его. Нельзя использовать одновременно с
start.
- Ключ, после которого должны начинаться результаты списка, не включая его. Нельзя использовать одновременно с
-
endstring- Ключ, на котором заканчиваются результаты списка, не включая его.
-
prefixstring- Ограничивает результаты только теми парами «ключ-значение», ключи которых начинаются с указанного префикса.
-
reverseboolean- Если значение true, результаты возвращаются в порядке убывания вместо порядка возрастания, используемого по умолчанию.
- Включение
reverseне меняет смыслstart,startKey, илиendKey.startпо-прежнему задаёт наименьший ключ в лексикографическом порядке, который может быть возвращён (включительно), фактически определяя конечную точку списка при обратном порядке сортировки.endпо-прежнему задаёт наибольший ключ в лексикографическом порядке, который должен учитываться при выборке (исключительно), фактически определяя начальную точку списка при обратном порядке сортировки.
-
limitnumber- Максимальное количество пар ключ-значение, которое нужно вернуть.
-
allowConcurrencyboolean- То же, что и возможность
get(), выше.
- То же, что и возможность
-
noCacheboolean- То же, что и возможность
get(), выше.
- То же, что и возможность
Будильники
getAlarm
getAlarm(options:Objectoptional)Promise<Number | null>- Возвращает текущее время будильника (если оно задано) в виде целого числа миллисекунд с начала эпохи. Будильник считается заданным, если он ещё не сработал либо если он завершился ошибкой и повторная попытка ещё не началась. Если будильник не задан,
getAlarm()возвращаетnull.
- Возвращает текущее время будильника (если оно задано) в виде целого числа миллисекунд с начала эпохи. Будильник считается заданным, если он ещё не сработал либо если он завершился ошибкой и повторная попытка ещё не началась. Если будильник не задан,
Поддерживаемые параметры
- Такие же параметры, как и
get(), но безnoCache.
setAlarm
-
setAlarm(scheduledTime:Date | number, optionsObjectoptional)Promise- Задаёт текущее время будильника, принимая либо JavaScript
Date, или целое число миллисекунд с начала эпохи.
Если
setAlarm()вызывается с временем, равным или предшествующимDate.now(), будильник будет запланирован на асинхронное выполнение в ближайшее время. Если обработчик будильника в этот момент уже выполняется, он не будет отменён. Будильники можно устанавливать с точностью до миллисекунды, и обычно они срабатывают в течение нескольких миллисекунд после установленного времени, но могут задерживаться до минуты из-за обслуживания или сбоев во время отказоустойчивого переключения. - Задаёт текущее время будильника, принимая либо JavaScript
deleteAlarm
deleteAlarm(options:Objectoptional)Promise- Удаляет будильник, если он установлен. Не отменяет выполнение обработчика будильника, если он уже запущен.
Поддерживаемые параметры
setAlarm()иdeleteAlarm()поддерживают те же параметры, что иput(), но безnoCache.
Прочее
deleteAll
deleteAll(options:Objectoptional)Promise- Удаляет все сохранённые данные, фактически освобождая всё хранилище, используемое Durable Object. Для Durable Objects с хранилищем типа «ключ-значение»,
deleteAll()удаляет все ключи и связанные с ними значения для отдельного Durable Object. Для Durable Object с Хранилище на основе SQLite,deleteAll()полностью удаляет содержимое приватной базы данных SQLite объекта Durable Object, включая данные SQL и данные в формате ключ-значение. - Для Durable Objects с бэкендом хранилища на основе ключ-значение выполняющаяся
deleteAll()операция может завершиться неудачей, из-за чего часть данных может остаться неудалённой. У Durable Objects с бэкендом хранилища SQLite не бывает частичногоdeleteAll()проблема, потому чтоdeleteAll()операции атомарны (выполняются полностью либо не выполняются вовсе). - Для Workers с датой совместимости
2026-02-24или более поздней версии,deleteAll()также удаляет все активные оповещение. Для более ранних дат совместимостиdeleteAll()не удаляет будильники. ИспользуйтеdeleteAlarm()отдельно либо включитьdelete_all_deletes_alarmфлаг совместимости.
- Удаляет все сохранённые данные, фактически освобождая всё хранилище, используемое Durable Object. Для Durable Objects с хранилищем типа «ключ-значение»,
transactionSync
transactionSync(callback):any-
Доступно только при использовании Durable Object с хранилищем SQLite.
-
Вызывает
callback()обернутый в транзакцию, и возвращает её результат. -
Если
callback()выбрасывает исключение, транзакция будет отменена. -
Обратный вызов должен завершаться синхронно, то есть он не должен быть объявлен как
asyncи не должны каким-либо иным образом возвращать Promise. Частью транзакции могут быть только синхронные операции с хранилищем. Это предназначено для использования с SQL-запросами черезctx.storage.sql.exec(), которые выполняются синхронно.
-
transaction
-
transaction(closureFunction(txn)):Promise-
Выполняет последовательность операций хранения, вызванных для
txnв рамках одной транзакции, которая либо успешно фиксируется, либо отменяется. -
Явные транзакции больше не требуются. Любая последовательность операций записи без промежуточного
awaitбудут автоматически отправлены атомарно, а система не позволит параллельным событиям выполняться, покаawaitоперация чтения (если не используетсяallowConcurrency: true). Поэтому серия операций чтения, за которой следует серия операций записи (без другого промежуточного ввода-вывода), автоматически становится атомарной и ведёт себя как транзакция.
-
-
txn-
Предоставляет доступ к
put(),get(),delete(), а такжеlist()методы, описанные выше, для выполнения в текущем контексте транзакции. Чтобы получить транзакционное поведение внутри замыкания транзакции, вызывайте методы наtxnObject, а не на верхнем уровнеctx.storageObject.
Также поддерживаетrollback()-функция, которая гарантирует, что все изменения, внесённые в рамках транзакции, будут отменены, а не зафиксированы. Послеrollback()вызывается, любые последующие операции сtxnObject завершится с исключением.rollback()не принимает параметров и не возвращает вызывающей стороне никакого значения. -
При использовании движок хранения на основе SQLite,
txnобъект устарел. Любые операции с хранилищем, выполняемые напрямую черезctx.storageобъект, включая SQL-запросы черезctx.storage.sql.exec(), будут считаться частью транзакции.
-
sync
sync():Promise-
Синхронизирует все отложенные записи на диск.
-
Это похоже на обычное поведение при автоматическом объединении записей (write coalescing). Если в буфере записи есть ожидающие записи (в том числе отправленные с помощью
allowUnconfirmedпараметр), возвращаемый promise будет разрешён, когда они завершатся. Если отложенных записей нет, возвращаемый promise уже будет разрешён.
-