← Cloudflare Durable Objects / durable-objects / platform
Ceny
Durable Objects mohou být účtovány dvěma způsoby: za výpočet a za úložiště.
V plánu Workers Free:
- Pokud překročíte kterýkoli z limitů plánu Free, další operace daného typu skončí chybou.
- Denní bezplatné limity se resetují v 00:00 UTC.
Fakturace Compute
Durable Objects se účtují podle doby výpočtu (reálného času), po kterou Durable Object aktivně běží nebo je nečinný v paměti, ale není možné ho hibernovat. Durable Objects, které jsou nečinné a splňují podmínky pro hibernaci, nejsou účtovány za dobu běhu, a to ještě předtím, než je runtime skutečně hibernuje. Požadavek na Durable Object jej udrží aktivní, nebo pokud byl neaktivní, objekt vytvoří.
U každé měřené dimenze představuje zpoplatněné využití množství spotřebované nad rámec zahrnuté měsíční alokace. Toto zpoplatněné využití se před uplatněním příslušné sazby zaokrouhluje nahoru na nejbližší zpoplatnitelnou jednotku. Například 500,000 GB-s zpoplatněné doby výpočtu se zaokrouhlí nahoru na 1,000,000 GB-s a odpovídajícím způsobem se naúčtuje.
| Tarif Free | Placený plán | |
|---|---|---|
| Požadavky | 100,000 / den | 1 milion / měsíc, + $0.15/milion Zahrnuje požadavky HTTP, relace RPC1, zprávy WebSocket2, a vyvolání alarmů |
| Doba trvání3 | 13,000 GB-s / den | 400,000 GB-s / měsíc, + $12.50/milion GB-s4,5 |
Poznámky pod čarou
1 Každý Relace RPC je účtován jako jeden požadavek na váš Durable Object. Každý Volání metody RPC na Stub Durable Objects je vlastní relací RPC, a proto jde o jeden účtovaný požadavek.
Volání metod RPC mohou vracet objekty (stuby) rozšiřující RpcTarget a volejte metody na těchto stub objektech. Následná volání na vráceném stub objektu jsou součástí stejné relace RPC a neúčtují se jako samostatné požadavky. Například:
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 request2 Pro vytvoření připojení WebSocket je potřeba požadavek. Za odchozí zprávy WebSocket se neúčtuje nic, stejně tak za příchozí Pingy protokolu WebSocket ↗. Pro účely fakturace výpočetních požadavků se na příchozí zprávy WebSocket uplatňuje poměr 20:1, který zohledňuje menší velikost zpráv při komunikaci v reálném čase. Například 100 příchozích zpráv WebSocket by se pro účely fakturace počítalo jako 5 požadavků. Poměr 20:1 neovlivňuje metriky a analytiku Durable Object, které odrážejí skutečné využití.
3 Automatické odpovědi na úrovni aplikace zpracovává state.setWebSocketAutoResponse() nezaberou žádný další reálný čas, a proto se za ně neúčtuje nic navíc.
4 Doba běhu se účtuje ve skutečném čase (wall clock), dokud je objekt aktivní a nesplňuje podmínky pro hibernaci, ale je sdílena mezi všemi požadavky aktivními na objektu současně. Volání accept() na WebSocketu v objektu bude účtovat poplatky za dobu trvání po celou dobu připojení WebSocketu. Doporučujeme použít WebSocket Hibernation API, aby se po dokončení všech obslužných rutin událostí neúčtovaly poplatky za dobu trvání. Úplné vysvětlení najdete v Kdy se Durable Objectu účtují poplatky za dobu běhu?.
5 Účtování za dobu běhu zohledňuje 128 MB paměti alokované pro váš Durable Object bez ohledu na skutečné využití. Pokud váš účet vytváří mnoho instancí jedné třídy Durable Object, mohou Durable Objects běžet ve stejném isolate na stejném fyzickém stroji a sdílet 128 MB paměti. I tak jsou tyto Durable Objects účtovány, jako by měly alokováno plných 128 MB paměti.
Fakturace úložiště
Durable Objects Storage API je přístupné pouze zevnitř Durable Objects. Cena závisí na úložném backendu vašich Durable Objects.
- Durable Objects s podporou SQLite (doporučeno): Backend úložiště SQLite se doporučuje pro všechny nové třídy Durable Object. Plán Workers Free umí vytvářet a přistupovat pouze k Durable Objects založeným na SQLite.
- Durable Objects podložené úložištěm klíč-hodnota: Backend úložiště klíč-hodnota je dostupné pouze v plánu Workers Paid.
Backend úložiště SQLite
| plán Workers Free | plán Workers Paid | |
|---|---|---|
| Přečtené řádky 1,2 | 5 milionů / den | Prvních 25 miliard / měsíc zahrnuto + $0.001 / milion řádků |
| Zapsané řádky 1,2,3,4 | 100,000 / den | Prvních 50 milionů / měsíc zahrnuto + $1.00 / milion řádků |
| Uložená data SQL 5 | 5 GB (celkem) | 5 GB-měsíc, + $0.20/ GB-měsíc |
Poznámky pod čarou
1 Zahrnuté limity a sazby pro počty přečtených a zapsaných řádků odpovídají Ceny D1, serverless SQL databáze od Cloudflare.
2 Metody typu klíč-hodnota, jako je get(), put(), delete(), nebo list() ukládají a dotazují data ve skryté tabulce SQLite a účtují se jako přečtené a zapsané řádky.
3 Každý setAlarm() je účtován jako jeden zapsaný řádek.
4 Smazání se počítají jako zapsané řádky.
5 Durable Objects budou účtovány za uložená data až do data jsou odstraněna. Jakmile jsou data odstraněna, objekt systém automaticky vyčistí.
Backend úložiště klíč-hodnota
| plán Workers Paid | |
|---|---|
| Jednotky read request1,2 | 1 milion, + $0.20/milion |
| Jednotky zápisových požadavků3 | 1 milion, + $1.00/milion |
| Odstranit požadavky4 | 1 milion, + $1.00/milion |
| Uložená data5 | 1 GB, + $0.20/ GB-month |
Poznámky pod čarou
1 Jednotka požadavku je definována jako 4 KB přečtených nebo zapsaných dat. Požadavek, který zapisuje nebo čte více než 4 KB, spotřebuje více jednotek, například zápis 9 KB spotřebuje 3 jednotky zápisových požadavků.
2 Operace list se účtují v jednotkách read request na základě množství prohledaných dat. Například požadavek list, který vrátí celkem 80 KB klíčů a hodnot, bude účtován jako 20 jednotek read request. Požadavek list, který nevrátí nic, je účtován jako 1 jednotka read request.
3 Každý setAlarm je účtován jako jedna jednotka zapisovacího požadavku.
4 Požadavky na smazání se neúčtují podle objemu dat. Například smazání hodnoty o velikosti 100 KB bude účtováno jako jeden požadavek na smazání.
5 Durable Objects budou účtovány za uložená data, dokud nejsou data odstraněna. Jakmile jsou data odstraněna, objekt systém automaticky vyčistí.
Požadavky, které zasáhnou Paměťová mezipaměť Durable Objects nebo které používají víceklíčové verze get()/put()/delete() metody se účtují stejně, jako by šlo o běžný, samostatný požadavek pro každý klíč.
Příklady účtování za výpočetní výkon
Tyto příklady nezahrnují náklady na Workery, které Durable Objects volají. Při modelování nákladů na Durable Object mějte na paměti, že:
- Neaktivní objekty, které nepřijímají žádné požadavky, negenerují žádné poplatky za dobu trvání.
- WebSocket Hibernation API může výrazně snížit poplatky související s dobou trvání u Durable Objects, které komunikují s klienty prostřednictvím protokolu WebSocket, zejména pokud se zprávy přenášejí jen občas v řídkých intervalech.
- Aktivní odchozí připojení (přes
connect()nebo odchozí WebSocket) udržuje Durable Object v paměti a způsobuje, že se mu za každé připojení účtuje doba trvání až po dobu 15 minut, i bez příchozích požadavků. Více informací najdete v Životní cyklus Durable Object s dalšími informacemi.
- Aktivní odchozí připojení (přes
Příklad 1
Tento příklad představuje jednoduchý Durable Object použitý jako koordinační služba volaná přes HTTP.
- Jeden Durable Object byl Workerem volán 1.5 milionkrát
- Je aktivní 1,000,000 sekund v daném měsíci
V tomto scénáři by se odhadované měsíční náklady vypočítaly takto:
Požadavky:
- 1.5 milionu požadavků - zahrnutý 1 milion požadavků = 500,000 fakturovatelných požadavků.
- (zaokrouhleno) 1,000,000 požadavků x $0.15 / 1,000,000 = $0.15.
Compute Duration:
- 1,000,000 sekund * 128 MB / 1 GB = 128,000 GB-s.
- 128,000 GB-s se vejde do zahrnuté alokace 400,000 GB-s = $0.00.
Odhadovaný celkový součet: $0.15 (požadavky) + $0.00 (doba výpočtu) + minimální využití $5/měsíc = $5.15 za měsíc
Příklad 2
Tento příklad představuje středně vytíženou aplikaci založenou na Durable Objects, která pomocí WebSockets šíří stav hry, chatu nebo uživatele v reálném čase mezi připojenými klienty:
- 100 Durable Objects má ke každému z nich navázáno 50 WebSocket spojení.
- Klienti posílají přibližně jednu zprávu za minutu po dobu osmi aktivních hodin denně, každý den v měsíci.
V tomto scénáři by se odhadované měsíční náklady vypočítaly takto:
Požadavky:
- 50 WebSocket připojení * 100 Durable Objects pro navázání WebSocketů = 5,000 připojení vytvořených každý den * 30 dní = 150,000 požadavků na WebSocket připojení.
- 50 zpráv za minutu * 100 Durable Objects * 60 minut * 8 hodin * 30 dní = 72,000,000 požadavků na zprávy WebSocket.
- 150,000 + (72 milionů požadavků / 20 pro poměr fakturace WebSocket zpráv) = 3.75 milionu fakturovaných požadavků.
- 3.75 milionu požadavků - zahrnutý 1 milion požadavků = 2,750,000 fakturovatelných požadavků.
- (zaokrouhleno) 3,000,000 požadavků x $0.15 / 1,000,000 = $0.45.
Compute Duration:
- 100 Durable Objects * 60 sekund * 60 minut * 8 hodin * 30 dní = 86,400,000 sekund.
- 86,400,000 sekund * 128 MB / 1 GB = 11,059,200 GB-s.
- 11,059,200 GB-s - zahrnuto 400,000 GB-s = 10,659,200 GB-s
- (zaokrouhleno) 11,000,000 GB-s x $12.50 / 1,000,000 = $137.50.
Odhadovaný celkový součet: $0.45 (požadavky) + $137.50 (doba výpočtu) + minimální využití $5/měsíc = $142.95 za měsíc.
Příklad 3
Tento příklad představuje horizontálně škálovanou aplikaci založenou na Durable Objects, která pomocí WebSockets předává stav specifický pro uživatele jedinému klientovi připojenému ke každému Durable Object.
- Každý ze 100 Durable Objects má k sobě navázáno jedno WebSocket spojení.
- Klienti posílali jednu zprávu každou sekundu v měsíci, takže Durable Objects byly aktivní po celý měsíc.
V tomto scénáři by se odhadované měsíční náklady vypočítaly takto:
Požadavky:
- 100 požadavků na WebSocket spojení.
- 1 zpráva za sekundu * 100 spojení * 60 sekund * 60 minut * 24 hodin * 30 dní = 259,200,000 požadavků na zprávy WebSocket.
- 100 + (259.2 milionu požadavků / 20 pro poměr fakturace WebSocket) = 12,960,100 požadavků.
- 12,960,100 požadavků - zahrnutý 1 milion požadavků = 11,960,100 fakturovatelných požadavků.
- (zaokrouhleno) 12,000,000 požadavků x $0.15 / 1,000,000 = $1.80.
Compute Duration:
- 100 Durable Objects * 60 sekund * 60 minut * 24 hodin * 30 dní = 259,200,000 sekund
- 259,200,000 sekund * 128 MB / 1 GB = 33,177,600 GB-s
- 33,177,600 GB-s - zahrnuto 400,000 GB-s = 32,777,600 GB-s
- (zaokrouhleno) 33,000,000 GB-s x $12.50 / 1,000,000 = $412.50
Odhadovaný celkový součet: $1.80 (požadavky) + $412.50 (doba výpočtu) + minimální využití $5/měsíc = $419.30 za měsíc
Příklad 4
Tento příklad představuje středně vytíženou aplikaci založenou na Durable Objects, která pomocí WebSocket Hibernation šíří stav hry, chatu nebo uživatele v reálném čase mezi připojenými klienty:
- Každý ze 100 Durable Objects má k sobě navázáno 100 spojení Hibernatable WebSocket.
- Klienti posílají jednu zprávu za minutu a zpracování jedné zprávy trvá 10 ms v
webSocketMessage()handler. Jelikož každý Durable Object obsluhuje 100 WebSocketů, bude každý Durable Object celkově aktivně vykonávat JS 1 sekundu za minutu (100 WebSockets * 10ms).
V tomto scénáři by se odhadované měsíční náklady vypočítaly takto:
Požadavky:
- 100 WebSocket spojení * 100 Durable Objects pro navázání WebSocketů = 10,000 počátečních požadavků na WebSocket spojení.
- 100 zpráv za minutu1 * 100 Durable Objects * 60 minut * 24 hodin * 30 dní = 432,000,000 požadavků.
- 10,000 + (432 milionů požadavků / 20 pro poměr fakturace WebSocket) = 21,610,000 milionů požadavků.
- 21,610,000 požadavků - zahrnutý 1 milion požadavků = 20,610,000 fakturovatelných požadavků.
- (zaokrouhleno) 21,000,000 požadavků x $0.15 / 1,000,000 = $3.15.
Compute Duration:
- 100 Durable Objects * 1 sekunda2 * 60 minut * 24 hodin * 30 dní = 4,320,000 sekund
- 4,320,000 sekund * 128 MB / 1 GB = 552,960 GB-s
- 552,960 GB-s - zahrnuto 400,000 GB-s = 152,960 GB-s
- (zaokrouhleno) 1,000,000 GB-s x $12.50 / 1,000,000 = $12.50
Odhadovaný celkový součet: $3.15 (požadavky) + $12.50 (doba výpočtu) + minimální využití $5/měsíc = $20.65 za měsíc
1 100 zpráv za minutu vychází z toho, že ke každému DO se připojí 100 klientů a každý odesílá 1 zprávu za minutu.
2 Příklad používá 1 sekundu, protože každý Durable Object je aktivní 1 sekundu za minutu. Dá se to také chápat jako 432 milionů požadavků, z nichž každý trvá 10 ms (4,320,000 sekund).
Často kladené dotazy
Kdy se Durable Objectu účtují poplatky za dobu běhu?
Durable Object účtuje poplatky za dobu trvání, když aktivně vykonává JavaScript, tedy zpracovává požadavek nebo spouští obslužné rutiny událostí, nebo když je nečinný, ale nesplňuje podmínky pro hibernaci. Neaktivní Durable Object, který splňuje podmínky pro hibernaci, neúčtuje poplatky za dobu běhu, a to ani v krátkém okně předtím, než ho runtime hibernuje.
Jakmile je objekt vyřazen z paměti, při příštím použití se znovu vytvoří opětovným zavoláním konstruktoru.
Existuje několik faktorů, které mohou Durable Object zabránit v hibernaci a způsobit, že mu budou nadále účtovány poplatky za dobu běhu.
Další informace najdete v Životní cyklus Durable Object.
Přispívá prázdná tabulka nebo databáze SQLite k mému úložišti?
Ano, i když minimální. Prázdné tabulky mohou zabírat alespoň několik kilobajtů v závislosti na počtu sloupců (šířce tabulky). Prázdná databáze SQLite zabírá přibližně 12 KB úložiště.
Počítají se metadata uložená v Durable Objects do mého úložiště?
Každý zápis do Durable Object založeného na SQLite ukládá do interních tabulek Durable Object nepatrné množství metadat, které se započítává do vašeho zpoplatněného úložiště.
Metadata zůstávají v Durable Object, dokud nezavoláte deleteAll().