Video Summary and Transcription
Esta charla explora el uso de Rust y WebAssembly para mejorar el rendimiento de las aplicaciones Node.js. Al aprovechar la eficiencia y las características de seguridad de Rust, y compilarlo en bytecode de WebAssembly, los desarrolladores pueden lograr cálculos de alto rendimiento mientras garantizan la seguridad. WebAssembly permite la comunicación directa con el hardware nativo y está optimizado para aplicaciones en el lado del servidor, lo que lo hace adecuado para tareas como inferencia de IA y bases de datos de almacenamiento. En general, esta charla resalta el potencial de combinar JavaScript, Rust y WebAssembly para construir aplicaciones eficientes y portátiles.
1. Introducción a Node.js de alto rendimiento
Hola a todos. Soy Shivai Lamba. Hoy mi charla relámpago en el Congreso de Node.js 2022 trata sobre el alto rendimiento de Node.js impulsado por Rust y WebAssembly. La ley de Moore establece que el número de transistores en un microchip se duplica cada dos años. Para superar las limitaciones del hardware, debemos mejorar el rendimiento del software asegurando la seguridad. Rust es un lenguaje de programación seguro y moderno que ofrece eficiencia y rendimiento superior en comparación con Node.js. Podemos usar WebAssembly para compilar el código de Rust en bytecode y gestionarlo con una máquina virtual. WebAssembly proporciona seguridad, un tiempo de ejecución ligero y portátil, eficiencia extrema y seguridad en tiempo de ejecución. Esta charla se centra en el uso de JavaScript, Rust y WebAssembly para construir aplicaciones con el rendimiento de Rust y la seguridad y portabilidad de WebAssembly.
Hola a todos. Soy Shivai Lamba. Actualmente soy miembro del grupo de interés especial de TensorFlow.js y también soy miembro del grupo de trabajo de India. También soy mentor de TensorFlow, específicamente para TensorFlow.js. Y hoy mi charla relámpago en el Congreso de Node.js 2022 tratará sobre el alto rendimiento de Node.js impulsado por Rust y WebAssembly. Ahora, primero, hablemos brevemente sobre la ley de Moore. Todos saben que la ley de Moore establece que el número de transistores en un microchip se duplica cada dos años. Pero si observamos los últimos cinco años, la limitación de tamaño ha limitado la cantidad de transistores que se pueden colocar en un chip. Y eso ha resultado en un efecto de estancamiento del rendimiento del hardware de la computadora. Esto significa que, para superar esta limitación impuesta por el hardware, debemos mejorar el software mediante prácticas que mejoren el rendimiento del software. Y al mismo tiempo, estas mejoras de rendimiento del software también deben ser seguras. Para eso, vamos a ver algunas herramientas que se pueden utilizar con diferentes aplicaciones y lenguajes del lado del servidor, como Node.js y Rust. Ahora, ¿por qué elegir Rust? Tenemos muchos lenguajes de programación heredados como C++, pero estos son propensos a errores. Pero Rust ofrece un lenguaje seguro y moderno que es igual de eficiente, si no más, que C++. Y también es mucho más capaz que Node.js en términos de rendimiento. Realmente puedes potenciarlo con muchas aplicaciones de alto rendimiento que se ejecutan de manera muy sencilla con la ayuda de Rust.
Y luego, surge la pregunta de cómo podemos usar Rust para programar en la web. Bueno, la forma anterior era compilarlo en bibliotecas y extensiones nativas con runtimes existentes como Node.js. Pero este enfoque resultó ser bastante inseguro y también requería un alto mantenimiento. Entonces, ¿cuál es la mejor manera? Bueno, puedes usar WebAssembly, que es esencialmente una forma de poder... proporciona las instrucciones para poder utilizar bytecodes que ayudan a interactuar con la aplicación en la que lo estás ejecutando, específicamente en la web, con las aplicaciones de nivel inferior que se ejecutan en la plataforma. Y podemos compilar el código de Rust en bytecode y luego gestionarlo con la ayuda de una máquina virtual como WebAssembly. ¿Y cuáles son algunos de los beneficios de la máquina virtual de WebAssembly, que hoy también se conoce como el tiempo de ejecución de Wasmage? Bueno, proporciona mucha seguridad de forma predeterminada. Es extremadamente ligero y portátil. Proporciona una eficiencia extrema porque utiliza técnicas como la compilación anticipada. También proporciona seguridad en tiempo de ejecución. Y está específicamente optimizado para muchas aplicaciones del lado del servidor. Y eso nos lleva al ecosistema que tenemos para esta charla. Queremos usar JavaScript por su facilidad de uso para construir aplicaciones, al mismo tiempo que tenemos el rendimiento de Rust y la seguridad y portabilidad de algo como WebAssembly. Y eso nos lleva a esta arquitectura que tenemos.
2. Using WebAssembly for High Performance
Podemos utilizar una máquina virtual basada en WebAssembly para ejecutar programas basados en Rust con tareas altamente computacionales, lo que hace que las aplicaciones de Node.js sean más eficientes. Al escribir tareas intensivas en Rust y utilizar funciones de JavaScript para llamar a funciones basadas en WebAssembly, podemos agrupar y compilar funciones de Rust en bytecode alojado en la máquina virtual de WebAssembly. Esto no solo asegura la aplicación, sino que también permite cálculos de alto rendimiento con Rust. WebAssembly se puede utilizar para diversas tareas, incluyendo inferencia de IA y bases de datos de almacenamiento, ya que permite la comunicación directa con el hardware nativo y está optimizado para aplicaciones del lado del servidor.
En general, las ejecuciones de Node.js runtimes se basarán en un runtime basado en C++. Pero, por supuesto, tenemos la solución alternativa de poder tener esencialmente una máquina virtual basada en WebAssembly que puede ejecutar los programas basados en Rust que tienen tareas altamente computacionales y que pueden ayudar a que las aplicaciones basadas en Node.js sean altamente eficientes. Y veamos cómo funciona eso en realidad. Entonces, lo que estamos haciendo es que tenemos nuestra aplicación de Node.js donde todas las tareas altamente intensivas no están escritas en Node.js, sino que están escritas en Rust. Así que con la ayuda de una función de JavaScript, llamaremos a las funciones basadas en WebAssembly que ayudan a agrupar la función de Rust y compilarla en un bytecode que luego se sirve y se aloja en la máquina virtual de WebAssembly, en este caso, Wasmx o SSVM. Y eso no solo ayuda a asegurar la aplicación, sino que también todas estas competiciones altamente intensivas que deben tener lugar ahora se realizan con la ayuda de Rust. Y solo tienes que llamar a esta función con la ayuda de tu entorno de Node.js. Y, por supuesto, puedes usarlas para muchas cosas diferentes, incluyendo inferencia de IA, porque puedes comunicarte directamente con el hardware nativo que es tu hardware de IA, o puedes usarlas para cosas como bases de datos de almacenamiento, ya que WebAssembly está altamente optimizado para aplicaciones del lado del servidor. Entonces, ¿cómo empezar? Bueno, como discutimos, la aplicación de host es esencialmente una aplicación web basada en Node.js escrita en JavaScript y se utiliza para realizar llamadas a funciones basadas en WebAssembly y el bytecode de WebAssembly se escribe primero en Rust, que luego se convierte en un bytecode de WebAssembly y se ejecuta dentro del tiempo de ejecución de WebAssembly y se llama con la ayuda de la aplicación de Node.js. Y para configurar este entorno completo, necesitarías al menos una versión moderna de Ubuntu. También necesitarías cosas como el lenguaje Rust, Node.js, el tiempo de ejecución de Wasm Edge y Wasm Edge y otra cosa como la herramienta de compilación de Rust a WebAssembly que ayudará a compilar desde Rust hasta el bytecode. Y ahora veamos un ejemplo de código. Entonces, para un código de inicio para comenzar con todo este ecosistema, puedes ir al siguiente enlace en el repositorio de GitHub de Second State que proporciona un inicio de NodeJs. Aquí, he proporcionado un pequeño fragmento de código. Como puedes ver, en la parte superior, hemos incluido una función segura. Esto se genera a partir de WebAssembly. Una vez que realmente construimos la función de Rust. Se convierte en bytecode y también este código basado en WebAssembly que puedes importar directamente. Y hemos hecho una simple llamada al servidor que básicamente agrega un parámetro de consulta al final de la llamada a la API y simplemente agrega un nombre. Y esto es lo que enviamos como una solicitud GET. Y esto aparece en la respuesta como hola con cualquier parámetro de consulta que hayamos dado con nuestro programa. Por supuesto, puedes usar esto para tareas mucho más intensivas computacionalmente. Por ejemplo, inferencia de machine learning, donde puedes tener, como, una imagen y pasarla como un parámetro de consulta y tienes tu inferencia real de machine learning que tiene lugar en Rust y obtienes la respuesta. Así que espero que esto te dé una buena idea de lo que está sucediendo detrás de escena. Bueno, con eso, concluyo mi charla relámpago. Si tienes alguna otra pregunta, no dudes en conectarte conmigo en mi Twitter, y espero que tengas un maravilloso resto del Congreso de Node.js. Muchas gracias.
Comments