No tengo idea de cómo lo hicimos, pero no tuvimos ninguna filtración de seguridad, ¿verdad? No teníamos ninguna política de seguridad ni nada, pero creo que en realidad, de alguna manera, la forma en que funciona GraphQL, donde cada resolutor individual te dice qué datos obtener y de dónde, simplemente agregamos un pequeño fragmento de control de acceso en cada resolutor y eso significaba que nadie podía acceder a los datos que no debían.
De todos modos, estábamos usando GraphQL y estábamos muy contentos con ello. Y en mi cabeza, después de un mes intentando solucionar nuestros problemas de la base de datos del servidor, pensé, vale, tenemos que encontrar una forma de reducir nuestro tráfico. Tenemos que encontrar una forma, sin tener menos usuarios, ¿verdad? Aún queremos más usuarios, pero queremos menos tráfico. ¿Cómo podemos lograrlo? Y por supuesto, la respuesta a eso es la caché. Y en mi cabeza pensé, vale, espera, tenemos esta cosa de foro público, ¿verdad?, como tenemos un foro público, muchas personas acceden a él sin autenticarse y simplemente leen las cosas, ese es el caso de uso ideal para la caché, ¿verdad? Solo quiero poner una caché delante de mi API de GraphQL, solo cachear todas las consultas y con suerte eso reduciría nuestro tráfico a un nivel en el que no nos estrellaríamos.
Mientras seguía pensando en esto, pensé, ¿por qué no puedo simplemente ejecutar un cliente de GraphQL en el borde, ¿verdad?, esa es realmente la pregunta que me estaba haciendo porque si alguna vez has usado un cliente de GraphQL o has oído hablar de uno como Apollo o Urql, eso es exactamente lo que hacen. Los clientes de GraphQL ofrecen una gran experiencia de usuario porque, en el navegador, ejecutan una caché de GraphQL y almacenan en caché todas las consultas que ven y las actualizan de forma muy inteligente, en acciones, y hacen un montón de cosas realmente inteligentes y eso hace que la experiencia sea realmente genial para el usuario. Así que en mi cabeza pensé, vale, los clientes de GraphQL hacen esto en el navegador, ¿por qué no puedo hacer esto en el servidor? Solo quiero lo mismo exacto, solo quiero tomar el cliente de Apollo y desplegarlo en el servidor, ¿verdad? ¿Por qué eso no puede funcionar? Y luego, incluso un paso más allá, si ya estoy haciendo caché, ¿por qué no puedo hacer caché cerca de mis usuarios en el borde, ¿verdad? Sunil acaba de hablar sobre CloudFlare y hay 250 ciudades en todo el mundo, ¿por qué no puedo simplemente poner una caché en cada uno de esos servidores y así no solo nos ahorraría un montón de tráfico, sino que también haría que la experiencia sea mucho más rápida para todos nuestros usuarios en todo el mundo. ¿Por qué no puedo hacer eso?
Así que empecé a investigar esto y empecé a leer sobre cómo los clientes de GraphQL hacen caché, y de eso quiero hablar un poco hoy. Si miras una consulta de GraphQL estándar como esta, hice este ejemplo, ¿verdad?, pero esta consulta de GraphQL obtiene una publicación de un blog según un cierto slug y obtiene su ID, título y del autor, también obtiene su ID, nombre y avatar. Y realmente, la única cosa clave que hace posible la caché de GraphQL es el metacampo __typename porque puedes agregarlo automáticamente a cualquier consulta de GraphQL. Y cuando agregas eso, la consulta de GraphQL termina viéndose así, ¿verdad? Tienes este campo mágico __typename en tu consulta de GraphQL. Ahora, no tienes que definir esto. Cada API de GraphQL lo admite porque está en la especificación. Cada tipo de objeto en tu API de GraphQL tiene que tener un campo __typename. ¿Qué hace ese campo? Bueno, si ejecutamos esta consulta y obtenemos los datos, lo que obtendríamos se vería un poco así. Es el dato de la publicación y también hay estos dos campos __typename que nos dicen que la publicación es del tipo POST, obvio, y el autor es del tipo USER. ¿OK, tiene sentido, verdad? Tenemos una publicación y un usuario. ¿Por qué ese campo de nombre de tipo es tan interesante? ¿Qué nos dice eso? Bueno, ahora podemos mirar esto y decir, ah, OK, puedo tomar todos estos datos, toda esta respuesta, ponerla en la caché y sé que esta respuesta contiene la publicación con el ID 5 y el usuario con el ID 1. ¿OK? Así que sabemos que esta respuesta que acabamos de poner en nuestra caché contiene la publicación con el ID 5 y el usuario con el ID 1. ¿Y qué? ¿Por qué necesitamos etiquetar nuestras respuestas en caché con algo? Bueno, aquí está la otra cosa interesante de GraphQL. Diferencia entre consultas y mutaciones. Y así, si tenemos una mutación como una mutación EDIT POST, donde decimos, OK, queremos cambiar el título de esta publicación de blog, de nuevo, podemos agregar el campo __typename a esta mutación. Y podemos decir, OK, de la mutación EDIT POST, solo avísame qué tipo obtengo de vuelta. Ahora, nosotros, como humanos, por supuesto, sabemos que EDIT POST probablemente, con suerte, devuelve una publicación. Sería un poco extraño si eso devolviera un usuario. Eso no tendría sentido. Pero la API también nos lo dice.
Comments