Construyendo runtimes serverless modernos

Descubre cómo los runtimes serverless modernos, construidos con Rust y V8 isolates, superan a Node.js en desempeño y seguridad, ofreciendo tiempos de ejecución más rápidos y una mayor protección de la memoria a través de una arquitectura de memoria segura.

Guilherme Oliveira - Dev Writer

La serverless computing ha cambiado la forma en que los desarrolladores construyen y despliegan aplicaciones, priorizando la escalabilidad y la facilidad de uso. Sin embargo, la creciente demanda de un desempeño más rápido, seguridad robusta y optimización en el uso de recursos requiere enfoques innovadores para los entornos de ejecución. Estos entornos deben manejar cargas de trabajo con precisión y garantizar una integración sin problemas con los requisitos de la edge computing.

Al combinar las características de seguridad de Rust con la versatilidad del V8 engine, las arquitecturas de ejecución modernas están creando entornos de ejecución eficientes y seguros, adecuados para edge computing.

Core runtime environment

El core runtime environment sirve como la columna vertebral de la plataforma serverless, gestionando la ejecución del código dentro de contextos seguros y contenidos. La característica Isolate del V8 engine crea instancias independientes, cada una proporcionando un entorno separado para ejecutar código JavaScript. Cada instancia ofrece un contexto aislado con sus propias variables globales y funciones. Este diseño asegura que las funciones se ejecuten en entornos estrictamente separados, evitando interacciones no deseadas entre diferentes ejecuciones.

Integración del V8 engine

La integración del V8 engine en runtimes serverless basados en Rust mejora el desempeño y la flexibilidad. El V8 engine de Google emplea compilación just-in-time (JIT) para transformar JavaScript en código de máquina optimizado, logrando velocidades de ejecución similares a las nativas. A través de bindings de Rust como Rusty V8, los desarrolladores pueden ejecutar JavaScript dentro de entornos Rust, lo que permite runtimes personalizados que combinan las fortalezas de ambas tecnologías para plataformas serverless eficientes y escalables.

¿Por qué elegir Rust para el desarrollo de runtimes?

Rust es la opción ideal para construir un entorno de ejecución moderno debido a su combinación de seguridad y desempeño. Sus principios de diseño y la estricta aplicación del compilador permiten a los desarrolladores crear entornos de ejecución que se mantienen seguros, rápidos y confiables a gran escala. Estas características fundamentales hacen que Rust sea particularmente adecuado para el desarrollo de runtimes:

  • Garantías de seguridad de memoria sin sobrecarga en tiempo de ejecución.
  • Abstracciones de costo cero para un desempeño óptimo.
  • Características de desempeño predecibles.
  • Seguridad en threads por diseño.
  • Comprobación de errores en tiempo de compilación.

Gestión de memoria

El runtime aprovecha el modelo de propiedad de Rust para mejorar la eficiencia de la memoria en sus componentes principales. Mientras que Rust garantiza la propiedad única y previene las condiciones de carrera en el código nativo, el runtime de JavaScript V8 emplea su sistema de garbage collection para gestionar los objetos de JavaScript. Una interacción bien estructurada entre Rust y V8 combina lo mejor de ambos mundos: las garantías de seguridad de memoria de Rust y la gestión de memoria de V8.

La combinación de las verificaciones en tiempo de compilación de Rust y el sistema de garbage collection de V8 ofrece una gestión de memoria robusta y eficiente. Cuando se implementa correctamente, la interfaz Rust-V8 proporciona un manejo óptimo de memoria en entornos de producción, ofreciendo ventajas significativas sobre los enfoques tradicionales.

Capa de seguridad

La capa de seguridad es crucial para mantener la integridad y la seguridad del entorno serverless. Emplea varios mecanismos para garantizar que la ejecución del código se mantenga segura y aislada:

  • Aislamiento a nivel de proceso mediante V8 isolates: los V8 isolates proporcionan un aislamiento ligero ejecutando el código en instancias separadas, lo que permite un cambio rápido de contexto y un manejo eficiente de funciones concurrentes.
  • Separación del espacio de memoria entre ejecuciones: cada V8 isolate mantiene su propio espacio de memoria, evitando que las funciones accedan a la memoria de otras y manteniendo la privacidad de los datos en entornos multi-tenant.

Al integrar estas características, la arquitectura del runtime equilibra el desempeño y la seguridad, proporcionando una base sólida para ejecutar funciones serverless en el edge.

Mejoras de desempeño

Las mejoras de desempeño son notables al comparar las plataformas serverless tradicionales con los runtimes modernos de edge. Estos avances provienen de innovaciones arquitectónicas que priorizan la ejecución ligera y la eficiencia en el uso de recursos. La tabla a continuación destaca métricas clave que muestran las diferencias entre las soluciones serverless tradicionales y los runtimes de edge construidos con Rust y V8. Cada métrica refleja mejoras en velocidad, consumo de memoria y eficiencia operativa, que son críticas para aplicaciones de alto desemepeño a gran escala.

