- Después de usarlo durante 6 años desde 2018, fui un verdadero fanático de GraphQL, pero ahora tengo mis dudas
- Quiero explicar por qué ya no recomiendo GraphQL y cuál creo que es una mejor alternativa
Superficie de ataque
- GraphQL expone un lenguaje de consultas, lo que conlleva el riesgo de ampliar la superficie de ataque.
- Los problemas relacionados con la autorización son especialmente importantes.
- Se necesitan verificaciones de autorización adecuadas para cada campo.
- En una API REST, es más sencillo verificar los permisos por endpoint.
Autorización
- Hay que comprobar los permisos del usuario para cada campo.
- En una API REST, es más sencillo verificar los permisos por endpoint.
Limitación de velocidad
- Las consultas de GraphQL no tienen un límite de tamaño, por lo que pueden generar una carga muy grande en el servidor.
- Existe la posibilidad de estimar la complejidad de la consulta y limitar las que superen cierto nivel de complejidad.
- En una API REST, es más sencillo limitar la cantidad de solicitudes.
Análisis de consultas
- Una cadena de consulta malformada puede hacer que el servidor use memoria en exceso.
- Hay una forma de detener el análisis estableciendo un número máximo de errores.
Rendimiento
Obtención de datos y problema N+1
- Los resolvers de campos pueden llamar varias veces a fuentes de datos externas.
- Se puede resolver el problema usando el patrón Dataloader.
- En REST, es más sencillo resolver el problema N+1 desde el controlador.
Autorización y problema N+1
- El código de autorización puede provocar el problema N+1.
- En REST, este problema no ocurre.
Acoplamiento
- En un código base de GraphQL, la lógica de negocio queda fuertemente acoplada a la capa de transporte.
- Se necesitan pruebas de integración y es difícil depurar.
Complejidad
- Los distintos métodos para resolver los problemas de seguridad y rendimiento de GraphQL aumentan la complejidad del código base.
- Las soluciones REST por lo general son más simples.
Alternativas
- Se recomienda una API JSON REST que use OpenAPI 3.0+.
- Si hay clientes escritos en un lenguaje con tipos estáticos, OpenAPI puede ser una mejor opción.
- OpenAPI puede generar automáticamente código cliente con seguridad de tipos.
Opinión de GN⁺
- GraphQL es potente, pero requiere mucho esfuerzo para resolver los problemas de seguridad y rendimiento.
- La API REST es relativamente simple y, en muchos casos, puede ser más adecuada.
- OpenAPI puede aumentar la productividad del desarrollo al ofrecer seguridad de tipos y herramientas automatizadas.
- Al adoptar GraphQL, hay que considerar a fondo los problemas de seguridad y rendimiento.
- Es importante comparar las ventajas y desventajas de REST y GraphQL para elegir la tecnología adecuada para el proyecto.
8 comentarios
Por qué dejé de usar GraphQL después de 6 años
Se viene la era del gran auge del rpc
Tal cual... no hay que lanzarse de cabeza y entusiasmarse solo porque salió algo fancy... ahora le toca al ORM. Tu turno tampoco está tan lejos...
Han pasado más de 20 años desde que apareció el ORM...
En 2018, PQ ya no era algo tan nuevo (de hecho, se recomendaba desde que GraphQL se anunció por primera vez), así que sorprende que no lo hayan intentado durante 6 años...
Implementar todo GraphQL a mano es difícil en términos de complejidad y estabilidad por todas las razones mencionadas arriba. Parece mejor desarrollar poniendo una capa como hasura o postgraphile sobre la base de datos, y según sea necesario agregar GraphQL o REST a esta capa.
Opiniones de Hacker News