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

Цены

За Durable Objects может взиматься плата двух типов: за вычисления и за хранилище.

На плане Workers Free:

Тарификация вычислений

Durable Objects тарифицируются по времени вычислений (wall-clock time), пока Durable Object активно выполняется или простаивает в памяти, но не может гибернация. Durable Objects, которые простаивают и допускают гибернацию, не тарифицируются по длительности, даже до того, как среда выполнения перевела их в спящий режим. Запросы к Durable Object поддерживают его активность или создают объект, если он был неактивен.

Для каждого измеряемого параметра оплачиваемым использованием считается объём, превышающий включённую месячную квоту. Перед применением соответствующего тарифа это использование округляется в большую сторону до ближайшей тарифицируемой единицы. Например, 500,000 ГБ-с оплачиваемой длительности вычислений округляются до 1,000,000 ГБ-с и тарифицируются соответственно.

План Free Платный план
Запросы 100,000 / день 1 млн / месяц, + $0.15/млн
Включает HTTP-запросы, сеансы RPC1, сообщения WebSocket2, и вызовы alarm
Длительность3 13,000 GB-s / день 400,000 GB-s / месяц, + $12.50/млн GB-s4,5

Сноски

1 Каждый Сеанс RPC учитывается как один запрос к вашему Durable Object. Каждый Вызов метода RPC на Durable Objects stub представляет собой отдельную RPC сессию и поэтому один тарифицируемый запрос.

Вызовы методов RPC могут возвращать объекты (заглушки), расширяющие RpcTarget и вызывать методы на этих заглушках. Последующие вызовы на возвращённой заглушке относятся к той же RPC-сессии и не тарифицируются как отдельные запросы. Например:

let durableObjectStub = OBJECT_NAMESPACE.get(id); // retrieve Durable Object stub
using foo = await durableObjectStub.bar(); // billed as a request
await foo.baz(); // treated as part of the same RPC session created by calling bar(), not billed as a request
await durableObjectStub.cat(); // billed as a request

2 Для создания WebSocket соединения требуется запрос. Исходящие сообщения WebSocket не тарифицируются, как и входящие Пинги протокола WebSocket ↗. Для тарификации только вычислительных запросов к входящим сообщениям WebSocket применяется соотношение 20:1, учитывающее меньший размер сообщений при коммуникации в реальном времени. Например, 100 входящих сообщений WebSocket будут тарифицированы как 5 запросов. Соотношение 20:1 не влияет на метрики и аналитику Durable Object, которые отражают фактическое использование.

3 Автоматические ответные сообщения на уровне приложения, которые обрабатываются state.setWebSocketAutoResponse() не потребуют дополнительного астрономического времени, и поэтому за них не будет взиматься плата.

4 Длительность тарифицируется по астрономическому времени, пока объект активен и не подлежит гибернации, при этом время делится между всеми запросами, одновременно активными для объекта. Вызов accept() для WebSocket в Object приведёт к начислению платы за длительность на всё время, пока WebSocket подключён. Рекомендуется использовать WebSocket Hibernation API, чтобы не платить за длительность после завершения работы всех обработчиков событий. Подробное объяснение см. в Когда с Durable Object начинает взиматься плата за длительность работы?.

5 Тарификация по длительности выполнения учитывает 128 МБ памяти, выделенные вашему Durable Object, независимо от фактического использования. Если ваш аккаунт создаёт много экземпляров одного класса Durable Object, они могут выполняться в одном изоляте на одной физической машине и совместно использовать эти 128 МБ памяти. При этом каждый такой Durable Object всё равно тарифицируется так, как будто ему выделены полные 128 МБ памяти.

Тарификация хранилища

Durable Objects Storage API доступен только изнутри Durable Objects. Стоимость зависит от бэкенда хранилища ваших Durable Objects.

Хранилище на основе SQLite

план Workers Free план Workers Paid
Прочитанные строки 1,2 5 миллионов / день Первые 25 миллиардов в месяц включены + $0.001 / миллион строк
Записанные строки 1,2,3,4 100,000 / день Первые 50 миллионов в месяц включены + $1.00 / миллион строк
Хранимые данные SQL 5 5 GB (всего) 5 GB-месяц, + $0.20/ GB-месяц

Сноски

