Conociendo Fn (parte 2): Generando una función Fn con Java y GraalVM

Header Fn Project

Seguimos con nuestra serie de entradas de introducción a Fn Project. Si la semana pasada os hablamos sobre qué era Fn Project y el concepto de serverless, hoy queremos avanzar un poquito más y enseñaros cómo generar una función de Fn usando Java y GraalVM, una maquina virtual que es capaz de ejecutar código de diversos lenguajes de programación.

Lo que vamos a hacer es volver a crear la función que preparamos la semana pasada, la de «HelloFunction», pero en su equivalente GraalVM, y luego mediremos los tamaños de las imágenes, tiempos de arranque, consumo de memoria, etc., para compararlas.

Como veréis, no es nada complicado, así que vamos a ello.

Creando la función

Empezaremos por crear la función, para lo que usaremos la imagen de «fn-java-native-init», invocándola con el siguiente código:

fn init –init-image fnproject/fn-java-native-init java_fn_graalvm

cd java_fn_graalvm

Una vez ejecutadas estas líneas, vamos a poder ver que la función GraalVM genera además el Dockerfile para generar la imagen nativa «GraalVM multi-stage»:

Creando la aplicación y midiendo su peso

Seguidamente, vamos a generar una app lanzando el siguiente código:

fn create app java_fn_graalvm-app

A continuación, vamos a modificar el ejemplo para dejarlo igual al de la aplicación Java que creamos en la entrada anterior. Finalmente, llevaremos a cabo el despliegue de la aplicación (veremos que la primera generación de la imagen tarda bastante tiempo), para esto ejecutaremos el siguiente comando:

fn deploy –verbose –local –app java_fn_graalvm-app

Una vez hecho el despliegue, podemos comprobar el tamaño de la imagen de ambas versiones. La versión original de Java tiene un peso de 238 MB:

En cambio, la imagen de GraalVM ocupa sólo 40 MB; seis veces menos que la versión de Java:

Comprobando los tiempos de ejecución

Ahora que hemos visto la gran diferencia en el peso entre una y otra versión, vamos a ver si difieren mucho los tiempos de ejecución.

Empezaremos comprobando la versión original de Java, mediante el siguiente comando:

time curl -X “POST” -H “Content-Type: application/json” -d ‘{“name”:”Luismi”}’ http://localhost:8080/invoke/01F00Z4AHENG8G00GZJ0000007

A continuación, haremos lo mismo pero con la imagen de GraalVM:

time curl -X “POST” -H “Content-Type: application/json” -d ‘{“name”:”Luismi”}’ http://localhost:8080/invoke/01F03G9FPANG8G00GZJ000001N

En nuestro caso, las diferencias sólo son apreciables en la primera ejecución de cada función, ya que en ese momento Fn tiene que instanciar la imagen de la función, donde se reduce el tiempo un 30%. Una vez instanciada con la imagen en memoria los tiempos son muy parecidos entre ambas versiones.

En un ejemplo real, como en una función Fn construida sobre Spring Cloud Function, las diferencias sería más significativas ya que el arranque de una aplicación Spring Boot con GraalVM es mucho más rápido.

También queremos indicar que la diferencia de tiempos depende de si para la ejecución de Fn tiene que instanciar la imagen o no, algo que es configurable con las opciones del Runtime de Fn:


Pues dicho esto, damos por terminada esta segunda entrada sobre Fn.

Esperemos que os haya parecido interesante y podáis sacarle valor. Como siempre, cualquier duda que os surja, por favor dejadnos un comentario.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *