INTEGRITY Dokumentace

Životní cyklus Durable Object

Tato část popisuje životní cyklus Durable Object.

Chcete-li použít Durable Object, musíte vytvořit Durable Object Stub. Samotné vytvoření Durable Object Stub neodešle požadavek na Durable Object, a Durable Object proto ještě není instanciovaný. Požadavek se na Durable Object odešle a jeho životní cyklus začíná až ve chvíli, kdy se na Durable Object Stub zavolá nějaká metoda.

const stub = env.MY_DURABLE_OBJECT.getByName("foo");
// Now the request is sent to the remote Durable Object.
const rpcResponse = await stub.sayHello();

Přechody stavů v životním cyklu Durable Object

Durable Object se může v daný okamžik nacházet v jednom z následujících stavů:

Stav Popis
Aktivní, v paměti Durable Object běží v paměti a zpracovává příchozí požadavky.
Nečinný, v paměti, bez možnosti hibernace Durable Object čeká na další příchozí požadavek nebo událost, ale nesplňuje podmínky pro hibernaci.
Nečinný, v paměti, s možností hibernace Durable Object čeká na další příchozí požadavek nebo událost a splňuje podmínky pro hibernaci. O tom, kdy Durable Object hibernovat, rozhoduje runtime. V současnosti k tomu dochází po 10 sekundách nečinnosti v tomto stavu.
Hibernovaný Durable Object je odstraněn z paměti. Hibernovaná spojení WebSocket zůstávají připojená.
Neaktivní Durable Object je zcela odstraněn z hostitelského procesu a možná bude potřebovat cold start. Toto je počáteční stav všech Durable Objects.

Takto Durable Object přechází mezi jednotlivými stavy (každý stav je znázorněn v zaobleném obdélníku).

Životní cyklus Durable Object

Pokud Durable Object neběží, první příchozí požadavek nebo událost (například alarm) spustí constructor() třídy Durable Object a poté spustí příslušnou volanou funkci.

V tomto okamžiku je Durable Object ve stavu aktivní stav v paměti.

Jakmile jsou všechny příchozí požadavky nebo události zpracovány, Durable Object zůstává několik sekund nečinný v paměti, a to buď ve stavu umožňujícím hibernaci, nebo ve stavu, který ji neumožňuje.

K hibernaci může dojít pouze v případě, že all z níže uvedených podmínek platí:

Pokud po dobu 10 sekund nepřijde žádný požadavek ani událost a jsou splněny všechny výše uvedené podmínky, Durable Object přejde do stavu hibernován stav.

Pokud některá z výše uvedených podmínek neplatí, Durable Object zůstává v paměti, ve stavu nečinný, v paměti, bez možnosti hibernace stav.

V případě příchozího požadavku nebo události ve stavu hibernován stavu, constructor() se spustí znovu a Durable Object přejde do stavu aktivní, v paměti stavu a spustí volanou funkci.

Když se nacházíte v nečinný, v paměti, bez možnosti hibernace stavu, po 70-140 sekundách nečinnosti (bez příchozích požadavků nebo událostí) bude Durable Object zcela odstraněn z paměti a případně i z hostitele Cloudflare a přejde do stavu neaktivní stav.

Objekty v hibernován stavu si udržují připojené WebSocket klienty a runtime rozhoduje, zda a kdy objekt převede do stavu neaktivní stavu (například při rozhodnutí přesunout objekt na jiný host) a tím restartuje jeho životní cyklus.

Další příchozí požadavek nebo událost cyklus znovu spustí.

Chování při vypnutí

Durable Objects se občas vypnou a objekty se restartují, což spustí konstruktor vaší třídy Durable Object. Může k tomu dojít z různých důvodů, například:

Když dojde k vypnutí Durable Object, instance objektu se automaticky restartuje a nové požadavky se směrují na novou instanci. S požadavky, které se právě zpracovávají, se nakládá takto:

Je důležité zajistit, aby všechny služby využívající Durable Objects počítaly s tím, že Durable Object může být kdykoli ukončen.

Aktualizace kódu

Když aktualizujete kód Durable Object, váš Worker a Durable Objects se globálně nasadí eventuálně konzistentním způsobem. To způsobí vypnutí Durable Object s chováním popsaným výše. Aktualizace mohou také vést k situaci, kdy požadavek dorazí na novou verzi Workeru v jedné lokalitě, zatímco volání Durable Object jinde stále běží na předchozí verzi. Více informací naleznete v Aktualizace kódu kde najdete další informace o řešení tohoto scénáře.

Práce bez shutdown hooků

Durable Objects se mohou kdykoli vypnout kvůli nasazením, nečinnosti nebo rozhodnutím runtime. Namísto spoléhání na hooky při vypnutí (které nejsou k dispozici) navrhněte aplikaci tak, aby stav zapisovala postupně.

Shutdown hooky ani callbacky životního cyklu spouštěné před vypnutím nejsou k dispozici, protože Cloudflare nemůže zaručit jejich spuštění ve všech případech a externí software by se na tyto (nespolehlivé) mechanismy mohl příliš spoléhat.

Místo spoléhání na shutdown hooks můžete pravidelně zapisovat do úložiště a po výpadku se tak spolehlivě zotavit.

Pokud například zpracováváte datový proud a potřebujete si ukládat průběžný postup, zapisujte svou pozici do úložiště průběžně, místo abyste čekali s uložením až na konec:

// Good: Write progress as you go
async processData(data) {
  data.forEach(async (item, index) => {
    await this.processItem(item);
    // Save progress frequently
    await this.ctx.storage.put("lastProcessedIndex", index);
  });
}

I když to může působit neintuitivně, zápisy do úložiště Durable Object jsou rychlé a synchronní, takže stav můžete ukládat s minimálním dopadem na výkon.

Díky tomuto přístupu může váš Durable Object bezpečně pokračovat z libovolného bodu, i když se neočekávaně ukončí.