Однако режимом Aurabase по умолчанию остается Deno (также и изоляты V8), как описано в Rust coreAurabase. «Пограничные функции в Rust» охватывают три разные реальности в зависимости от платформы: SDK сообщества на стороне Cloudflare, отсутствие официального маршрута на стороне Vercel, собственный режим выполнения с собственным CLI на стороне Aurabase. Это сравнение детализирует три архитектуры, не смешивая то, что проверено, и то, что остается целью платформы.
Самое необходимое
- Aurabase предлагает две среды выполнения Edge Functions:
deno(изолированные версии V8, выделенный сервис, режим по умолчанию) иwasm(скомпилированный Rust, запускается через Wasmtime). - Cloudflare Workers работает на изолированных версиях V8 и может дополнительно запускать WebAssembly, в частности, через SDK сообщества
workers-rs. Это не специализированная среда выполнения Rust, такая как режимwasmв Aurabase. - Vercel Edge Functions использует Edge Runtime, подмножество Node.js API на изолированной версии V8: нет официального SDK или CLI для написания самой функции на Rust.
- Режим
wasmAurabase изолирует каждое выполнение с помощью бюджета ЦП Wasmtime, ограничения выделенной памяти и тайм-аута на эпоху, но в настоящее время не предоставляет гостевому модулю исходящий сетевой доступ. - Три разные архитектуры для одной цели: быстро начать и изолировать каждое выполнение без затрат на полный контейнер.
Изолирующие устройства V8 и модули WASM: две механики песочницы
Изолят V8 — это облегченный контекст выполнения JavaScript внутри того же движка V8: никаких новых системных процессов и нового ядра для запуска. Это механизм, который Cloudflare впервые опубликовал для Workers и который Vercel повторно использует в своей Edge Runtime. Цель одна и та же с обеих сторон: избежать затрат на контейнер или виртуальную машину для каждого запроса.
Модуль WebAssembly удовлетворяет ту же потребность посредством другого механизма. Байт-код WASM выполняется в ограниченной линейной памяти, определенной самой спецификацией. Гостевой модуль не может обращаться за пределами этой области, независимо от исходного языка (Rust, C, Go…), на котором создан двоичный файл. Именно эту модель Wasmtime применяет в режиме wasm Aurabase, подробно описанном ниже. Измерения запуска между двумя механиками см. в нашем файле в тестах холодного запуска WebAssembly.
Какой режим Aurabase Wasm работает в рабочей среде
Каждая функция Aurabase содержит поле runtime, значение которого равно "wasm" или "deno". Механизм вызова соответственно выбирает путь выполнения:
Песочница опирается на три механизма Wasmtime. Бюджет ЦП учитывается в «топливе»: его потребляет каждая инструкция WASM. Тайм-аут применяется с шагом в эпоху: выделенный поток увеличивает часы Wasmtime после настроенной задержки, что прерывает текущее выполнение. Ограничение памяти, установленное через StoreLimits. Три терминала настраиваются при создании экземпляра механизма:
Скомпилированный модуль кэшируется code_hash: один и тот же развернутый двоичный файл не перекомпилируется при каждом вызове. Тем не менее, каждый вызов создает новый экземпляр Store и экземпляр. Никакое состояние не перетекает от одного вызова к другому. Площадь поверхности, доступная для гостевого модуля, намеренно остается минимальной, всего пять хост-функций: aura.log, aura.get_input, aura.set_output, aura.get_env и заглушка env.abort для совместимости с AssemblyScript. В настоящее время никакие функции хоста не раскрывают исходящие сетевые вызовы.
Режим wasm теперь подходит для чистых вычислений: проверки, преобразования данных, оценки, анализа. Функция, которая должна вызывать сторонний API (платеж, электронная почта, внешний сервис), по-прежнему должна проходить через режим deno. Это режим по умолчанию для Aurabase и рекомендуемый режим для миграции существующего кода Deno.
На стороне развертывания CLI компилирует ваш крейт локально перед отправкой: aura functions new формирует крейт cdylib, aura functions deploy компилирует его, а затем отправляет.
Cloudflare Workers: изолирует V8, дополнительно используя WebAssembly.
Работники Cloudflare изначально запускают JavaScript и TypeScript в изолятах V8, распределенных по глобальной сети Cloudflare. WebAssembly был первоклассным гражданином с самого начала платформы: модуль .wasm можно импортировать непосредственно в Worker, как и любой другой модуль.
Чтобы полностью написать Worker на Rust, чаще всего используется SDK сообщества workers-rs, который компилирует код в wasm32-unknown-unknown и выполняет его во время выполнения Workers. Разница с режимом wasm Aurabase заключается в доступной площади поверхности. Worker, написанный на Rust с помощью этого SDK, работает в полной среде Workers и, следовательно, может вызывать fetch или другие привязки платформы. Режим wasm Aurabase начинается с намеренно уменьшенной площади хоста (предыдущий раздел).
Функции Vercel Edge: подмножество Node.js, официального пути Rust нет.
Edge Runtime от Vercel также запускает код в изолированных версиях V8 с подмножеством стандартных веб-API (fetch, Request/Response, crypto.subtle…), а не в полной среде Node.js. Нативным модулям Node и произвольным инструментам компиляции там не место.
Объект WebAssembly является частью этого подмножества: ничто не мешает вам загрузить двоичный файл .wasm и создать его экземпляр вручную с помощью функции JavaScript или TypeScript. Но, насколько нам известно, Vercel не публикует какой-либо официальный SDK или CLI для непосредственного написания Edge-функции на Rust, в отличие от workers-rs на стороне Cloudflare или aura functions deploy на стороне Aurabase. Этот путь остается возможным, но полностью вручную, без специальных инструментов.
Песочница: линейная память WASM и изоляция V8
Изолят V8 разделяет код, выполняемый выделенной кучей, и его собственный контекст в одном и том же процессе механизма. Это проверенный механизм, работающий в масштабе миллионов запросов в секунду в Cloudflare и Vercel, но он остается механизмом программной изоляции в рамках одного движка JavaScript.
Модель WASM изолирует по-другому: каждый экземпляр получает свою собственную линейную память, непрерывный буфер, доступ за пределы которого невозможен из-за конструкции самого двоичного формата, независимо от механизма, который его выполняет. В среде выполнения Aurabase каждая хост-функция, которая манипулирует указателем, предоставленным гостевым модулем (aura.log, aura.get_env…), явно перепроверяет границы перед любым доступом к памяти. Это дополнительная глубокая защита от вредоносного или ошибочного модуля.
Три архитектуры бок о бок
| Аурабаза (васм) | Рабочие Cloudflare | Функции Vercel Edge | |
|---|---|---|---|
| Модель исполнения | Собственный модуль WASM, Wasmtime | Изолируйте V8 + WASM как дополнительный модуль. | Изолировать V8, подмножество Node.js |
| Ржавчина на переднем плане | Да, выделенный режим + CLI | Через SDK сообщества (workers-rs) | Нет, официального маршрута нет. |
| Доступ к сети на выходе из модуля | Нет, проверено в коде (нет функции сетевого хоста) | Да, через полную рабочую среду | Да, стандартный API получения |
| Бюджет процессора | Время подачи топлива, настраивается | Ограничение времени ЦП на запрос (документ Cloudflare) | Ограничение продолжительности вызова (док. Версель) |
| Выделенное развертывание Rust | развертывание функций ауры (локальная сборка грузов) | спорщик + рабочие-rs | Нет официального эквивалентного инструмента |
Спецификации среды выполнения Aurabase. Столбцы Cloudflare и Vercel описаны на основе документированной общедоступной архитектуры каждой платформы (изолирует V8, WebAssembly в качестве цели сборки).
Какую среду выполнения выбрать в соответствии с вашей функцией
Чистый расчет, без сетевых вызовов: проверка схемы, преобразование данных, оценка, упрощенное создание изображений. Режим wasm Aurabase подходит напрямую, со строгой песочницей памяти, явным бюджетом ЦП и без зависимости от внешнего сервиса.
Функция, вызывающая сторонний API (платеж, электронная почта, исходящий вебхук). Режим deno Aurabase сегодня остается выбором по умолчанию, точно так же, как классический Cloudflare Worker или функция Vercel Edge изначально полагаются на fetch.
Команда уже инвестировала в экосистему Cloudflare (KV, Durable Objects, R2). Оставаться на Workers имеет смысл; workers-rs позволяет внедрять Rust постепенно, не меняя платформы.
Нужна встроенная среда выполнения Rust, управляемая от начала до конца, с выделенным интерфейсом командной строки и тем же языком, что и остальная часть серверной части. Это точка зрения, которую документирует в нашем сравнении Wasmtime и Wasmerпо выбору самого движка WebAssembly.