GraphQL y Apollo en Produccion: Lecciones de una Plataforma de Microservicios
Por Carlos Diaz · 14 de agosto de 2024 · 3 min de lectura
En nuestra plataforma corremos GraphQL y REST lado a lado en produccion, y la eleccion de cual usar para un endpoint dado no es ideologica: depende de si las necesidades de datos del cliente consumidor son homogeneas (gana REST, es mas simple) o genuinamente variadas entre clientes (GraphQL se gana su complejidad).
El diseno schema-first es la disciplina que hace que valga la pena invertir en GraphQL. Escribir el esquema antes que los resolvers lo convierte en un contrato real contra el que los equipos de frontend y backend pueden construir en paralelo, en lugar de que el frontend espere a la implementacion del backend para saber que forma de datos va a recibir. El cache normalizado de Apollo Client es la otra mitad de la propuesta de valor del lado del frontend: una vez que una entidad esta en el cache, navegar a una vista que necesita esa misma entidad suele ser instantaneo, sin ninguna peticion de red, algo muy dificil de replicar con un cliente REST sin construir tu propia capa de cache equivalente.
Las lecciones operativas son menos glamurosas pero importan mas a escala. El problema de consultas N+1 no es teorico: un resolver escrito ingenuamente que trae una entidad relacionada por cada elemento de una lista degradara silenciosamente una consulta de un solo viaje a la base de datos a cientos bajo volumenes reales de datos, y los dataloaders resuelven esto agrupando y deduplicando esas peticiones dentro de una sola solicitud. Los limites de profundidad y complejidad de consulta tampoco son opcionales; sin ellos, un cliente - malicioso o simplemente mal escrito - puede construir una consulta profundamente anidada que se convierte en una explosion costosa de joins del lado del servidor.
Probar bien las APIs de GraphQL significa probar a nivel de resolver y a nivel de esquema por separado: las pruebas de resolver atrapan bugs de logica de negocio, mientras que las pruebas de snapshot del esquema atrapan cambios que rompen accidentalmente el contrato del que dependen los clientes frontend. Corremos ambas en CI, y la verificacion del esquema ha atrapado mas cambios accidentales de los que esperaba.
En una configuracion de microservicios, la federacion permite que cada servicio sea dueno de su parte del grafo sin que un solo equipo posea un esquema monolitico, mientras sigue presentando a los clientes una API unica y coherente. El gateway se convierte en infraestructura que posee el equipo de plataforma, y los subgrafos se convierten en algo que cada equipo de servicio puede evolucionar independientemente, que es la misma meta de independencia que motivo los microservicios en primer lugar, solo que aplicada a la capa de API.
Puntos Clave
- El diseno schema-first convierte la API en un contrato real entre frontend y backend.
- El cache normalizado de Apollo Client hace que la navegacion se sienta instantanea.
- Los dataloaders previenen problemas de consultas N+1 antes de llegar a produccion.
- Los limites de profundidad y el monitoreo a nivel de resolver protegen la plataforma desde el primer dia.
- La federacion permite que cada servicio sea dueno de su parte del grafo mientras los clientes ven una sola API.

