Continuando con el post en el que introducíamos Fn, hoy seguiremos con Fn, Java y en este caso usaremos GraalVM (Del que también hemos hablado en estos posts)
(Este post está basado en este post https://dzone.com/articles/java-serverless-on-steroids-with-fngraalvm-hands-o-1)
En el post haremos el equivalente GraalVM a la función creada en el primer post, y luego mediremos los tamaños de las imágenes, tiempos de arranque, consumo de memoria,…
1.Empezaremos por crear la función, para esto usaremos la imagen fn-java-native-init
fn init –init-image fnproject/fn-java-native-init java_fn_graalvm
cd java_fn_graalvm
Podemos ver que la función GraalVM genera además el Dockerfile para generar la imagen nativa GraalVM multi-stage:
2.Ahora creamos la app:
fn create app java_fn_graalvm-app
3.Luego modificaremos el ejemplo para dejarlo igual que el de la aplicación Java del post previo
4.Y finalmente haremos el deploy de la aplicación (veréis que la primera generación de la imagen tarda bastante)
fn deploy –verbose –local –app java_fn_graalvm-app
5.Una vez hecho el deploy podemos comprobar el tamaño de la imagen.
La imagen Java original ocupaba 238 MB:
Mientras que la imagen GraalVM ocupa sólo 40 MB:
6.Ahora comprobaremos la diferencia en los tiempos de ejecución.
Primero el de la función en Java:
time curl -X «POST» -H «Content-Type: application/json» -d ‘{«name»:»Luismi»}’ http://localhost:8080/invoke/01F00Z4AHENG8G00GZJ0000007
Y luego el de mi función en GraalVM:
time curl -X «POST» -H «Content-Type: application/json» -d ‘{«name»:»Luismi»}’ http://localhost:8080/invoke/01F03G9FPANG8G00GZJ000001N
En mi 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%, luego si tengo la imagen en memoria los tiempos son muy parecidos.
En un ejemplo real (pj una aplicación Spring Boot) las diferencias sería más significativas ya que, como sabemos el arranque de una aplicación Spring Boot con GraalVM es mucho más rápido (ver post).
Como decíamos, la diferencia de tiempos depende de si para la ejecución Fn tiene que instanciar la imagen y esto es configurable con las opciones del Runtime de Fn: concretamente:
