Cloudflare позволяет своим клиентам запускать бессерверный код на периферийных устройствах по всему миру с невероятной скоростью и практически без задержки при запуске.
Они достигают этого с помощью своей архитектуры развёртывания на базе V8, в отличие от традиционного подхода с использованием контейнеров и Kubernetes.
Основная причина, по которой не используются контейнеры или виртуальные машины, заключается в том, что бессерверная архитектура обеспечивает задержку менее миллисекунды и поддерживает значительно большее количество арендаторов, которые могут выполнять свои рабочие нагрузки независимо, не разделяя память и состояние на периферии.
Мы знаем, что бессерверные инстансы запускаются для обработки запросов и останавливаются в режиме ожидания, чтобы сократить расходы. Это компромисс между задержкой и затратами на работу. Для запуска контейнера или виртуальной машины для обработки запроса требуется от 500 мс до 10 секунд, что приводит к непредсказуемому времени выполнения кода.
Архитектура Cloudflare V8 isolate, напротив, запускает функцию менее чем за 5 миллисекунд. Однако у этого подхода есть компромиссы, о которых я расскажу ниже.
Сначала углубимся в дизайн изолятов V8.
Архитектура изолятов Cloudflare V8
Архитектура изолятов V8 использует движок V8 (высокопроизводительный движок JavaScript и Web Assembly, изначально разработанный Google для Chrome) для запуска изолятов, которые представляют собой облегчённую изолированную среду для выполнения отдельных рабочих нагрузок.

Один экземпляр движка V8 может запускать несколько изолятов, выполняющих независимые рабочие нагрузки со строгой изоляцией кода. Код из одного изолята не может получить доступ к памяти или данным другого изолята.
Однако все эти изолирующие среды используют один и тот же процесс ОС, что делает их чрезвычайно лёгкими и быстрыми.
Изолят имеет собственный механизм для обеспечения безопасного доступа к памяти, что позволяет запускать ненадёжный код от множества разных клиентов/арендаторов в рамках одного экземпляра движка V8, запущенного процессом операционной системы.
Каждый изолят выполняет код в модели, управляемой событиями, которая подходит для задач, интенсивно использующих ввод-вывод.
Задержка холодного запуска при традиционных контейнерных бессерверных развертываниях
В традиционной бессерверной архитектуре каждый запрос к экземпляру функции запускает процесс контейнера, который содержит уровень операционной системы, зависимости приложения и код функции.
Инициализация контейнера занимает некоторое время, называемое задержкой холодного запуска, которая может составлять от сотен миллисекунд до нескольких секунд.
Кроме того, поскольку экземпляр функции в идеале работает в собственном процессе контейнера с изоляцией на уровне процесса, выполнение большого количества рабочих нагрузок клиентов-арендаторов, обслуживающих миллионы одновременных запросов, становится крайне ресурсозатратным.
В облачных средах изоляция виртуальной машины или процесса на уровне контейнера достигается идеально. Каждая рабочая нагрузка выполняется как отдельный контейнер или процесс виртуальной машины со своими собственными выделенными ресурсами, что снижает риск утечки данных и несанкционированного доступа.
Кроме того, если какой-то процесс упадет, это не повлияет на другие рабочие нагрузки, выполняемые на том же компьютере.
Изоляты V8
В отличие от развёртывания в контейнерах, при использовании изолятов, работающих в среде выполнения V8, время запуска изолята в среднем составляет менее миллисекунды, поскольку не требуется загрузка каких-либо контейнеров и процессов ОС.
Среда выполнения V8 уже запущена и создаёт изолированную среду за доли миллисекунд, когда требуется обработать запрос.
В этой архитектуре несколько изолятов могут работать в одном движке V8, требуя минимальных ресурсов. Это позволяет платформе размещать и запускать код для относительно большого количества пользователей на периферии, обеспечивая мгновенное масштабирование.
Кроме того, поскольку один процесс ОС может запускать сотни или тысячи изолятов, это позволяет избежать затрат на переключение контекста между процессами, связанными с развёртыванием на основе контейнеров.
Это крайне важно для Cloudflare, поскольку на каждом устройстве она выполняет тысячи рабочих нагрузок для клиентов и должна быстро переключаться между ними тысячи раз в секунду и с минимальными затратами.
Если бы эти рабочие нагрузки выполнялись в виде отдельных контейнерных процессов, то способность инфраструктуры поддерживать значительное количество клиентов значительно снизилась бы. Для разработки оптимизированного по ресурсам и масштабируемого подхода к развёртыванию, такого как изоляты V8, это ключевое требование.
Разбор пользовательского пространства и пространства ядра
Операционные системы делят память на пользовательское пространство и пространство ядра, чтобы отделить задачи приложений от основных системных задач. Контроль над тем, как приложения взаимодействуют с нижележащей ОС и аппаратными ресурсами, необходим для обеспечения безопасности и производительности.

Пространство ядра выполняет основные операции ОС с прямым и неограниченным доступом к аппаратным ресурсам, расположенным ниже. Эти операции включают обработку ввода-вывода, управление памятью, процессами, потоками и т. д.
Все пользовательские приложения, такие как браузеры, редакторы кода и т. д., работают в пользовательском пространстве и взаимодействуют с нижележащим оборудованием через пространство ядра. Код приложения, работающий в пользовательском пространстве, изолирован и должен запрашивать доступ к системным ресурсам и другим службам ядра с помощью системных вызовов, обращающихся к пространству ядра.
Разделение между пользовательским пространством и пространством ядра является основополагающим принципом проектирования операционных систем. Он обеспечивает безопасное, отказоустойчивое и эффективное выполнение операций.
Движок V8, изоляты и нижележащая операционная система
Механизм V8 работает в пользовательском пространстве и взаимодействует с ОС через пространство ядра с помощью системных вызовов. Он предоставляет песочницу для запуска кода JavaScript и WebAssembly.
Когда изоляты обрабатывают запросы в режиме асинхронного ввода-вывода с помощью цикла событий, бизнес-логика выполняется в пользовательском пространстве, а задачи ввода-вывода полагаются на ядро ОС для обработки нижележащих сетевых и других системных взаимодействий.
Каждый экземпляр движка V8 работает в пользовательском процессе с идентификатором процесса и границами памяти, установленными операционной системой. Это обеспечивает безопасную изолированную среду выполнения V8.
Память, выделенная экземпляру V8, распределяется между изолятами механизмом V8. По мере увеличения количества изолятов экземпляр движка V8 может запрашивать больше памяти у ОС.
Изоляты V8 обеспечивают строгую изоляцию на уровне арендатора. Несмотря на то, что технически они находятся в одном и том же выделенном ОС пространстве памяти внутри экземпляра движка V8, архитектура V8 гарантирует, что эти изоляты не будут обмениваться данными. V8 выделяет независимую логическую память для каждого изолята и обеспечивает на уровне изолята строгую изоляцию.
Данные каждого изолята (объекты, функции, замыкания и т. д.) хранятся в отдельной области памяти, управляемой движком V8. Кроме того, у каждого изолята есть свой отдельный процесс сборки мусора, защищающий строгую изоляцию.
Архитектурные ограничения изолятов V8
Архитектура изолятов — это хорошо продуманное решение для развёртывания многопользовательских рабочих нагрузок, чувствительных к задержкам. Однако она поддерживает только JavaScript и такие языки, как Go или Rust, код которых может быть скомпилирован в байт-код WebAssembly.
Другие бессерверные облачные решения, использующие контейнеры и виртуальные машины, поддерживают ряд языков программирования в зависимости от требований рабочей нагрузки.
Кроме того, контейнеры и виртуальные машины обеспечивают изоляцию на уровне процессов, что часто предпочтительно для корпоративных рабочих нагрузок со строгими стандартами безопасности и для соответствия требованиям, прежде всего в сфере финансов, государственного управления и здравоохранения, что при использовании изолятов невозможно.
Кроме того, изоляты не предназначены для ресурсоёмких и длительных задач. Они имеют строгие ограничения по памяти и вычислительным ресурсам, установленные платформой, и подходят для коротких ресурсоёмких операций, выполняемых на периферии.
Читайте также:
- Бесконечное количество репозиториев Git на Cloudflare Worker с быстрым развертыванием
- Загрузка файлов в хранилище Cloudflare R2: простое руководство
- Сообщество — лучший двигатель карьеры разработчика
Читайте нас в Telegram, VK и Дзен
Перевод статьи Shivang Sarawagi: Why doesn’t Cloudflare use containers in their Workers platform infrastructure?





