跳转到内容
搜索文档

定价

最后更新 查看 MarkdownAgent 设置

Durable Objects 可能产生两种类型的计费:计算和存储。

在 Workers Free 计划中:

  • 如果您超过任何一项免费层限制,该类型的进一步操作将因错误而失败。
  • 每日免费限制在 00:00 UTC 重置。

计算计费

Durable Objects 按 Durable Object 主动运行或空闲在内存中但无法休眠时的计算 duration(挂钟时间)计费。空闲且符合休眠条件的 Durable Objects 不计 duration 费用,即使在运行时休眠它们之前也是如此。对 Durable Object 的请求会保持其活动状态,如果处于非活动状态则创建该对象。

Free 计划 Paid 计划
请求 100,000 / 天 100 万 / 月,+ $0.15/百万
包括 HTTP 请求、RPC 会话1、WebSocket 消息2 和 alarm 调用
Duration3 13,000 GB-s / 天 400,000 GB-s / 月,+ $12.50/百万 GB-s4,5

脚注

1 每个 RPC 会话 作为对 Durable Object 的一个请求计费。Durable Objects stub 上的每个 RPC 方法调用 都是其自己的 RPC 会话,因此算作一个计费请求。

RPC 方法调用可以返回扩展 RpcTarget 的对象(stub)并在这些 stub 上调用。对返回的 stub 的后续调用属于同一 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 协议 ping 也不收费。对于仅计算请求计费,对传入 WebSocket 消息应用 20:1 比率,以考虑实时通信中较小的消息。例如,100 条 WebSocket 传入消息将按 5 个请求计费。20:1 比率不影响 Durable Object 指标和分析,这些反映实际使用情况。

3state.setWebSocketAutoResponse() 处理的应用级自动响应消息不会产生额外的挂钟时间,因此不会计费。

4 Duration 在 Object 处于活动状态且不符合休眠条件期间按挂钟时间计费,但在 Object 上同时活动的所有请求之间共享。在 Object 中对 WebSocket 调用 accept() 将在 WebSocket 连接的整个期间产生 duration 费用。建议使用 WebSocket Hibernation API,以避免在所有事件处理器完成运行后产生 duration 费用。完整说明请参阅 Durable Object 何时产生 duration 费用?

5 Duration 计费按 Durable Object 分配的 128 MB 内存计费,无论实际使用量如何。如果你的账户创建了单个 Durable Object 类的许多实例,Durable Objects 可能在同一物理机器上的同一 isolate 中运行并共享 128 MB 内存。这些 Durable Objects 仍按分配完整 128 MB 内存计费。

存储计费

Durable Objects Storage API 仅可从 Durable Objects 内部访问。定价取决于 Durable Objects 的存储后端。

  • SQLite 支持的 Durable Objects(推荐)SQLite 存储后端 推荐用于所有新的 Durable Object 类。Workers Free 计划只能创建和访问 SQLite 支持的 Durable Objects。
  • 键值支持的 Durable Objects键值存储后端 仅在 Workers Paid 计划上可用。

SQLite 存储后端

Workers Free 计划 Workers Paid 计划
行读取 1,2 500 万 / 天 前 250 亿 / 月包含 + $0.001 / 百万行
行写入 1,2,3,4 100,000 / 天 前 5000 万 / 月包含 + $1.00 / 百万行
SQL 存储数据 5 5 GB(总计) 5 GB-月,+ $0.20/ GB-月

脚注

1 行读取和行写入包含的限制和费率与 D1 定价(Cloudflare 的无服务器 SQL 数据库)一致。

2get()put()delete()list() 这样的键值方法在隐藏的 SQLite 表中存储和查询数据,并按行读取和行写入计费。

3 每次 setAlarm() 按单行写入计费。

4 删除计为行写入。

5 Durable Objects 将对存储的数据计费,直到数据被删除。数据删除后,系统将自动清理该对象。

键值存储后端

Workers Paid 计划
读取请求单位1,2 100 万,+ $0.20/百万
写入请求单位3 100 万,+ $1.00/百万
删除请求4 100 万,+ $1.00/百万
存储数据5 1 GB,+ $0.20/ GB-月

