Hola a todos, soy Brichts, estoy muy emocionado hoy de hablar en la conferencia GraphQL Galaxy. Soy Databrichts en Twitter, trabajo para la base de datos Vana y hoy voy a hablar sobre NativeGraphQL o GraphQL como lenguaje de consulta de base de datos.
Ahora, si hablamos de Native GraphQL en VANA, ¿qué significa? Bueno, en primer lugar, tenemos un lenguaje de consulta VANA que llamamos FQL y básicamente NativeGraphQL significa que una consulta GraphQL se traduce en una consulta FQL. Esta traducción uno a uno tiene enormes ventajas, así que primero, te preguntarás qué ventajas tiene, vamos a ver eso, y la pregunta 2, ¿por qué no todos hacen esto si hay tales ventajas?
Para responder a estas preguntas, en realidad tenemos que responder otras preguntas como ¿cómo funcionan los resolutores de GraphQL? Así que hagamos un desvío. ¿Cómo funcionan los resolutores de GraphQL? Bueno, típicamente, si tienes una consulta como esta con getList, toDo, title, cada campo aquí, como getList y toDo's y title son campos, se asignarán a una función. Así que getList será una función y delegará en la función toDo's, que a su vez delegará en la función title, por ejemplo, en el atributo title. Esta es una cadena de resolutores, que es una cadena de funciones, pero en realidad es más un árbol de resolutores de llamadas a funciones.
Porque aquí hay una función que llama a n funciones. Y si invertimos esto, obtenemos n más 1 y básicamente es un problema. Y esto se llama el problema de n más uno. Por eso lo invertí. ¿Y cuándo es esto un problema? Bueno, básicamente, si vas a llamar a la base de datos para cada uno de estos resolutores, porque entonces obtienes n más uno llamadas a la base de datos, lo cual no es eficiente. Así que la pregunta cuatro, ¿cómo podemos resolver el problema de n más uno? Bueno, hay múltiples soluciones. La solución uno es la agrupación o el almacenamiento en caché en memoria. Así que en ese enfoque, vamos a engancharnos en estas funciones, por ejemplo, todo.titles, y simplemente esperar hasta que se llamen todos los todo.titles y luego combinarlos. Así que en lugar de hacer n llamadas para estos todo.titles, vamos a hacer una llamada. Así que en total, dos llamadas. Eso es agrupación y a menudo se combina con el almacenamiento en caché. Así que si llega una llamada similar, en lugar de ir a la base de datos, podemos ir a una caché en memoria, por lo que no accedemos a la base de datos en absoluto.
Una implementación muy popular es el data loader de Facebook, que puedes conectar fácilmente a tus resolutores y se encargará de ello. Sin embargo, también hay un problema con esta solución. Debería ser en realidad el último recurso. ¿Por qué? Tus datos ya no están en vivo. Ya no son consistentes. No se puede aplicar a todo. No se puede agrupar todo. Así que seguirás teniendo múltiples llamadas. ¿Qué pasa con la validación de caché, la presión de memoria con la que de repente tienes que lidiar? Así que introduce complejidad. La primera pregunta, ¿qué ventajas proporciona el enfoque de VANA? Bueno, no trata con estos problemas porque no tiene estos problemas.
Comments