MétricaServerless tradicionalRuntime de edge moderno
Cold start100ms - 1+s~5-20ms
Uso de memoria128MB+~10MB
InicializaciónArranque de contenedorActivación de sandbox

El desempeño superior de los runtimes de edge proviene de los V8 isolates, que separan solo el contexto de ejecución en lugar de contenedores completos, lo que permite tiempos de inicio rápidos y un alto desempeño. Esta arquitectura, combinada con la eficiencia de Rust, ofrece latencia consistentemente más baja y mejor utilización de recursos que los enfoques tradicionales de serverless.

¿Por qué no Node.js?

Al usar V8 y Rust, es posible abordar algunos de los defectos inherentes en Node.js desde su inicio. Ryan Dahl, el creador original de Node.js, ha discutido ampliamente estos problemas, citando la gestión de módulos como uno de sus defectos de diseño. Sin embargo, el inconveniente más prominente de Node.js es su falta de soporte nativo para multi-tenancy, que solo se puede lograr mediante contenedores, lo que lleva a los cold starts. Además, Node.js fue construido con C++, un lenguaje que carece de seguridad de memoria y es generalmente menos estable que Rust. Al construir una solución con Rust y V8 isolate, se obtiene una aplicación más estable y segura.

El multi-tenancy es esencial para la computación serverless porque permite que múltiples usuarios o funciones compartan la misma infraestructura de manera eficiente, reduciendo costos y desperdicio de recursos. Dado que Node.js no fue diseñado con multi-tenancy en mente, cada ejecución de función requiere aislamiento para evitar conflictos o riesgos de seguridad entre diferentes cargas de trabajo. La containerización proporciona este aislamiento al encapsular cada función en un entorno separado con sus propias dependencias y runtime. Aunque este enfoque hace cumplir efectivamente el multi-tenancy, tiene un costo: la sobrecarga de inicializar y ejecutar contenedores contribuye a los tiempos de inicio lentos, comúnmente conocidos como cold starts.

El proceso de containerización involucra múltiples pasos que acumulan una latencia significativa. Primero, el runtime del contenedor debe obtener la imagen requerida, que puede incluir un sistema operativo completo, bibliotecas y dependencias. Luego, el contenedor debe ser instanciado, lo que requiere la asignación de recursos, la configuración del sistema de archivos y, a veces, incluso la configuración de la red. Finalmente, el runtime carga el código de la aplicación y lo ejecuta. Estos pasos secuenciales introducen retrasos inevitables.

En contraste, los V8 isolates ofrecen un enfoque mucho más ligero. En lugar de crear contenedores separados, los V8 isolates crean contextos de ejecución ligeros dentro del mismo proceso, proporcionando ejecución rápida de funciones sin la necesidad de virtualización a nivel de sistema. Esto reduce drásticamente el tiempo de cold start, lo que hace que las soluciones basadas en V8 sean ideales para entornos serverless de alto desempeño.

Impacto en el mundo real

Azion Cells es un runtime que demuestra los beneficios de los modernos entornos de ejecución edge construidos con Rust. A diferencia del enfoque basado en contenedores centralizados de AWS Lambda, Azion Cells elimina la sobrecarga de inicialización de contenedores, reduciendo significativamente los cold starts, el consumo de memoria y los costos. Ejecutar en la mejor edge location para el usuario y ejecutar funciones desde almacenamiento NVMe asegura una latencia mínima para aplicaciones modernas.

Características clave de la arquitectura de runtime de Azion

  • Aislamiento seguro multi-tenant: Azion Cells aísla funciones en entornos aislados, garantizando una ejecución segura sin la sobrecarga de contenedores completos. Este enfoque mejora tanto el desempeño como la seguridad, lo que lo hace ideal para aplicaciones multi-tenant.
  • Tiempos de inicio rápidos: las edge functions se ejecutan significativamente más rápido debido a su arquitectura de runtime ligera. Esto minimiza efectivamente los cold starts y garantiza un rendimiento confiable incluso durante picos repentinos de tráfico.
  • Utilización eficiente de recursos: al aprovechar la seguridad de memoria de Rust y las abstracciones de bajo costo de sobrecarga, Azion optimiza el uso de recursos, reduciendo costos y mejorando la escalabilidad.
  • Reducción de latencia: Azion Cells opera directamente en el edge de la red, lo que significa procesar la solicitud en la mejor edge location disponible más cercana al usuario final.

Este enfoque desafía el modelo tradicional serverless, convirtiendo la edge computing en una solución más viable y rentable para aplicaciones modernas. Al combinar la eficiencia de Rust y velocidades de ejecución similares a las nativas de la integración de V8, la edge computing puede lograr el desempeño y la escalabilidad requeridos para aplicaciones serverless modernas. Para simplificar el proceso de adopción, Azion creó un bundler que automatiza los polyfills.

mantente actualizado

Suscríbete a nuestro boletín informativo

Recibe las últimas actualizaciones de productos, destacados de eventos y conocimientos de la industria tecnológica directamente en tu bandeja de entrada.