脚注

1 请求单位定义为读取或写入 4 KB 数据。写入或读取超过 4 KB 的请求将消耗多个单位,例如,9 KB 写入将消耗 3 个写入请求单位。

2 list 操作按读取请求单位计费,基于检查的数据量。例如,返回合计 80 KB 键和值的 list 请求将按 20 个读取请求单位计费。不返回任何内容的 list 请求按 1 个读取请求单位计费。

3 每次 setAlarm 按单个写入请求单位计费。

4 删除请求不计量。例如,删除 100 KB 值将收取一个删除请求费用。

5 Durable Objects 将对存储的数据计费,直到数据被删除。数据删除后,系统将自动清理该对象。

命中 Durable Objects 内存缓存 或使用 get()/put()/delete() 方法的多键版本 的请求,计费方式与对每个键的正常单独请求相同。

计算计费示例

这些示例不包括调用 Durable Objects 的 Workers 的成本。在估算 Durable Object 成本时,请注意:

  • 未接收任何请求的非活动对象不会产生任何持续时间费用。
  • WebSocket Hibernation API 可以显著降低通过 WebSocket 协议与客户端通信的 Durable Objects 的持续时间相关费用,特别是当消息仅在稀疏间隔偶尔传输时。
    • 活动出站连接(通过 connect() 或出站 WebSocket)使 Durable Object 保持在内存中,即使没有传入请求,每个连接也会最多产生 15 分钟的持续时间费用。请参阅 Durable Object 生命周期 了解更多信息。

示例 1

此示例代表通过 HTTP 调用的简单 Durable Object 协调服务。

  • 单个 Durable Object 被 Worker 调用 150 万次
  • 本月活动 1,000,000 秒

在此场景中,估算的月成本计算如下:

请求

  • (150 万次请求 - 包含的 100 万次请求)× $0.15 / 1,000,000 = $0.075

计算时长

  • 1,000,000 秒 * 128 MB / 1 GB = 128,000 GB-s
  • (128,000 GB-s - 包含的 400,000 GB-s)× $12.50 / 1,000,000 = $0.00

预估总计:约 $0.075(请求)+ $0.00(计算时长)+ 最低用量 $5/月 = 每月 $5.08

示例 2

此示例代表使用 WebSocket 在连接的客户端之间广播游戏、聊天或实时用户状态的流量适中的 Durable Objects 应用:

  • 100 个 Durable Objects 各有 50 个 WebSocket 连接建立。
  • 客户端每天活跃 8 小时,每月每天大约每分钟发送一条消息。

在此场景中,估算的月成本计算如下:

请求

  • 50 个 WebSocket 连接 * 100 个 Durable Objects 用于建立 WebSocket = 每天创建 5,000 个连接 * 30 天 = 150,000 次 WebSocket 连接请求。
  • 每分钟 50 条消息 * 100 个 Durable Objects * 60 分钟 * 8 小时 * 30 天 = 72,000,000 次 WebSocket 消息请求。
  • 150,000 +(7200 万次请求 / 20 的 WebSocket 消息计费比例)= 375 万次计费请求。
  • (375 万次请求 - 包含的 100 万次请求)× $0.15 / 1,000,000 = $0.41。

计算时长

  • 100 个 Durable Objects * 60 秒 * 60 分钟 * 8 小时 * 30 天 = 86,400,000 秒。
  • 86,400,000 秒 * 128 MB / 1 GB = 11,059,200 GB-s。
  • (11,059,200 GB-s - 包含的 400,000 GB-s)× $12.50 / 1,000,000 = $133.24。

预估总计:$0.41(请求)+ $133.24(计算时长)+ 最低用量 $5/月 = 每月 $138.65。

示例 3

此示例代表使用 WebSocket 向连接到每个 Durable Object 的单个客户端通信用户特定状态的水平扩展 Durable Objects 应用。

  • 100 个 Durable Objects 各有一个 WebSocket 连接建立。
  • 客户端在本月每秒发送一条消息,使 Durable Objects 整个月都处于活动状态。