1 Включённые лимиты и тарифы для операций чтения и записи строк совпадают Тарификация D1, бессерверная база данных SQL от Cloudflare.

2 Методы работы с парами «ключ-значение», такие как get(), put(), delete(), или list() хранят и запрашивают данные в скрытой таблице SQLite и тарифицируются как прочитанные и записанные строки.

3 Каждый setAlarm() учитывается как одна записанная строка.

4 Удаления учитываются как записанные строки.

5 Плата за Durable Objects взимается за хранимые данные до тех пор, пока данные удаляются. После удаления данных объект будет автоматически очищен системой.

Бэкенд хранилища ключ-значение

план Workers Paid
Единицы запросов на чтение1,2 1 млн, + $0.20/млн
Единицы запросов на запись3 1 млн, + $1.00/млн
Запросы на удаление4 1 млн, + $1.00/млн
Сохранённые данные5 1 ГБ, + $0.20/ ГБ-месяц

Сноски

1 Единица запроса определяется как 4 КБ прочитанных или записанных данных. Если запрос читает или записывает больше 4 КБ, он расходует несколько единиц. Например, запись объёмом 9 КБ израсходует 3 единицы запроса на запись.

2 Операции списка тарифицируются в единицах запросов на чтение, в зависимости от объёма просмотренных данных. Например, запрос списка, который вернёт в сумме 80 КБ ключей и значений, будет тарифицирован как 20 единиц запросов на чтение. Запрос списка, который ничего не вернёт, тарифицируется как 1 единица запроса на чтение.

3 Каждый setAlarm учитывается как одна единица запроса на запись.

4 Запросы на удаление не тарифицируются по объёму. Например, удаление значения размером 100 КБ будет засчитано как один запрос на удаление.

5 Плата за Durable Objects взимается за хранимые данные до тех пор, пока данные не будут удалены. После удаления данных объект автоматически очищается системой.

Запросы, которые попадают в Кэш Durable Objects в памяти или которые используют многоключевые версии get()/put()/delete() методы тарифицируются так же, как если бы это был обычный отдельный запрос для каждого ключа.

Примеры тарификации Compute

В этих примерах не учитывается стоимость Workers, вызывающих Durable Objects. При расчёте стоимости Durable Object учитывайте следующее:

Пример 1

Этот пример показывает простой Durable Object, который используется как служба координации и вызывается через HTTP.

В этом сценарии предполагаемая ежемесячная стоимость будет рассчитываться следующим образом:

Запросы:

Compute Duration:

Примерный итог: $0.15 (запросы) + $0.00 (длительность вычислений) + минимум $5/mo использования = $5.15 в месяц

Пример 2

Этот пример показывает приложение на основе Durable Objects со средней нагрузкой, которое использует WebSocket для рассылки состояния игры, чата или пользователя в реальном времени всем подключённым клиентам:

В этом сценарии предполагаемая ежемесячная стоимость будет рассчитываться следующим образом:

Запросы:

Compute Duration:

Примерный итог: $0.45 (запросы) + $137.50 (длительность вычислений) + минимум $5/mo использования = $142.95 в месяц.

Пример 3

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

В этом сценарии предполагаемая ежемесячная стоимость будет рассчитываться следующим образом:

Запросы:

Compute Duration:

Примерный итог: $1.80 (запросы) + $412.50 (длительность вычислений) + минимум $5/mo использования = $419.30 в месяц

Пример 4

Этот пример показывает приложение на основе Durable Objects со средней нагрузкой, которое использует WebSocket Hibernation для рассылки состояния игры, чата или пользователя в реальном времени всем подключённым клиентам:

В этом сценарии предполагаемая ежемесячная стоимость будет рассчитываться следующим образом:

Запросы:

Compute Duration:

Примерный итог: $3.15 (запросы) + $12.50 (длительность вычислений) + минимум $5/mo использования = $20.65 в месяц

1 100 сообщений в минуту получается из того, что к каждому DO подключаются 100 клиентов, и каждый отправляет 1 сообщение в минуту.

2 В примере используется 1 секунда, потому что каждый Durable Object активен 1 секунду в минуту. Это также можно представить как 432 миллиона запросов, каждый из которых выполняется 10 мс (4,320,000 секунд).

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

Когда с 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().