автор Кентон Варда

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

Сегодня мы расширяем Cloudflare Workers поддержкой WebAssembly. Все клиенты Workers теперь могут дополнять свои приложения с помощью WASM без дополнительных затрат.

Что такое веб-сборка?

WebAssembly — часто сокращенно WASM — это технология, которая расширяет веб-платформу для поддержки компилируемых языков, таких как C, C++, Rust, Go и больше. Эти языки могут быть скомпилированы в специальный двоичный формат WASM, а затем загружены в браузер.

Код WASM надежно изолирован, как и JavaScript. Но поскольку он основан на скомпилированных языках более низкого уровня, он может быть намного быстрее для определенных видов ресурсоемких задач, где JavaScript не подходит. Помимо повышения производительности, WASM позволяет повторно использовать существующий код, написанный на языках, отличных от JavaScript.

Что такое рабочие?

Для тех, кто не знает: Cloudflare Workers позволяет развертывать бессерверный код JavaScript непосредственно в наших 153 центрах обработки данных, число которых постоянно растет. Ваш Worker обрабатывает HTTP-трафик вашего сайта непосредственно в месте, ближайшем к вашему конечному пользователю, что позволяет снизить задержку и снизить затраты на обслуживание. На прошлой неделе мы добавили хранилище в Workers, что позволило создавать приложения, полностью работающие на Cloudflare.

До сих пор Workers поддерживал только JavaScript. С добавлением WebAssembly теперь вы можете использовать широкий спектр языков и делать больше и быстрее. Как всегда, когда вы развертываете код в Cloudflare, он распространяется в каждую из наших локаций по всему миру менее чем за 30 секунд.

Когда использовать WebAssembly

Важно отметить, что WASM не всегда подходит для работы. Для легких задач, таких как перенаправление запроса на другой URL-адрес или проверка токена авторизации, придерживаться чистого JavaScript, вероятно, будет быстрее и проще, чем WASM. Программы WASM работают в своем собственном отдельном пространстве памяти, а это означает, что необходимо копировать данные в это пространство и из него, чтобы работать с ним. Код, который в основном взаимодействует с внешними объектами без какой-либо серьезной «арифметической обработки», скорее всего, не выиграет от WASM.

С другой стороны, WASM действительно хорош, когда вам нужно выполнить требовательную к ресурсам автономную операцию, такую ​​как изменение размера изображения или обработка аудиопотока. Эти операции требуют большого количества математических вычислений и тщательного управления памятью. Хотя такие задачи можно выполнять на чистом JavaScript — и такие движки, как V8, приложили немало усилий для оптимизации такого кода — в конце концов, ничто не сравнится с скомпилированным языком со статическими типами и явным выделением памяти.

Например, изображение ниже динамически изменяется с помощью Cloudflare Worker с использованием модуля WebAssembly для декодирования и изменения размера изображения. Кешируется только исходное изображение — изменение размера происходит на лету на нашем краю при перемещении ползунка. Найди код здесь.

Как использовать WebAssembly с Cloudflare Workers

WASM, используемый в Worker, должен быть развернут вместе с Worker. При редактировании скрипта в онлайн-редакторе Workers нажмите на вкладку «Ресурсы». Здесь вы можете добавить модуль WebAssembly.

Вам будет предложено загрузить файл модуля WASM и присвоить ему имя глобальной переменной. После загрузки ваш модуль будет отображаться как глобальная переменная типа WebAssembly.Module в вашем рабочем скрипте. Затем вы можете создать его следующим образом:

// Define imported functions that your WASM can call.
const imports = { exampleImport(a, b) { return a + b; } }

// Instantiate the module.
const instance = new WebAssembly.Instance(MY_WASM_MODULE, imports)

// Now you can call the functions that your WASM exports.
instance.exports.exampleExport(123);

Ознакомьтесь с Документацией MDN WebAssembly API для получения более подробной информации о создании экземпляров модулей WebAssembly.

Вы также можете загружать модули WebAssembly через наш API вместо онлайн-редактора.

Подробности смотрите в документации »

Создание модулей WASM

Сегодня создание модуля WebAssembly для Cloudflare — это несколько ручной процесс с использованием низкоуровневых инструментов. За подробностями обращайтесь к нашему демонстрационному репозиторию.

Теперь, когда базовая поддержка реализована, мы планируем работать с Emscripten и остальным сообществом WASM, чтобы убедиться, что создание WASM для Cloudflare Workers будет таким же простым, как и создание для веб-браузера. Следите за дальнейшими событиями.

Будущее

Мы в восторге от возможностей, которые открывает WebAssembly. Возможно, интегрировавшись с Cloudflare Spectrum, мы могли бы позволить существующему серверному коду C/C++ обрабатывать произвольные протоколы TCP и UDP на периферии, как своего рода массово распространяемый inetd. Возможно, игровые серверы могли бы уменьшить задержку, работая на Cloudflare как можно ближе к игроку. Возможно, с помощью некоторых графических процессоров и привязок OpenGL вы могли бы выполнять 3D-рендеринг и потоковую передачу в реальном времени прямо с периферии. Дайте нам знать, что вы хотели бы видеть »

Хотите помочь нам построить его? "Мы нанимаем!"

Первоначально опубликовано на сайте blog.cloudflare.com 1 октября 2018 г.