在此场景中,估算的月成本计算如下:

请求

  • 100 次 WebSocket 连接请求。
  • 每秒 1 条消息 * 100 个连接 * 60 秒 * 60 分钟 * 24 小时 * 30 天 = 259,200,000 次 WebSocket 消息请求。
  • 100 +(2.592 亿次请求 / 20 的 WebSocket 计费比例)= 12,960,100 次请求。
  • (1290 万次请求 - 包含的 100 万次请求)× $0.15 / 1,000,000 = $1.79。

计算时长

  • 100 个 Durable Objects * 60 秒 * 60 分钟 * 24 小时 * 30 天 = 259,200,000 秒
  • 259,200,000 秒 * 128 MB / 1 GB = 33,177,600 GB-s
  • (33,177,600 GB-s - 包含的 400,000 GB-s)× $12.50 / 1,000,000 = $409.72

预估总计:$1.79(请求)+ $409.72(计算时长)+ 最低用量 $5/月 = 每月 $416.51

示例 4

此示例代表使用 WebSocket Hibernation 在连接的客户端之间广播游戏、聊天或实时用户状态的流量适中的 Durable Objects 应用:

  • 100 个 Durable Objects 各有 100 个可休眠 WebSocket 连接建立。
  • 客户端每分钟发送一条消息,在 webSocketMessage() 处理器中处理单条消息需要 10ms。由于每个 Durable Object 处理 100 个 WebSocket,每个 Durable Object 每分钟累计执行 JS 1 秒(100 WebSockets * 10ms)。

在此场景中,估算的月成本计算如下:

请求

  • 100 个 WebSocket 连接 * 100 个 Durable Objects 用于建立 WebSocket = 10,000 次初始 WebSocket 连接请求。
  • 每分钟 100 条消息1 * 100 个 Durable Objects * 60 分钟 * 24 小时 * 30 天 = 432,000,000 次请求。
  • 10,000 +(4.32 亿次请求 / 20 的 WebSocket 计费比例)= 21,610,000 次请求。
  • (2160 万次请求 - 包含的 100 万次请求)× $0.15 / 1,000,000 = $3.09。

计算时长

  • 100 个 Durable Objects * 1 秒2 * 60 分钟 * 24 小时 * 30 天 = 4,320,000 秒
  • 4,320,000 秒 * 128 MB / 1 GB = 552,960 GB-s
  • (552,960 GB-s - 包含的 400,000 GB-s)× $12.50 / 1,000,000 = $1.91

预估总计:$3.09(请求)+ $1.91(计算时长)+ 最低用量 $5/月 = 每月 $10.00

1 每分钟 100 条消息来自:每个 DO 连接 100 个客户端,每个客户端每分钟发送 1 条消息。

2 示例使用 1 秒,是因为每个 Durable Object 每分钟仅活动 1 秒。也可以理解为 4.32 亿次请求,每次执行耗时 10 ms(共 4,320,000 秒)。

常见问题

Durable Object 何时产生 duration 费用?

当 Durable Object 正在主动执行 JavaScript — 处理请求或运行事件处理器 — 或处于空闲但不满足休眠条件时,会产生 duration 费用。符合休眠条件的空闲 Durable Object 不会产生 duration 费用,即使在运行时休眠之前的短暂窗口内也是如此。

对象从内存中驱逐后,下次需要时会重新创建(再次调用构造函数)。

有几个因素可能阻止 Durable Object 休眠并导致其继续产生 duration 费用。

更多信息请参阅 Durable Object 的生命周期

空表 / SQLite 数据库是否计入我的存储?

是的,虽然很少。空表根据列数(表宽度)至少消耗几千字节。空 SQLite 数据库大约消耗 12 KB 存储。

存储在 Durable Objects 中的元数据是否计入我的存储?

对 SQLite 支持的 Durable Object 的所有写入都会在 Durable Object 的内部表中存储 nominal 数量的元数据,这会计入你的可计费存储。

元数据保留在 Durable Object 中,直到你调用 deleteAll()

这篇文档对您有帮助吗?