Diseña el feed o la línea de tiempo de una red social: ¿cómo se comparan el fan-out en la escritura y el fan-out en la lectura?
Empujar una publicación a millones de seguidores de inmediato, o combinar a todos los que sigues al momento de leer: la elección define tu costo de escritura y cómo fallas con las cuentas famosas.
APRENDE HACIENDOPon a prueba tu intuición3 pasos
Diseña el feed o la línea de tiempo de una red social: ¿cómo se comparan el fan-out en la escritura y el fan-out en la lectura?
Usa los ejemplos y la explicación de la lección para comprobar tu idea.
Reflexión personal. No se envía a ningún servicio de IA.#Planteando el problema: ¿dónde ocurre el trabajo?
Un feed de noticias es una combinación personalizada y ordenada por tiempo (o por relevancia) de las publicaciones de todas las cuentas que un usuario sigue. La pregunta de ingeniería interesante nunca es "cómo almaceno una publicación", sino "quién arma el feed de un usuario, y en qué momento". Solo hay dos momentos posibles: cuando se escribe una publicación, o cuando se lee un feed. Cada diseño es una decisión sobre qué lado absorbe el costo, y las dos estrategias dominantes — fan-out en la escritura (fan-out-on-write) y fan-out en la lectura (fan-out-on-read) — se ubican en extremos opuestos de ese compromiso.
Ambas estrategias asumen los mismos elementos base: un almacén de posts indexado por ID, un grafo de follows (quién sigue a quién) y algún tipo de almacenamiento de feed por usuario. Lo que cambia es en qué momento se ejecuta realmente el fan-out — literalmente, "repartir una publicación entre los feeds de muchos seguidores".
#Fan-out en la escritura (modelo push)
En fan-out-on-write, el sistema hace el trabajo costoso de inmediato, en el momento de publicar. Cuando un usuario publica, un worker de fan-out busca toda su lista de seguidores e inserta una referencia a la nueva publicación (normalmente solo el ID del post y un puntaje para ordenar, no el cuerpo completo) en el feed precalculado de cada seguidor — típicamente una estructura ordenada y acotada, como un sorted set de Redis, uno por usuario.
Leer un feed pasa a ser casi gratis: se obtiene la lista precalculada del propio usuario, se pagina, se hidratan los cuerpos de las publicaciones desde el almacén de posts, y listo. Esto es O(1) respecto a cuántas cuentas sigues, y por eso se siente instantáneo en el producto.
El costo recae en el camino de escritura, y escala con la cantidad de seguidores del autor, no con una constante fija. Un usuario con 500 seguidores dispara 500 escrituras pequeñas. Un usuario con 5 millones de seguidores dispara 5 millones de escrituras por una sola publicación — la mayoría de las cuales es trabajo desperdiciado, porque la mayoría de esos seguidores ni siquiera abrirá la app antes de que ese post haya desaparecido del fondo de su feed.
#Fan-out en la lectura (modelo pull)
Fan-out-on-read invierte el compromiso: las escrituras se mantienen baratas, las lecturas se vuelven costosas. Publicar es solo un append a la línea de tiempo propia del autor — O(1), sin importar cuántos seguidores tenga. No existe worker de fan-out ni escritura alguna por seguidor.
El costo se traslada por completo al momento de la lectura. Cuando un usuario abre su feed, el servicio obtiene su lista de cuentas seguidas, consulta las publicaciones más recientes de cada una de ellas (a menudo en paralelo), combina los resultados por marca de tiempo o puntaje, y pagina. Si sigues a 2.000 cuentas, esa lectura toca (en el caso ingenuo) 2.000 líneas de tiempo de origen antes de poder devolver los 20 posts principales.
Esto evita por completo la amplificación de escritura y el almacenamiento desperdiciado del modelo push, pero traslada el cuello de botella al fan-in en el momento de la lectura, justo cuando los usuarios son más sensibles a la latencia.
#El problema de las celebridades, y el híbrido que lo resuelve
Ninguna estrategia pura sobrevive al contacto con un grafo social real, porque la cantidad de seguidores no es ni remotamente uniforme — sigue una ley de potencia. El fan-out-on-write puro colapsa con las cuentas famosas: una sola publicación de una cuenta con 50 millones de seguidores implica 50 millones de escrituras de feed disparadas a la vez, una verdadera "tormenta de escritura" que puede degradar toda la capa de caché de feeds para todos, no solo para los seguidores de esa celebridad. El fan-out-on-read puro colapsa para los usuarios intensivos comunes: alguien que sigue a 3.000 cuentas paga un fan-in de 3.000 vías en cada refresco de su feed, aunque casi ninguna de esas cuentas haya publicado algo nuevo desde su última revisión.
La respuesta práctica usada en la industria es un híbrido: push para todos por debajo de un umbral de seguidores, pull para todos por encima. Las cuentas normales siguen recibiendo fan-out-on-write, así que la mayoría de las lecturas de feed se mantienen como una consulta O(1) barata. Las cuentas por encima del umbral — celebridades, cuentas de medios grandes — se marcan y se excluyen del fan-out por completo. En el momento de la lectura, el servicio de feed combina el feed precalculado y empujado del usuario con una consulta en vivo pequeña y dirigida solo a las cuentas famosas que ese usuario sigue (rara vez más de un puñado, incluso para alguien que sigue a miles de cuentas normales).
#Compromisos de un vistazo
| Dimensión | Fan-out en la escritura | Fan-out en la lectura | Híbrido |
|---|---|---|---|
| Costo de escritura | O(seguidores) | O(1) | O(seguidores), acotado por umbral |
| Costo de lectura | O(1) | O(cuentas seguidas) | O(cuentas seguidas, solo famosas) |
| Almacenamiento | Alto — una copia por seguidor | Bajo — una copia por autor | Moderado |
| Cuentas famosas | Patológico | Sin problema | Manejado explícitamente |
| Frescura del feed | Inmediata | Inmediata pero costosa | Inmediata |
| Complejidad operativa | Moderada (workers de fan-out, listas acotadas) | Baja | Mayor (lógica ramificada, dos caminos que probar) |
#Detalles prácticos que importan en una entrevista
Los feeds precalculados siempre están acotados — nadie almacena una lista sin límite por usuario. Una implementación típica conserva solo las últimas cientos de entradas en el caché de feed de cada usuario; desplazarse más allá de ese límite recae en una consulta de estilo pull sobre los almacenes subyacentes como respaldo, lo cual es en sí mismo una pequeña decisión híbrida. Las eliminaciones y ediciones también deben propagarse en el modelo push — si se borra una publicación, la referencia cacheada de cada seguidor también debe invalidarse, algo fácil de olvidar y fácil de hacer mal.
También vale la pena señalar que la mayoría de los feeds en producción no son estrictamente cronológicos — están ordenados por un modelo de relevancia, lo que significa que incluso una arquitectura "push" sigue haciendo cómputo real en el momento de la lectura (puntuar y reordenar el conjunto candidato); simplemente no hace el costoso fan-in a través de miles de líneas de tiempo de origen. La decisión de fan-out y la decisión de ranking son ejes separados del mismo sistema.
🧠 Check your understanding
0/3 · 0/3 answered1. Un usuario sigue a 4.000 cuentas y refresca su feed constantemente. ¿Qué estrategia de fan-out hace que cada una de sus lecturas sea más costosa?
2. ¿Por qué el fan-out-on-write puro colapsa específicamente con las cuentas famosas?
3. En el modelo híbrido, ¿qué ocurre cuando publica una cuenta famosa?