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í]:
Ahora preparemos el punto de referencia: establezca DEBUG=false
en el archivo .env
y agregue la siguiente ruta al archivo routes/api.php
:
Y ejecute estos comandos para implementar:
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:
Descargue [este archivo] en el directorio raíz del proyecto, por ejemplo:
Edite el archivo serverless.yml
para cambiar la línea service=laravel
a service=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
:
¡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:
Aquí están los resultados para Laravel:
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:
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!