Lumen vs Laravel: benchmarking sin servidor

Evaluación comparativa de Laravel vs Lumen sin servidor

En esta publicación, comparamos el rendimiento de Laravel y Lumen para crear una función sin servidor que se ejecute en AWS Lambda.

Lumen vs Laravel


Laravel es un marco PHP muy conocido y elegante escrito por Taylor Otwell. Hasta la fecha, Laravel es el marco de backend con más estrellas en Github.

Lumen es una versión reducida de Laravel, con menos requisitos de paquete, por lo que es más pequeño, más rápido y más delgado que el marco completo. Lumen está diseñado para microservicios, en lugar de aplicaciones orientadas al usuario.

Bref, escrito por Matthieu Napoli, es una herramienta que facilita la implementación de aplicaciones PHP sin servidor en AWS y su ejecución en AWS Lambda. Bref viene como un paquete Composer de código abierto e incluye soporte para Laravel y Symfony.

 

Escenario de prueba

Creamos un proyecto de Laravel y Lumen. En ambos, agregamos una ruta muy simple que devuelva: “¡Hello, world!”. De esta manera, solo comparamos la sobrecarga del marco y nada más.

Usamos una capa Bref php-74-fpm ejecutando un Lambda con 1024 MB de memoria en la región eu-west-1.

 

Creando la prueba de Laravel

Creemos un proyecto de Laravel y agreguemos Bref siguiendo las instrucciones [aquí]:

lumen

Ahora preparemos el punto de referencia: establezca DEBUG=false en el archivo .env y agregue la siguiente ruta al archivo routes/api.php:

lumen

Y ejecute estos comandos para implementar:

lumen

 

Creación de la prueba de Lumen

Aunque Lumen no está cubierto por la documentación de Bref, implementar una aplicación Lumen en Lambda es sencillo. Estos son los pasos:

Si aún no lo ha hecho, instale Bref como se describe [aquí].

Abra un símbolo del sistema y ejecute:

lumen

Descargue [este archivo] en el directorio raíz del proyecto, por ejemplo:

lumen

Edite el archivo serverless.yml para cambiar la línea service=laravelservice=lumen, o cualquier otro nombre de servicio que desee.

Edite el archivo .env y cambie: LOG_CHANNEL=stack a  LOG_CHANNEL=stderr.

Preparemos el punto de referencia: establezca DEBUG=false en el archivo .env y agregue la siguiente ruta al archivo routes/web.php:

lumen

¡Ahora está listo para implementar! Simplemente ejecute:

 

Ejecutando el Benchmark

Una vez que se completa la implementación de Bref tanto para Laravel como para Lumen, debería obtener el siguiente resultado:

 

https://abcdefghi.execute-api.us-east-1.amazonaws.com/dev

https://abcdefghi.execute-api.us-east-1.amazonaws.com/dev/{proxy+}

 

Simplemente copie la primera de las dos URL, es decir, la URL de Laravel y la URL de Lumen. Ahora puede invocar las dos funciones abriendo las URL con su herramienta favorita (navegador, curl, Postman,…).

Recuerda eso:

  • debe agregar /api/test a la URL de Laravel,
  • debe adjuntar /test a la URL de Lumen.

Invocamos cada servicio 10 veces y recopilé la duración de cada tiempo en los registros de CloudWatch.

 

Resultados

Estos son los resultados de Lumen:

lumen

Aquí están los resultados para Laravel:

lumen

La primera línea de cada grupo corresponde a la duración tomada para el arranque en frío de Lambda, y las otras líneas corresponden a la duración para el Lambda ya iniciado (arranque en caliente).

Aquí hay un resumen de mis puntos de referencia:

Image for post

 

Conclusiones

En primer lugar, permítanme decirles que los resultados no me sorprenden particularmente. Laravel proporciona una gama de servicios mucho más amplia, por lo que puede esperar una sobrecarga de ejecución.

Otra consideración es que la diferencia entre los dos marcos en una aplicación del mundo real sería menos significativa debido a la sobrecarga para conectarse a una base de datos o un servicio de caché, que podría ser mucho mayor. Por ejemplo, si la sobrecarga para leer o escribir desde una base de datos es de aproximadamente 200 ms, entonces la diferencia entre los dos marcos (207,93 ms frente a 202,55 ms) sería insignificante.

Sin embargo, si está desarrollando microservicios de baja latencia, donde los milisegundos importan y no necesita los servicios proporcionados por Laravel, entonces podría valer la pena considerar Lumen.

Si sabe cómo obtener resultados diferentes aplicando optimizaciones adicionales, comuníquese conmigo.

Espero que este artículo le resulte útil, ¡gracias por leer!