Una de las principales ventajas del modelo serverless es que elimina gran parte de la complejidad del desarrollo, lo que permite a los desarrolladores enfocarse en lo más importante: crear la mejor funcionalidad y experiencia de usuario. Sin embargo, en ciertas ocasiones, en Azion nos gusta compartir con nuestros lectores algunas de las técnicas que usamos entre bastidores para ofrecer el mejor desempeño, seguridad, rentabilidad y uso de recursos posibles. La más importante entre esas herramientas es V8 Engine de Google. V8 Engine está incorporado en nuestra tecnología principal, Azion Cells, que está por detrás de nuestro nuevo producto de computación serverless, llamado Edge Functions, que ahora es compatible con JavaScript.
Este artículo explicará que es V8, cómo funciona, las características que permiten su velocidad, seguridad y eficiencia, además de cómo V8 permite a Edge Functions de Azion llevar la computación serverless al edge de la red.
¿Qué es V8 JavaScript Engine?
V8 es un motor de código abierto de Google para JavaScript y WebAssembly. De acuerdo a su especificación, “V8 compila y ejecuta código fuente en JavaScript, administra la asignación de memoria para objetos y realiza garbage collect de objetos que ya no se necesitan”. Esto quiere decir que V8 traduce un código de JavaScript de alto nivel a un lenguaje de máquina o código máquina (code machine) de bajo nivel y luego lo ejecuta. Parte de compilar y ejecutar un código implica otras tareas como administrar la call stack (pila de llamadas), el memory heap, el caching (almacenamiento en caché) y la garbage collection, así como proporcionar tipos de datos, objetos y event loop (bucle de eventos). La orquestación de estas actividades de runtime I/O interno garantiza que la memoria y el código se ejecuten de manera eficiente.
¿Cómo funciona V8?
V8 Engine sigue varios pasos para compilar y ejecutar un código JavaScript. El código fuente es descargado de la red, del caché o de otros servicios de workers. Luego, este es analizado en una representación de sus diferentes componentes llamado Árbol de Sintaxis Abstracta (Abstract Syntax Tree, AST) y es alimentado al intérprete, que genera y optimiza el bytecode. El bytecode es un lenguaje de nivel inferior que los usados comúnmente, como JavaScript, lo que lo hace ejecutable por V8 Engine, pero no de tan bajo nivel como el código máquina.
Para ejecutar un código con velocidad y precisión, V8 Engine debe determinar si el bytecode debe ejecutarse en su forma original u optimizarse como un código máquina. Esta evaluación la realiza el administrador del perfil, que verifica el bytecode para ver si el compilador puede optimizarlo aún más como código máquina.. El compilador realiza optimizaciones durante el proceso y hace suposiciones basadas en el análisis de datos de perfil disponibles. Si alguna suposición es incorrecta, el código deja de ser optimizado y es convertido en bytecode antes de ser ejecutado. Una representación visual de este proceso es mostrada en el siguiente gráfico.
¿Qué hace a V8 rápido, eficiente y seguro?
Cuatro características que contribuyen al desempeño, la eficiencia y la seguridad de V8 son:
- garbage collection eficiente;
- uso de clases ocultas (hidden classes);
- inline caching (almacenamiento en caché en línea), y
- fine-grained sandboxing.
Garbage collection eficiente
Garbage collection es un proceso que recupera memoria al eliminar objetos que ya no son necesarios. Aunque esto optimiza el uso de memoria, puede ralentizar el procesamiento, ya que los procesos deben detenerse. Sin embargo, como fue explicado en la página de Chromium Project en GitHub, el garbage collector de V8 “minimiza el impacto de detener la aplicación” al procesar “solo una parte de los objetos en la mayoría de los ciclos de garbage collection”. Además, el garbage collector “siempre sabe dónde están los objetos y punteros en la memoria. Esto evita una identificación errónea de objetos como punteros, lo cual puede resultar en pérdidas de memoria”. El resultado es una rápida asignación de objetos, pausas breves por garbage collection y ninguna fragmentación de la memoria.
Clases ocultas e inline caching
Las clases ocultas y el inline caching aumentan la velocidad y eficiencia de recursos de V8. Debido a que JavaScript es un lenguaje dinámico, es difícil entender cuánta memoria y espacio se requiere para asignar objetos, ya que sus propiedades pueden cambiar durante el proceso de ejecución. Como resultado, la mayor parte de motores de JavaScript usan un almacenamiento similar a un diccionario para las propiedades de los objetos, donde cada acceso a una propiedad requiere una búsqueda dinámica para resolver la ubicación de la propiedad. Sin embargo, este proceso es lento y requiere mucha memoria. V8 hace que el acceso a la propiedad sea mucho más eficiente al crear dinámicamente clases ocultas que puedan ser reusadas. Esto no solo acelera el acceso a la propiedad al eliminar la necesidad de búsquedas en el diccionario, sino que también permite el inline caching.
El inline caching, como fue señalado en un artículo de GitHub en 2016, “toma una operación que usualmente requiere una gran cantidad de comprobaciones importantes y genera códigos especializados para escenarios conocidos específicos, donde el código especializado no contiene estas comprobaciones”. De esta manera, V8 es capaz de generar código máquina de forma rápida y eficiente.
Sandboxing
Tal vez la funcionalidad más importante de V8, como se usa en Edge Functions, es el uso del sandboxing. Sandboxing es un mecanismo de seguridad que aísla programas en diferentes entornos para evitar filtración de datos, así como reducir el impacto de las fallas del sistema y vulnerabilidades en el software. La API que permite incorporar V8 (V8 embedder) incluye una clase llamada isolates, la cual, cada una representa un entorno único de ejecución de JavaScript. Al usar V8 como nuestro motor de JavaScript para Edge Functions, Azion es capaz de mantener cada función segura y aislada de las otras, sin ejecutar cada función en diferentes máquinas virtuales (VM) o contenedores. Por lo tanto, se reduce considerablemente el uso de recursos y, como resultado, los costos y el tiempo necesarios para ejecutar cada función.
¿Cómo V8 habilita Edge Functions de Azion?
¿Cómo funciona la computación serverless?
Edge Functions es un producto que permite a los desarrolladores construir y ejecutar funciones serverless en la edge de la red de manera sencilla. Cuando las funciones son solicitadas, se ejecutan en el Edge Node más cercano al usuario y escalan automáticamente, sin necesidad de proveer o gestionar los recursos. Como resultado, los usuarios pagan únicamente por los recursos usados y se reduce considerablemente el tiempo empleado en tareas de configuración y gestión de enrutamiento.
No obstante, al combinar la facilidad de uso y la rentabilidad del modelo serverless con la velocidad de la edge computing se presentan muchos desafíos entre bastidores. La computación serverless hace posible una escalabilidad automática al atomizar las aplicaciones en tareas discretas que son pequeñas, independientes y sin estado (stateless). Debido a que el estado no es preservado entre invocaciones, las funciones pueden ser ejecutadas cuando sean necesarias y detenidas durante periodos de inactividad. Aunque el proceso de ejecutar y detener consume tiempo y recursos de computación, particularmente cuando las funciones son ejecutadas dentro de contenedores, como es el caso de AWS Lambda y soluciones serverless de proveedores de servicios en la nube.
¿Cómo V8 mejora la computación serverless?
Al elegir V8 como el motor de JavaScript para Edge Functions, Azion tiene la capacidad de ejecutar funciones en entornos multitenant, lo que ofrece mayor velocidad y eficiencia de recursos cuando se compara con AWS Lambda y otros productos tradicionales de computación serverless. La multitenancy reduce el consumo de recursos en dos formas. Primero, no existe la necesidad de particionar recursos como CPU, disco I/O, OS y memoria en contenedores separados, por lo que hay una menor exigencia de sobrecarga para ejecutar cada función. Además, cada función no requiere su propio runtime separado. Como resultado, los runtimes no necesitan ser detenidos o ejecutados entre cada invocación de una función, por lo que necesitan mucho menos poder de computación.
El uso eficiente de recursos no es sólo bueno para nuestro planeta, sino que también es bueno para las empresas que desean crear en Azion. Al eliminar la necesidad de ejecutar funciones en contenedores se requiere menor configuración, ya que las soluciones basadas en contenedores necesitan que los desarrolladores asignen una cierta cantidad de memoria a cada función por adelantado. Además, menor poder computacional significa menores costos operacionales.
Finalmente, y lo más importante para la edge computing, la ejecución de funciones en un entorno multitenant da como resultado una latencia más baja. Las funciones que son ejecutadas en contenedores se desactivan durante los periodos de inactividad, así que cuando la función es llamada nuevamente, su contenedor debe activarlo, lo que genera medio segundo de retraso, conocido como cold start. Al usar V8 en lugar de contenedores para aislar cada función, Azion elimina el cold start, lo que reduce la latencia y logra un desempeño más confiable y predecible.
Ejecutar miles de contenedores en edge locations distribuidos alrededor del mundo tendría un costo exorbitante. Por este motivo, las soluciones en la nube como AWS Lambda son suministradas desde data centers centralizados. Como un entorno de multitenancy permite un uso más eficiente de recursos, Azion es capaz de ejecutar fácilmente funciones en edge locations distribuidas alrededor del mundo, cuando y donde se necesiten más cerca del usuario final. Además, necesitar menos tiempo para transmitir datos de un lado al otro significa menor consumo de tiempo para ejecutar cada función, lo que resulta en menores costos de compute time (tiempo de cómputo) cada vez que una función es llamada.
Ventajas de Edge Functions
Con Edge Functions, los desarrolladores pueden crear y ejecutar aplicaciones edge-native que combinan el poder de la edge computing con los beneficios de serverless. Nuestra decisión de usar V8 como motor de JavaScript para Edge Functions significa que las empresas obtienen los mejores beneficios posibles:
- seguridad;
- velocidad;
- eficiencia de recursos;
- eficiencia de costos, y
- facilidad de uso.
Como resultado, Edge Functions es una solución ideal para una variedad de casos de uso, como:
- modernización de aplicaciones monolíticas de forma sencilla;
- construir de aplicaciones de latencia ultrabaja;
- programación basada en eventos,
- reducción de costos;
- adición de funcionalidades de terceros a las aplicaciones, así como
- mayor agilidad y aceleración del tiempo de comercialización.
Edge Functions está ahora disponible y es compatible con JavaScript para todos los usuarios de Azion. Para leer más acerca de Edge Functions, visita nuestra página de productos, o crea una cuenta gratuita como nuevo usuario de Azion.