El valor que podemos construir y extraer de conjuntos diversos de datos se vuelve realmente poderoso. Y la razón por la que GraphQL nos resulta tan útil es que para orquestar esto, hay menos sobrecarga, porque simplemente he fusionado todas las piezas en una sola API, tengo un plano de control más pequeño, no tengo que preocuparme por enviar mis variables de entorno y todo lo demás. Tengo patrones reutilizables que puedo usar una y otra vez en diferentes herramientas. Y es totalmente agnóstico a la aplicación consumidora, ya sea que esté desarrollando una aplicación para Android, iOS o cualquier otra plataforma, eso no importa. Y esa parte agnóstica es realmente crítica, porque estoy argumentando que esa API tiene valor para nosotros en diferentes contextos, no solo para consumidores de la interfaz de usuario.
Bien, profundicemos un poco más en los modelos teóricos aquí. Lo que tenemos aquí es una estructura de servicio GraphQL común, ¿verdad? Tienes tus operaciones de lectura, como ordenar productos, y luego las mutaciones, como iniciar sesión, cerrar sesión, realizar una compra y editar pedidos. Y luego tienes servicios SQL o servicios REST identificados para los datos que necesitas en un lado, y en el otro lado, tienes microservicios para iniciar sesión, cerrar sesión y restablecer contraseñas. Así es como se combinan estos datos. Verás que las dependencias de datos de algo como un modelo de compra requieren acceso a todos estos datos. Pero algo como un modelo de compra podría estar protegido, ¿verdad? Porque estamos hablando de modificar una base de datos o insertar contenido, o queremos tener datos que potencialmente interactúen con nuestra base de datos, por lo que queremos tener estas dependencias federadas de datos en el contexto en el que se ejecute nuestro servicio. Entonces, si ese servicio es una compra, aún necesitamos los datos del usuario, el pedido y el producto, pero ¿por qué no podemos acceder a esos datos en el momento de la ejecución? Hablaremos de algunas de las razones por las que dicen que no se puede, pero vamos a desglosarlo en un modelo menos abstracto.
¿Qué sucede si decimos que el modelo de datos con el que estamos trabajando es mucho más complejo? Tenemos, por ejemplo, el promedio de crédito de red, compras pendientes, ingresos históricos, historial de devoluciones de los usuarios, etc. Tenemos aquí un modelo de evaluación de riesgos. Estos son datos altamente protegidos. Nos gustaría poder obtener información de ellos como retroalimentación para determinar si una persona tiene una evaluación de riesgos para un puntaje crediticio o cualquier otra cosa. Necesitamos todos estos otros datos, que se encuentran en silos muy diferentes, para poder unirlos y realizar este cálculo ponderado. Lo que estoy argumentando aquí es que la consulta que proviene del cliente, desde el cliente de la interfaz de usuario, intentando obtener información sobre si está aprobado o no, lo que sea, ese mismo entorno protegido puede realizar una consulta en sí mismo con la misma API de datos que pude llamar desde mi cliente de interfaz de usuario, con el mismo punto final de API desde el servicio de evaluación de riesgos real hasta mi misma API GraphQL y obtener la imagen completa de datos que estoy buscando para poder realizar ese cálculo. ¿Por qué de repente necesito crear un entorno completamente nuevo para todos estos datos? Quiero poder acceder a estos datos en el lugar donde los necesito. Y si puedo hacer ese cálculo, puedo trabajar con todos los datos que necesito para mi cálculo, reduciendo la cantidad de viajes y todo lo demás que pueda necesitar. Bueno, esto no es solo teoría, ¿verdad? Esto es algo que vemos implementado todos los días, específicamente en Hasura, en el ámbito de la atención médica, en métricas DORA, en empresas de entrega de alimentos y en muchos otros servicios que tienen que lidiar con estos datos.
Ahora quiero presentar algunas opiniones disidentes y, como digo, todos tienen derecho a estar equivocados, pero uno de los argumentos es que no es para lo que se creó GraphQL. Yo argumento que, en realidad, es exactamente para lo que fue diseñado, para definir las dependencias de datos para una ejecución. Sí, no se creó en el contexto de la interfaz de usuario para reducir los datos a través de la red, pero se trataba de obtener los datos que necesitas en el contexto en el que los necesitas. ¿Y qué pasa con la latencia? Bueno, marginalmente más alta que potencialmente una API REST diseñada de manera óptima, pero eso también es un problema solucionable, así que quiero cubrir nuestro enfoque para eso. Cuando avanzamos aquí y hablamos de nuestras soluciones para eso, queremos mencionar los problemas, y no hay ninguno, así que podemos seguir adelante. Cuando hablamos de latencia, en realidad hay problemas solucionables para esto, pero esto es algo que debes tener en cuenta con el modelo de datos. Esto es cierto para cualquier API, pero en general, el usuario puede esperar, ¿verdad? Estaría dispuesto a esperar uno o dos segundos adicionales si el servicio funcionara correctamente la primera vez y no tuviera problemas en el lado de la API. La segunda parte es que las nuevas API, nuevos problemas. Potencialmente, estamos simplemente trasladando todos los errores o problemas que teníamos con los patrones de consumo de nuestros microservicios a un contexto completamente nuevo donde tenemos que construir toda esta nueva infraestructura para admitir el consumo de microservicios a través de GraphQL. Y aquí es donde realmente quiero hacer hincapié. Tenemos una nueva API, pero tenemos un héroe emergente.
Comments