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

Как работает Workers

Хотя Cloudflare Workers ведут себя похоже на JavaScript в браузере или в Node.js, есть несколько отличий в том, как следует подходить к написанию кода. Под капотом среда выполнения Workers использует движок V8 : тот же движок, что используется в Chromium и Node.js. Среда выполнения Workers также реализует многие стандартные API доступен в большинстве современных браузеров.

Различия между JavaScript, написанным для браузера или для Node.js, проявляются во время выполнения. Вместо запуска на компьютере пользователя (например, браузерное приложение или централизованный сервер), функции Workers выполняются на глобальная сеть Cloudflare - постоянно растущая глобальная сеть из тысяч машин, распределённых по сотням локаций.

На каждой из этих машин размещён экземпляр среды выполнения Workers, и каждая такая среда способна запускать тысячи пользовательских приложений. В этом руководстве рассматриваются некоторые из этих различий.

Дополнительные сведения см. в статья блога Cloud Computing without Containers.

Три главных отличия: Isolates, Compute per Request и Distributed Execution.

Изоляты

V8 оркестрирует изоляты: лёгкие контексты, которые предоставляют вашему коду переменные, к которым он может обращаться, и безопасную среду для выполнения. Изолят можно даже считать песочницей для запуска вашей функции.

Один экземпляр runtime может выполнять сотни или тысячи изолятов и незаметно переключаться между ними. Память каждого изолята полностью изолирована, поэтому любой код защищён от другого недоверенного или пользовательского кода в этом runtime. Изоляты также спроектированы так, чтобы запускаться очень быстро: вместо создания виртуальной машины для каждой функции изолят создаётся внутри уже существующего окружения. Благодаря этому модель изолятов избавляет от холодных стартов, характерных для модели виртуальных машин.

В отличие от других serverless-провайдеров, использующих процессы в контейнерах в каждом из которых работает отдельный экземпляр среды выполнения языка, Workers несёт накладные расходы на JavaScript среду выполнения только один раз при старте контейнера. Процессы Workers способны выполнять практически неограниченное количество скриптов почти без дополнительных затрат на каждый из них. Любой изолят может запускаться примерно в сто раз быстрее, чем процесс Node в контейнере или виртуальной машине. При этом на старте изоляты потребляют на порядок меньше памяти.

Традиционная архитектура
Workers V8 isolates
Пользовательский код
Накладные расходы процесса

У каждого изолята есть своя область видимости, но изоляты не обязательно являются долгоживущими. Изолят может быть остановлен и вытеснен по ряду причин:

По этой причине не рекомендуется хранить изменяемое состояние в глобальной области видимости, если вы не учли эту особенность.

Если вам интересно, как Cloudflare обеспечивает безопасность среды выполнения Workers, вы можете узнать больше о том, как Isolates связаны с обеспечением безопасности и защитой от угроз Spectre.

Вычисления на запрос

Большинство Workers представляют собой вариацию стандартного процесса работы 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>;

Для Workers, написанных на синтаксис ES modules, когда запрос к вашему *.workers.dev поддомен или на ваш домен, управляемый Cloudflare, попадает в любой из дата-центров Cloudflare, запрос вызывает fetch() обработчик заданный в коде вашего Worker с указанным запросом. Вы можете ответить на запрос, вернув Response объект.

Распределённое выполнение

Изоляты устойчивы и остаются постоянно доступными на протяжении всего запроса, но в редких случаях они могут быть вытеснены. Когда Worker достигает официальных ограничения или когда ресурсы машины, на которой выполняется запрос, крайне ограничены, среда выполнения будет выборочно вытеснять изоляты после корректного завершения их событий.

Подобно всем другим платформам JavaScript, один экземпляр Workers может обрабатывать несколько запросов, включая параллельные, в однопоточном цикле событий. Это значит, что другие запросы могут (а могут и не) обрабатываться во время ожидания любого async задач (например, fetch) если во время обработки запроса поступают другие запросы. Поскольку нет гарантии, что два запроса пользователя будут направлены к одному и тому же или к разным экземплярам вашего Worker, Cloudflare рекомендует не использовать и не изменять глобальное состояние.