{"id":26790,"date":"2020-02-11T17:34:00","date_gmt":"2020-02-11T17:34:00","guid":{"rendered":"https:\/\/building.nu.com\/a-digital-pine-forest-the-evergreen-cache\/"},"modified":"2024-03-18T14:24:05","modified_gmt":"2024-03-18T14:24:05","slug":"un-pinar-digital-la-cache-siempre-verde","status":"publish","type":"post","link":"https:\/\/building.nu.com\/es\/un-pinar-digital-la-cache-siempre-verde\/","title":{"rendered":"Un pinar digital: la cach\u00e9 siempre verde"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/building.nu.com\/how-we-designed-our-bank-account-nuconta-part-i\/\">La cuenta digital de Nubank <\/a>&nbsp;se crea utilizando la misma fant\u00e1stica pila que impulsa nuestros otros productos: Clojure, Datomic y Kafka, todos implementados en la nube de AWS. En la cuenta de creaci\u00f3n de equipos de Nubank, tambi\u00e9n somos grandes admiradores de la contrataci\u00f3n de eventos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El abastecimiento de eventos es una expresi\u00f3n elegante para una idea que es simple en esencia: en lugar de almacenar el estado actual del sistema en una base de datos, almacene cada paso de la historia hasta el momento. Luego, si es necesario, siempre podemos volver a mirar esa tienda para responder cualquier pregunta que tengamos o incluso reducir la lista completa para obtener una vista \u00abcon estado\u00bb actualizada.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Resuelve una gran cantidad de problemas que surgen con los sistemas distribuidos. Utilizamos muchos microservicios en Nubank y mantenerlos coherentes entre s\u00ed es un problema complejo. Descubrimos que el abastecimiento de eventos nos permite desglosar las cosas de una manera que mantiene esta complejidad en un nivel c\u00f3modo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esta es una historia sobre cu\u00e1ndo nuestro enfoque basado en eventos comenz\u00f3 a convertirse en OOM y c\u00f3mo lo resolvimos sin comprometer la coherencia.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Contando dinero<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una caracter\u00edstica principal de una cuenta bancaria es mantener un puntaje actualizado de cu\u00e1nto dinero tiene all\u00ed. Por supuesto, tambi\u00e9n queremos permitirle ingresar y retirar m\u00e1s dinero.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Meter y sacar dinero de Nubank implica algunas integraciones complicadas que son interesantes en s\u00ed mismas, pero me gustar\u00eda hablar sobre la parte de \u00abmantener un puntaje actualizado\u00bb. En este caso, la puntuaci\u00f3n es el saldo de la cuenta.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una implementaci\u00f3n ingenua de un servicio de saldo se ver\u00eda as\u00ed:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>El modelo de base de datos consta de una entidad de <em>cuenta<\/em><\/li>\n\n\n\n<li>Esta entidad tiene un atributo de <em>saldo<\/em><\/li>\n\n\n\n<li>Agregar dinero significa actualizar el atributo de <em>saldo<\/em> para aumentarlo<\/li>\n\n\n\n<li>Quitar dinero significa actualizar el atributo de <em>saldo<\/em> para disminuirlo<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Suena simple, \u00bfverdad?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sin embargo, \u00bfc\u00f3mo construir\u00eda un estado de cuenta bancario sobre esto? \u00bfC\u00f3mo depurar\u00eda si algo sale mal? \u00bfC\u00f3mo se asegurar\u00eda de nunca agregar accidentalmente una cantidad dos veces ni eliminarla dos veces?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No entrar\u00e9 en detalles aqu\u00ed, pero un enfoque de abastecimiento de eventos resuelve todos estos problemas (y tambi\u00e9n algunos otros). Entonces, aqu\u00ed hay una forma de crear un servicio de saldo basado en eventos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>El modelo de base de datos tiene una entidad de <em>cuenta<\/em>.<\/li>\n\n\n\n<li>Tambi\u00e9n cuenta con una entidad de <em>dep\u00f3sito<\/em> y una entidad de <em>retiro<\/em>, ambas pertenecientes a una <em>cuenta<\/em>. Cada una de estas entidades tiene dos atributos: <em>monto<\/em> y <em>fecha.<\/em><\/li>\n\n\n\n<li>Agregar dinero significa crear un nuevo <em>dep\u00f3sito.<\/em><\/li>\n\n\n\n<li>Retirar dinero significa crear un nuevo <em>retiro.<\/em><\/li>\n\n\n\n<li>El saldo de la cuenta en una fecha determinada es la suma de todos los <em>dep\u00f3sitos<\/em> hasta esa fecha, menos la suma de todos los <em>retiros<\/em> hasta esa fecha.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Es una definici\u00f3n demasiado simplificada pero bastante cercana. As\u00ed suelo explicar nuestro sistema en las conversaciones. Cuando abrimos preguntas, hay una predecible:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u201c\u00bfRepasa toda la lista cada vez que alguien le pide su saldo? \u00bfNo es demasiado lento?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mi respuesta sol\u00eda ser: <em>\u201cHasta ahora todo va bien, \u00a1gracias por tu preocupaci\u00f3n!\u201d<\/em> hasta hace unos meses.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"640\" src=\"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2020\/04\/The-evergreen-cache-Square.jpg?resize=640%2C640&#038;ssl=1\" alt=\"Cache\" class=\"wp-image-81\" style=\"width:1427px;height:auto\" srcset=\"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2020\/04\/The-evergreen-cache-Square.jpg?w=640&amp;ssl=1 640w, https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2020\/04\/The-evergreen-cache-Square.jpg?resize=300%2C300&amp;ssl=1 300w, https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2020\/04\/The-evergreen-cache-Square.jpg?resize=150%2C150&amp;ssl=1 150w, https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2020\/04\/The-evergreen-cache-Square.jpg?resize=400%2C400&amp;ssl=1 400w, https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2020\/04\/The-evergreen-cache-Square.jpg?resize=200%2C200&amp;ssl=1 200w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><figcaption class=\"wp-element-caption\">La cach\u00e9 siempre verde. \ud83c\udf32\u00a0<br><a href=\"https:\/\/bit.ly\/jobs-at-nu\">Consulte nuestras oportunidades laborales\u00a0<\/a><br><\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Camino a OOM<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Resulta que la velocidad no era un problema, pero los requisitos de memoria terminaron si\u00e9ndolo. Para entender por qu\u00e9, necesitamos hablar de Datomic.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Datomic no es una base de datos SQL tradicional, pero probablemente tampoco coincida con lo que piensa cuando lee la palabra de moda \u00abNoSQL\u00bb. Ofrece transacciones ACID totalmente consistentes y tiene un mont\u00f3n de <a href=\"https:\/\/www.youtube.com\/watch?v=7lm3K8zVOdY\">superpoderes<\/a> listos para usar. Obtenemos pistas de auditor\u00eda sencillas y nunca perdemos ning\u00fan dato. Es realmente impresionante, incluso despu\u00e9s de trabajar con \u00e9l durante algunos a\u00f1os.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por muy interesantes que sean, las complejidades del modelo de datos de Datomic no son muy importantes para este problema. Lo relevante es una decisi\u00f3n arquitect\u00f3nica espec\u00edfica: Datomic separa los trabajos de escribir, almacenar y consultar datos. En un servidor SQL tradicional, una sola m\u00e1quina realiza los tres trabajos. Con Datomic, podemos (y normalmente lo hacemos) tener tres m\u00e1quinas o cl\u00fasteres diferentes, uno para cada trabajo.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El almacenamiento de datos parece una parte esencial de una base de datos. En cierto sentido lo es \u2014 pero Datomic no resuelve este problema directamente. En cambio, nos permite descargar esto a un servicio independiente, como DynamoDB.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El trabajo de escribir datos se deja a un proceso espec\u00edfico, llamado transactor. Todas las escrituras pasan por este embudo, son serializadas, procesadas, validadas. Si todo va bien, se acepta nuestra transacci\u00f3n y el resultado se conserva en nuestra capa de almacenamiento.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Debido a que todos los datos est\u00e1n en la capa de almacenamiento, se puede acceder a ellos desde cualquier lugar. Significa que podemos tener tantos procesos de consulta como queramos, todos buscando, filtrando y devolviendo de forma independiente los datos de inter\u00e9s. Estos procesos de solo lectura se denominan <em>pares<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En Nubank, nuestros pares son nuestras propias instancias de microservicios. El mismo contenedor, la misma JVM que ejecuta el c\u00f3digo de nuestra aplicaci\u00f3n, tambi\u00e9n ejecuta consultas, carga cosas desde DynamoDB en un cach\u00e9 enorme en la memoria y carga datos de forma preventiva incluso antes de que se lo solicitemos. Significa que las consultas pueden ser <em>rid\u00edculamente r\u00e1pidas<\/em> porque la mayor\u00eda de los datos que necesitar\u00e1 est\u00e1n en la memoria, sin necesidad de viajes de red.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tambi\u00e9n puede consumir <em>mucha<\/em> memoria. Hemos visto una instancia en la que nuestro servicio de saldos asigna varios gigabytes en unos segundos.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Entonces, lo que pas\u00f3 es que empezamos a ver accidentes. Las m\u00e1quinas se quedan sin memoria y se detienen durante minutos durante pausas de recolecci\u00f3n de basura. Al principio, nuestra respuesta fue aumentar la memoria disponible para estas instancias. Al principio esto funcion\u00f3.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando llegamos a las instancias de 100 GB que pend\u00edan de un hilo, supimos que no pod\u00edamos seguir as\u00ed por m\u00e1s tiempo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Reunimos un grupo de trabajo. Los perfiladores fueron las armas elegidas y se realizaron muchas pruebas de carga. Se redujeron megabytes, se optimizaron las consultas. Hubo paz por un tiempo. Sin embargo, no dur\u00f3.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El verdadero problema se basaba en dos hechos b\u00e1sicos sobre nuestro sistema:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Nuestro enfoque basado en eventos requiri\u00f3 que carg\u00e1ramos una <em>gran<\/em> cantidad de datos desde el almacenamiento en la memoria cach\u00e9 de los pares, donde pod\u00edamos ejecutar las consultas necesarias.\u00a0<\/li>\n\n\n\n<li>Cualquier instancia de nuestro servicio podr\u00e1 ser llamada para atender cualquier solicitud. Significa que si un cliente realiza cuatro solicitudes de saldo mientras navega por su aplicaci\u00f3n (lo cual es t\u00edpico), podr\u00eda forzar a cuatro instancias diferentes a cargar los mismos datos.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Ninguna instancia pod\u00eda ser tan grande como para contener toda la base de datos en la memoria cach\u00e9, pero aun as\u00ed todas las instancias <em>deb\u00edan<\/em> contener datos de todos los clientes activos en cada momento. Todas las instancias dedicaban mucho tiempo y memoria a rehacer el trabajo que otra m\u00e1quina ya hab\u00eda realizado. Todo el tiempo. Para todo el mundo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si pudi\u00e9ramos lograr que estas m\u00e1quinas compartieran parte del trabajo, o mejor a\u00fan, evitaran por completo rehacer trabajos innecesarios, entonces tendr\u00edamos alguna esperanza. Significaba agregar una capa de cach\u00e9. Pero, \u00bfqu\u00e9 dicen sobre ellos, de nuevo?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Una de las cosas dif\u00edciles<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Debo admitir que tengo un poco de miedo a los cach\u00e9s. Quiero decir, s\u00e9 que existen, s\u00e9 que es posible hacerlos funcionar. Tambi\u00e9n s\u00e9 que es posible escribir un programa multiproceso seguro en ensamblador \u2014 pero prefiero no hacerlo si puedo evitarlo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">He visto implementaciones de cach\u00e9 en las que varias personas revisaban el c\u00f3digo, lo analizaban, conclu\u00edan que era correcto y <em>a\u00fan<\/em> as\u00ed encontr\u00e1bamos estados no v\u00e1lidos en producci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una cita\/broma famosa sobre el almacenamiento en cach\u00e9 se <a href=\"https:\/\/martinfowler.com\/bliki\/TwoHardThings.html\">atribuye a Phil Karlton<\/a>:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00abS\u00f3lo hay dos cosas dif\u00edciles en Ciencias de la Computaci\u00f3n: invalidar la cach\u00e9 y nombrar cosas\u00bb.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Resulta que esta cita es absolutamente correcta: la parte dif\u00edcil no es el almacenamiento en cach\u00e9; la parte dif\u00edcil es la <em>invalidaci\u00f3n<\/em> de la cach\u00e9. \u00bfQu\u00e9 pasar\u00eda si pudi\u00e9ramos crear un cach\u00e9 que nunca tuviera que ser invalidado?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nosotros, los programadores de Clojure, nos jactamos de nuestras estructuras de datos inmutables listas para usar. Nunca perdemos nada hasta que ya no lo necesitamos, y en ese momento, podemos simplemente\u2026 soltar la referencia, olvidarla, confiar en el CG y nunca mirar atr\u00e1s.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00bfPodr\u00edamos crear un cach\u00e9 que funcione m\u00e1s o menos as\u00ed? \u00bfPodr\u00edamos solucionar lo dif\u00edcil, en lugar de resolverlo?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Almac\u00e9n inmutable<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Piense en esto: un cach\u00e9 donde cualquier referencia que tenga apunta a <em>nada<\/em> (un error de cach\u00e9) o a algo inmutable, por lo tanto v\u00e1lido para alg\u00fan momento. Cuando el mundo cambia, cambiamos la referencia, no ese valor. La nueva referencia tambi\u00e9n deber\u00eda apuntar a <em>nada<\/em> o apuntar a un valor nuevo, inmutable y v\u00e1lido.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es dif\u00edcil rastrear de d\u00f3nde provienen las ideas, pero mirando hacia atr\u00e1s, creo que dos fuentes fueron las m\u00e1s influyentes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.info.ucl.ac.be\/~pvr\/book.html\">Conceptos, T\u00e9cnicas y Modelos de Programaci\u00f3n Inform\u00e1tica<\/a> es un libro alucinante de Peter Van Roy y Seif Haridi. Una de las primeras construcciones que aprende en ese libro es la <a href=\"https:\/\/mozart.github.io\/mozart-v1\/doc-1.4.0\/tutorial\/node3.html#chapter.basics\"><em>variable l\u00f3gica<\/em><\/a>. Las variables l\u00f3gicas solo se pueden asignar una vez \u2014 est\u00e1n <em>liberadas<\/em> o vinculadas a un valor espec\u00edfico por el resto del tiempo (hasta que finaliza el programa). Las variables l\u00f3gicas me recuerdan a los<a href=\"https:\/\/en.wikipedia.org\/wiki\/Futures_and_promises\">futuros, promesas<\/a> y funciones memorizadas.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ese libro tambi\u00e9n muestra el uso de variables l\u00f3gicas para construir hermosos sistemas concurrentes con un comportamiento totalmente determinista. Resulta que si sus variables son inmutables una vez vinculadas <em>y<\/em> el proceso que las vincula es determinista, \u00a1la concurrencia es bastante segura!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La otra gran inspiraci\u00f3n fue la propia Datomic. Datomic almacena datos (en cualquier capa de almacenamiento que queramos usar) en forma de un gran \u00e1rbol de nodos inmutables. Cada nodo inmutable se identifica mediante un UUID. Siempre que deba realizar un cambio en ese \u00e1rbol, simplemente puede crear nuevas versiones de los nodos que deben modificarse, hasta la ra\u00edz del \u00e1rbol \u2014 y, finalmente, realizar un intercambio at\u00f3mico \u00fanico en la parte del almacenamiento que contiene la referencia a la ra\u00edz <em>actual<\/em> del \u00e1rbol.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora imagine que un Datomic peer debe ejecutar una consulta. Comienza en la ra\u00edz del \u00e1rbol, realiza cierta l\u00f3gica de indexaci\u00f3n y decide que los datos que necesita se encontrar\u00e1n en el nodo con UUID <strong>EAE4D22F-CE79\u201347C4-AE5A-759A46B4D166<\/strong>. Ahora supongamos que encuentra ese nodo ya cargado en su cach\u00e9 en memoria. \u00bfC\u00f3mo puede saber si el nodo sigue siendo v\u00e1lido?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00a1Por supuesto que es v\u00e1lido! \u00a1Es un valor inmutable! Mientras comencemos con la referencia correcta, no podemos evitar llegar a valores v\u00e1lidos. <em>\u00a1Datomic, bajo el cap\u00f3, tiene precisamente el tipo de cach\u00e9 que est\u00e1bamos buscando!<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Otra documentaci\u00f3n sugerente de Datomic <a href=\"https:\/\/docs.datomic.com\/on-prem\/acid.html#implications\">es esta<\/a>:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u201cDatomic siempre ver\u00e1 un puntero de registro correcto, que se coloc\u00f3 mediante transferencia condicional. Si algunos de los nodos del \u00e1rbol a\u00fan no son visibles debajo de ese puntero, Datomic es consistente pero parcialmente no est\u00e1 disponible, y estar\u00e1 completamente disponible cuando finalmente suceda\u201d.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Parece mucho a tener una variable l\u00f3gica independiente, que estar\u00e1 vinculada de forma as\u00edncrona por alg\u00fan otro hilo. Siempre y cuando ese otro hilo haga su trabajo de manera correcta y determinista, \u00a1estaremos a salvo!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Entonces, esto es lo que necesitamos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Un <em>almac\u00e9n inmutable<\/em> que asigna referencias a alg\u00fan valor (o a nada)<\/li>\n\n\n\n<li>Una forma de derivar el valor actual del estado de la base de datos y enviarlo a la tienda.<\/li>\n\n\n\n<li>Una forma de obtener una <em>referencia<\/em> v\u00e1lida al \u00faltimo valor<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Cualquier almac\u00e9n clave-valor funcionar\u00e1 bien como almac\u00e9n inmutable. Decidimos utilizar DynamoDB, algo a lo que estamos acostumbrados en Nubank.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ya sabemos c\u00f3mo calcular los resultados que queremos de la base de datos \u2014 lo hacemos cada vez que alguien realiza una solicitud HTTP. Entonces, una estrategia simple que podemos usar es un cach\u00e9 de lectura: buscar datos en la cach\u00e9; si falta, calculelo desde cero, luego escr\u00edbalo en la cach\u00e9 y regrese.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Todo lo que nos falta ahora es esa referencia m\u00e1gica, que deber\u00edamos poder usar como clave para nuestra tienda inmutable. \u00bfC\u00f3mo conseguimos eso?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>N\u00fameros de versi\u00f3n<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Datomic ha sido un buen modelo hasta ahora, veamos si podemos robarle algunas ideas m\u00e1s. \u00bfCu\u00e1l es la <em>referencia v\u00e1lida<\/em> para el almacenamiento de Datomic?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La respuesta est\u00e1 en esa ubicaci\u00f3n de almacenamiento particular que solo <a href=\"https:\/\/docs.datomic.com\/on-prem\/acid.html#implications\">se actualiza utilizando una opci\u00f3n condicional fuertemente consistente<\/a>: la clave del nodo ra\u00edz del \u00e1rbol. Este UUID apunta a la ra\u00edz de la \u00faltima <em>versi\u00f3n<\/em> de los datos. Si sigue esa referencia, todo lo que encontrar\u00e1 est\u00e1 actualizado. Cualquier otra cosa que pueda encontrar en la capa de almacenamiento es basura vieja.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esta idea de identificadores de versi\u00f3n aparece en muchos lugares como una forma de identificar cosas de forma \u00fanica: repositorios git, administradores de paquetes, cadenas de bloques. Pueden ser hashes criptogr\u00e1ficos o pueden ser nombres asignados por alguna autoridad central. No importa, siempre y cuando nombren valores inmutables.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Datomic tiene una especie de n\u00famero de versi\u00f3n que puede ser utilizado por el c\u00f3digo de la aplicaci\u00f3n. Se llama <a href=\"https:\/\/docs.datomic.com\/on-prem\/glossary.html#basis-t\">base-t<\/a>, una referencia a un punto en el tiempo en la base de datos. Se puede compartir una base-t entre pares para asegurarse de que est\u00e9n viendo la misma versi\u00f3n de los datos. La base-t se puede utilizar para mirar hacia el pasado (es decir, consultar la base de datos tal como estaba en ese momento) o esperar el futuro (es decir, bloquear un hilo hasta que el par local haya recibido todos los datos hasta ese momento).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00bfQu\u00e9 pasa si usamos este n\u00famero base-t como referencia?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bueno, cada transacci\u00f3n hace funcionar el reloj de Datomic, cada transacci\u00f3n aumenta este n\u00famero de versi\u00f3n. Entonces suceder\u00eda lo siguiente:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Consultamos a Datomic y encontramos que la base-t actual es 13. Usaremos esto como parte de nuestra clave de cach\u00e9 hasta que cambie la base-t actual.<\/li>\n\n\n\n<li>Recibimos una solicitud del saldo de la cuenta n\u00famero 2042.<\/li>\n\n\n\n<li>Nuestra clave de cach\u00e9 tendr\u00e1 el formato \u00abn\u00famero-de-cuenta\/base-t\u00bb, por lo que en este caso ser\u00e1 \u00ab2042\/13\u00bb.<\/li>\n\n\n\n<li>Lo buscamos en la tienda y no encontramos nada \u2014 falta de cach\u00e9.<\/li>\n\n\n\n<li>Consultamos la base de datos y calculamos el resultado.<\/li>\n\n\n\n<li>Guardamos el resultado en la tienda en la clave \u201c2042\/13\u201d y lo devolvemos.<\/li>\n\n\n\n<li>A continuaci\u00f3n, recibimos un dep\u00f3sito para una cuenta diferente y no relacionada. Lo guardamos en la base de datos. Esta transacci\u00f3n aumenta la base-t a 14.<\/li>\n\n\n\n<li>Si ahora recibimos una nueva solicitud para obtener el saldo de la cuenta 2042, usaremos una clave de cach\u00e9 diferente: \u201c2042\/14\u201d. \u00a1La cach\u00e9 falla otra vez!<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Entonces, si usamos la base-t como parte de nuestra clave de cach\u00e9, perderemos nuestras cach\u00e9s con demasiada frecuencia, sin una buena raz\u00f3n. Todas estas consultas que realizamos analizan los datos de una cuenta a la vez. Perder la cach\u00e9 de la cuenta A debido a un dep\u00f3sito en la cuenta B es simplemente una tonter\u00eda.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00bfPodemos hacerlo mejor?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Contador a nivel de cuenta<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00a1S\u00ed!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Todo lo que tenemos que hacer es agregar un atributo a nuestra entidad de <em>cuenta<\/em> en Datomic. Este atributo comienza en cero. Cada vez que hacemos <em>algo relacionado con esa cuenta<\/em>, aumentamos el atributo en 1 en la misma transacci\u00f3n. Nos da un n\u00famero de versi\u00f3n de los datos de la cuenta, que podemos usar como clave de cach\u00e9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Debido a que este atributo termina <em>contando<\/em> cada <em>evento<\/em> que ocurre en una cuenta, le dimos un nombre muy original: <em>contador de eventos<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La estructura general de nuestra cach\u00e9 de lectura se ve as\u00ed:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Recibimos una solicitud del saldo de la cuenta 2042.<\/li>\n\n\n\n<li>Consultamos a Datomic por el valor actual del contador de eventos para la cuenta 2042.<\/li>\n\n\n\n<li>Datomic nos dice que el contador de eventos es actualmente 17. Nuestra clave de cach\u00e9 ser\u00e1 \u201c2042\/17\u201d<\/li>\n\n\n\n<li>Buscamos \u00ab2042\/17\u00bb en el almac\u00e9n inmutable y no encontramos nada. Error de cach\u00e9.<\/li>\n\n\n\n<li>Consultamos a Datomic para obtener los datos que necesitamos y calculamos el saldo.<\/li>\n\n\n\n<li>Guardamos el saldo en la tienda inmutable, en la clave \u201c2042\/17\u201d y regresamos.<\/li>\n\n\n\n<li>Horas m\u00e1s tarde, recibimos una nueva solicitud del saldo de la cuenta 2042.<\/li>\n\n\n\n<li>El contador de eventos actual sigue siendo 17, por lo que la clave de cach\u00e9 sigue siendo \u00ab2042\/17\u00bb.<\/li>\n\n\n\n<li>\u00a1Acierto en cach\u00e9!<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Si obtenemos un nuevo dep\u00f3sito o retiro para la cuenta 2042, muy bien, aumentaremos el contador de eventos y esto provocar\u00e1 un error de cach\u00e9 en la siguiente solicitud. \u00a1Es inevitable, ya que el equilibrio actual, de hecho, ha cambiado! Lo importante es que esto no suceder\u00e1 por razones tontas, como sucedi\u00f3 cuando intentamos usar la base-t.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>La cach\u00e9 y la base de datos.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Generalmente pensamos en un cach\u00e9 como algo que va <em>delante<\/em> del servicio real, protegi\u00e9ndolo de las solicitudes \u2014 eso es lo que hacen las CDN, por ejemplo. Este tipo de cach\u00e9 tambi\u00e9n nos permite seguir ofreciendo contenido incluso si el servicio real no funciona por completo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sin embargo, esto s\u00f3lo funciona bien para contenido <em>est\u00e1tico<\/em>. Si necesitamos dinamismo, interacci\u00f3n y acciones que vayan m\u00e1s all\u00e1 de cualquier estado que podamos tener en el lado del cliente, necesitamos ejecutar alg\u00fan c\u00f3digo de aplicaci\u00f3n del lado del servidor de todos modos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si ese es el tipo de aplicaci\u00f3n que estamos ejecutando, y si la coherencia es un requisito importante, tiene sentido obtener cierta cooperaci\u00f3n del servidor y su base de datos, incluso cuando intentamos servir desde la cach\u00e9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Observe la diferencia: en una CDN, primero consultamos la cach\u00e9 y luego volvemos al servidor real si falla. En el esquema que describimos anteriormente, <em>lo primero que hacemos es consultar la base de datos para obtener el contador de eventos<\/em>. Solo entonces podremos buscar un cach\u00e9 y luego recurrir a la base de datos y recuperar el resto de los datos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Podemos almacenar en cach\u00e9 casi todos los datos, pero la base de datos a\u00fan proporciona esa peque\u00f1a base s\u00f3lida que mantiene todo consistente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tiene sentido para nuestro caso de uso porque la \u201cdisponibilidad a toda costa\u201d no beneficia a nuestros clientes. \u00bfDe qu\u00e9 sirve ver un saldo vencido en su cuenta bancaria, si no pueden hacer nada con \u00e9l porque los servidores no funcionan?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En lugar de reemplazar el servicio, nuestro objetivo principal con la cach\u00e9 era permitir que se ejecutara usando menos recursos. Lo logramos: cada instancia de nuestro servicio requiri\u00f3 90GB de RAM, pero ahora solo necesitan 55GB. Y a\u00fan mejor: ahora podemos escalar el servicio horizontalmente si la carga aumenta porque el trabajo se distribuye efectivamente entre instancias. La latencia tambi\u00e9n disminuy\u00f3 para la mayor\u00eda de las solicitudes, lo cual fue bueno, aunque no era el objetivo principal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Con este enfoque, logramos reducir dr\u00e1sticamente la cantidad de trabajo repetido que realiz\u00e1bamos en nuestros servidores. Tambi\u00e9n nos permiti\u00f3 manejar una carga mayor con m\u00e1quinas m\u00e1s peque\u00f1as, todo sin comprometer la consistencia.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00a1Ahora s\u00f3lo tenemos que encontrar una manera de evitar nombrar cosas!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">(<em>M\u00e1s art\u00edculos de <\/em><a href=\"https:\/\/medium.com\/%40gusbicalho\"><em>Gustavo Bicalho<\/em><\/a>)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">(Foto de <a href=\"https:\/\/unsplash.com\/%40samscrim?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\">Samuel Scrimshaw<\/a> en <a href=\"https:\/\/unsplash.com\/s\/photos\/evergreen-forest?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\">Unsplash<\/a>)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8216;\u00a1Guarda cada paso de la historia!&#8217; C\u00f3mo construimos un cach\u00e9 en Nubank que nunca queda obsoleto.<\/p>\n","protected":false},"author":178110057,"featured_media":23207,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_eb_attr":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_wpcom_ai_launchpad_first_post":false,"_jetpack_hide_featured_image":false,"_jetpack_featured_image_duplicate_dismissed":0,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[2589],"tags":[3076,3077,2585],"class_list":["post-26790","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software-engineering-es","tag-cache-es","tag-data-model-es","tag-datomic-es"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Un pinar digital: la cach\u00e9 siempre verde - Building Nubank<\/title>\n<meta name=\"description\" content=\"&#039;\u00a1Guarda cada paso de la historia!&#039; C\u00f3mo construimos un cach\u00e9 en Nubank que nunca queda obsoleto.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/building.nu.com\/es\/un-pinar-digital-la-cache-siempre-verde\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Un pinar digital: la cach\u00e9 siempre verde - Building Nubank\" \/>\n<meta property=\"og:description\" content=\"&#039;\u00a1Guarda cada paso de la historia!&#039; C\u00f3mo construimos un cach\u00e9 en Nubank que nunca queda obsoleto.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/building.nu.com\/es\/un-pinar-digital-la-cache-siempre-verde\/\" \/>\n<meta property=\"og:site_name\" content=\"Building Nubank\" \/>\n<meta property=\"article:published_time\" content=\"2020-02-11T17:34:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-03-18T14:24:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2020\/04\/the-evergreen-cache-Header-1.jpg?fit=1440%2C600&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1440\" \/>\n\t<meta property=\"og:image:height\" content=\"600\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Gustavo Bicalho - Software Engineer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Gustavo Bicalho - Software Engineer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/un-pinar-digital-la-cache-siempre-verde\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/un-pinar-digital-la-cache-siempre-verde\\\/\"},\"author\":{\"name\":\"Gustavo Bicalho - Software Engineer\",\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/#\\\/schema\\\/person\\\/8fef4b83e99a68039a00c8b6069b71fd\"},\"headline\":\"Un pinar digital: la cach\u00e9 siempre verde\",\"datePublished\":\"2020-02-11T17:34:00+00:00\",\"dateModified\":\"2024-03-18T14:24:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/un-pinar-digital-la-cache-siempre-verde\\\/\"},\"wordCount\":3301,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/un-pinar-digital-la-cache-siempre-verde\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/building.nu.com\\\/wp-content\\\/uploads\\\/2020\\\/04\\\/the-evergreen-cache-Header-1.jpg?fit=1440%2C600&ssl=1\",\"keywords\":[\"Cache\",\"data model\",\"Datomic\"],\"articleSection\":[\"Software Engineering\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/building.nu.com\\\/es\\\/un-pinar-digital-la-cache-siempre-verde\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/un-pinar-digital-la-cache-siempre-verde\\\/\",\"url\":\"https:\\\/\\\/building.nu.com\\\/es\\\/un-pinar-digital-la-cache-siempre-verde\\\/\",\"name\":\"Un pinar digital: la cach\u00e9 siempre verde - Building Nubank\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/un-pinar-digital-la-cache-siempre-verde\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/un-pinar-digital-la-cache-siempre-verde\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/building.nu.com\\\/wp-content\\\/uploads\\\/2020\\\/04\\\/the-evergreen-cache-Header-1.jpg?fit=1440%2C600&ssl=1\",\"datePublished\":\"2020-02-11T17:34:00+00:00\",\"dateModified\":\"2024-03-18T14:24:05+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/#\\\/schema\\\/person\\\/8fef4b83e99a68039a00c8b6069b71fd\"},\"description\":\"'\u00a1Guarda cada paso de la historia!' C\u00f3mo construimos un cach\u00e9 en Nubank que nunca queda obsoleto.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/un-pinar-digital-la-cache-siempre-verde\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/building.nu.com\\\/es\\\/un-pinar-digital-la-cache-siempre-verde\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/un-pinar-digital-la-cache-siempre-verde\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/building.nu.com\\\/wp-content\\\/uploads\\\/2020\\\/04\\\/the-evergreen-cache-Header-1.jpg?fit=1440%2C600&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/building.nu.com\\\/wp-content\\\/uploads\\\/2020\\\/04\\\/the-evergreen-cache-Header-1.jpg?fit=1440%2C600&ssl=1\",\"width\":1440,\"height\":600},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/un-pinar-digital-la-cache-siempre-verde\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/building.nu.com\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Un pinar digital: la cach\u00e9 siempre verde\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/#website\",\"url\":\"https:\\\/\\\/building.nu.com\\\/es\\\/\",\"name\":\"Building Nubank\",\"description\":\"We make the extraordinary happen\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/building.nu.com\\\/es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/building.nu.com\\\/es\\\/#\\\/schema\\\/person\\\/8fef4b83e99a68039a00c8b6069b71fd\",\"name\":\"Gustavo Bicalho - Software Engineer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0d238d4f6c898ccf82f93e47eb51fcd9581bb48982753e49040d9fed5d0834ae?s=96&d=identicon&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0d238d4f6c898ccf82f93e47eb51fcd9581bb48982753e49040d9fed5d0834ae?s=96&d=identicon&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0d238d4f6c898ccf82f93e47eb51fcd9581bb48982753e49040d9fed5d0834ae?s=96&d=identicon&r=g\",\"caption\":\"Gustavo Bicalho - Software Engineer\"},\"description\":\"Gustavo is a software engineer at Nubank, where he builds microservices and whatever else is needed to get the product running. He believes the tech industry can be a tool to positively impact the world if we can focus on solving the right problems. He likes programming, drawing weird diagrams on whiteboards, reading science fiction, and learning about how the mind works.\",\"url\":\"https:\\\/\\\/building.nu.com\\\/es\\\/author\\\/bicalho\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Un pinar digital: la cach\u00e9 siempre verde - Building Nubank","description":"'\u00a1Guarda cada paso de la historia!' C\u00f3mo construimos un cach\u00e9 en Nubank que nunca queda obsoleto.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/building.nu.com\/es\/un-pinar-digital-la-cache-siempre-verde\/","og_locale":"es_ES","og_type":"article","og_title":"Un pinar digital: la cach\u00e9 siempre verde - Building Nubank","og_description":"'\u00a1Guarda cada paso de la historia!' C\u00f3mo construimos un cach\u00e9 en Nubank que nunca queda obsoleto.","og_url":"https:\/\/building.nu.com\/es\/un-pinar-digital-la-cache-siempre-verde\/","og_site_name":"Building Nubank","article_published_time":"2020-02-11T17:34:00+00:00","article_modified_time":"2024-03-18T14:24:05+00:00","og_image":[{"width":1440,"height":600,"url":"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2020\/04\/the-evergreen-cache-Header-1.jpg?fit=1440%2C600&ssl=1","type":"image\/jpeg"}],"author":"Gustavo Bicalho - Software Engineer","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Gustavo Bicalho - Software Engineer","Tiempo de lectura":"18 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/building.nu.com\/es\/un-pinar-digital-la-cache-siempre-verde\/#article","isPartOf":{"@id":"https:\/\/building.nu.com\/es\/un-pinar-digital-la-cache-siempre-verde\/"},"author":{"name":"Gustavo Bicalho - Software Engineer","@id":"https:\/\/building.nu.com\/es\/#\/schema\/person\/8fef4b83e99a68039a00c8b6069b71fd"},"headline":"Un pinar digital: la cach\u00e9 siempre verde","datePublished":"2020-02-11T17:34:00+00:00","dateModified":"2024-03-18T14:24:05+00:00","mainEntityOfPage":{"@id":"https:\/\/building.nu.com\/es\/un-pinar-digital-la-cache-siempre-verde\/"},"wordCount":3301,"commentCount":0,"image":{"@id":"https:\/\/building.nu.com\/es\/un-pinar-digital-la-cache-siempre-verde\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2020\/04\/the-evergreen-cache-Header-1.jpg?fit=1440%2C600&ssl=1","keywords":["Cache","data model","Datomic"],"articleSection":["Software Engineering"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/building.nu.com\/es\/un-pinar-digital-la-cache-siempre-verde\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/building.nu.com\/es\/un-pinar-digital-la-cache-siempre-verde\/","url":"https:\/\/building.nu.com\/es\/un-pinar-digital-la-cache-siempre-verde\/","name":"Un pinar digital: la cach\u00e9 siempre verde - Building Nubank","isPartOf":{"@id":"https:\/\/building.nu.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/building.nu.com\/es\/un-pinar-digital-la-cache-siempre-verde\/#primaryimage"},"image":{"@id":"https:\/\/building.nu.com\/es\/un-pinar-digital-la-cache-siempre-verde\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2020\/04\/the-evergreen-cache-Header-1.jpg?fit=1440%2C600&ssl=1","datePublished":"2020-02-11T17:34:00+00:00","dateModified":"2024-03-18T14:24:05+00:00","author":{"@id":"https:\/\/building.nu.com\/es\/#\/schema\/person\/8fef4b83e99a68039a00c8b6069b71fd"},"description":"'\u00a1Guarda cada paso de la historia!' C\u00f3mo construimos un cach\u00e9 en Nubank que nunca queda obsoleto.","breadcrumb":{"@id":"https:\/\/building.nu.com\/es\/un-pinar-digital-la-cache-siempre-verde\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/building.nu.com\/es\/un-pinar-digital-la-cache-siempre-verde\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/building.nu.com\/es\/un-pinar-digital-la-cache-siempre-verde\/#primaryimage","url":"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2020\/04\/the-evergreen-cache-Header-1.jpg?fit=1440%2C600&ssl=1","contentUrl":"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2020\/04\/the-evergreen-cache-Header-1.jpg?fit=1440%2C600&ssl=1","width":1440,"height":600},{"@type":"BreadcrumbList","@id":"https:\/\/building.nu.com\/es\/un-pinar-digital-la-cache-siempre-verde\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/building.nu.com\/es\/"},{"@type":"ListItem","position":2,"name":"Un pinar digital: la cach\u00e9 siempre verde"}]},{"@type":"WebSite","@id":"https:\/\/building.nu.com\/es\/#website","url":"https:\/\/building.nu.com\/es\/","name":"Building Nubank","description":"We make the extraordinary happen","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/building.nu.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/building.nu.com\/es\/#\/schema\/person\/8fef4b83e99a68039a00c8b6069b71fd","name":"Gustavo Bicalho - Software Engineer","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/0d238d4f6c898ccf82f93e47eb51fcd9581bb48982753e49040d9fed5d0834ae?s=96&d=identicon&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/0d238d4f6c898ccf82f93e47eb51fcd9581bb48982753e49040d9fed5d0834ae?s=96&d=identicon&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0d238d4f6c898ccf82f93e47eb51fcd9581bb48982753e49040d9fed5d0834ae?s=96&d=identicon&r=g","caption":"Gustavo Bicalho - Software Engineer"},"description":"Gustavo is a software engineer at Nubank, where he builds microservices and whatever else is needed to get the product running. He believes the tech industry can be a tool to positively impact the world if we can focus on solving the right problems. He likes programming, drawing weird diagrams on whiteboards, reading science fiction, and learning about how the mind works.","url":"https:\/\/building.nu.com\/es\/author\/bicalho\/"}]}},"jetpack_likes_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pbKBB5-6Y6","jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2020\/04\/the-evergreen-cache-Header-1.jpg?fit=1440%2C600&ssl=1","_links":{"self":[{"href":"https:\/\/building.nu.com\/es\/wp-json\/wp\/v2\/posts\/26790","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/building.nu.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/building.nu.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/building.nu.com\/es\/wp-json\/wp\/v2\/users\/178110057"}],"replies":[{"embeddable":true,"href":"https:\/\/building.nu.com\/es\/wp-json\/wp\/v2\/comments?post=26790"}],"version-history":[{"count":3,"href":"https:\/\/building.nu.com\/es\/wp-json\/wp\/v2\/posts\/26790\/revisions"}],"predecessor-version":[{"id":28640,"href":"https:\/\/building.nu.com\/es\/wp-json\/wp\/v2\/posts\/26790\/revisions\/28640"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/building.nu.com\/es\/wp-json\/wp\/v2\/media\/23207"}],"wp:attachment":[{"href":"https:\/\/building.nu.com\/es\/wp-json\/wp\/v2\/media?parent=26790"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/building.nu.com\/es\/wp-json\/wp\/v2\/categories?post=26790"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/building.nu.com\/es\/wp-json\/wp\/v2\/tags?post=26790"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}