INTEGRITY Dokumentace

Jak Workers funguje

Ačkoli se Cloudflare Workers chovají podobně jako JavaScript v prohlížeči nebo v Node.js, existuje několik rozdílů v tom, jak musíte o svém kódu přemýšlet. Workers runtime pod kapotou používá V8 engine, the same engine used by Chromium and Node.js. The Workers runtime also implements many of the standard API dostupné ve většině moderních prohlížečů.

Rozdíly mezi JavaScriptem psaným pro prohlížeč nebo Node.js se projevují za běhu. Namísto spouštění na počítači jednotlivého uživatele (například prohlížečové aplikaci nebo na centralizovaném serveru), funkce Workers běží na Globální síť Cloudflare - rostoucí globální síť tisíců strojů rozmístěných na stovkách míst.

Na každém z těchto strojů běží instance Workers runtime a každá z těchto instancí dokáže spouštět tisíce uživatelsky definovaných aplikací. Tento průvodce popíše některé z těchto rozdílů.

Další informace naleznete v blogový příspěvek Cloud Computing without Containers.

Tři největší rozdíly jsou: Isolates, Compute per Request a Distributed Execution.

Isolates

V8 orchestruje izoláty: lehké kontexty, které vašemu kódu poskytují proměnné, k nimž má přístup, a bezpečné prostředí pro spuštění. Izolát můžete dokonce považovat za sandbox pro běh vaší funkce.

Jedna instance runtime dokáže spouštět stovky až tisíce izolátů a plynule mezi nimi přepínat. Paměť každého izolátu je zcela oddělená, takže je každý kus kódu chráněný před ostatním nedůvěryhodným nebo uživatelsky napsaným kódem v runtime. Izoláty jsou navíc navržené tak, aby se spouštěly velmi rychle. Místo vytváření virtuálního stroje pro každou funkci se izolát vytvoří uvnitř již existujícího prostředí. Tento model tak odstraňuje cold starty typické pro model virtuálních strojů.

Na rozdíl od jiných poskytovatelů serverless řešení, kteří používají kontejnerizované procesy přičemž každý spouští instanci běhového prostředí daného jazyka, Workers zaplatí režii JavaScript runtimu jen jednou při spuštění kontejneru. Procesy Workers dokážou spustit v podstatě neomezené množství skriptů s téměř nulovou individuální režií. Libovolný izolát se dokáže spustit přibližně stokrát rychleji než proces Node v kontejneru nebo virtuálním stroji. Izoláty navíc při startu spotřebují o řád méně paměti.

Tradiční architektura
Izoláty V8 ve Workers
Uživatelský kód
Režie procesu

Každý izolát má svůj vlastní rozsah, ale izoláty nemusí existovat dlouhodobě. Izolát může být z různých důvodů ukončen a odstraněn:

Z tohoto důvodu se obecně doporučuje neukládat měnitelný stav do globálního rozsahu, pokud jste s touto eventualitou předem nepočítali.

Pokud vás zajímá, jak Cloudflare řeší zabezpečení v runtime Workers, můžete přečtěte si více o tom, jak Isolates souvisejí se zabezpečením a zmírněním hrozby Spectre.

Compute per request

Většina Workers je variací na výchozí postup Workers:

export default {
	async fetch(request, env, ctx) {
		return new Response('Hello World!');
	},
};
export default {
	async fetch(request, env, ctx): Promise<Response> {
		return new Response('Hello World!');
	},
} satisfies ExportedHandler<Env>;

U Workers napsaných v syntaxe ES modulů, když požadavek na váš *.workers.dev subdoménu nebo na vaši doménu spravovanou Cloudflare přijme kterékoli datacentrum Cloudflare, request vyvolá fetch() handler definované ve vašem kódu Workeru s daným požadavkem. Na požadavek můžete odpovědět vrácením Response objekt.

Distribuované spouštění

Izoláty jsou odolné a po celou dobu trvání požadavku zůstávají dostupné, ve vzácných případech ale mohou být odstraněny. Když Worker narazí na oficiální limity nebo když jsou zdroje na počítači, na kterém požadavek běží, výjimečně omezené, runtime selektivně uvolní izoláty poté, co jsou jejich události řádně dokončeny.

Stejně jako u všech ostatních platforem JavaScript může jedna instance Workers zpracovávat více požadavků, včetně souběžných požadavků, v jednovláknové smyčce událostí. To znamená, že jiné požadavky mohou (ale nemusí) být zpracovány během čekání na async úlohy (například fetch) pokud v průběhu zpracování požadavku přijdou další požadavky. Protože není zaručeno, že dva požadavky uživatelů budou směrovány do stejné, nebo naopak do různých instancí vašeho Workeru, Cloudflare doporučuje globální stav nepoužívat ani neměnit.