Prompt y contexto aplicable
Diseña un feed de noticias personalizado respaldado por un grafo de seguimiento. Los usuarios pueden publicar posts de texto o imágenes, seguir o dejar de seguir autores y navegar por un feed principal ordenado por relevancia. Eliminar una publicación, hacerla privada, bloquear a un autor o dejar de seguirlo debe afectar las lecturas posteriores con prontitud. Los "me gusta", los comentarios y los modelos de recomendación son señales de ranking. La transcodificación de medios, los árboles de comentarios, las subastas de anuncios y el entrenamiento de modelos quedan fuera del alcance.
Asume 50 millones de usuarios activos diarios (DAU). Cada usuario activo lee 20 páginas por día, con 20 elementos por página, y el sistema recibe 10 millones de publicaciones nuevas al día. El p99 de lectura del feed debe estar por debajo de los 200 milisegundos. La publicación de un autor normal debe ser visible para los seguidores activos en un plazo de cinco segundos en el p99. Un autor normal tiene un promedio de 200 seguidores elegibles, mientras que el autor más grande tiene 50 millones de seguidores. Estas cifras y plazos son restricciones de entrevista, no afirmaciones sobre un producto existente.
Este planteamiento se adapta a entrevistas de nivel intermedio a senior para backend, infraestructura y diseño de sistemas. El material público de entrevistas pregunta directamente sobre write fan-out, read fan-out, autores famosos, paginación por cursor, almacenamiento en caché y consistencia. Los relatos de ingeniería de primera mano también separan la recuperación de candidatos, la agregación, el filtrado y el ranking en múltiples pasadas, manteniendo al mismo tiempo el contenido materializado para una degradación elegante. Por lo tanto, una respuesta sólida combina mecanismos basados en requisitos explícitos de costo y corrección en lugar de reproducir un solo diagrama fijo.
Qué evalúa el entrevistador
Primero, ¿puede el candidato cuantificar la asimetría entre lectura y escritura? Cincuenta millones de DAU multiplicados por 20 páginas equivalen a mil millones de lecturas por día, o aproximadamente 11,600 QPS promedio. Un pico de cinco veces representa unos 58,000 QPS. Diez millones de publicaciones promedian solo unas 116 creaciones por segundo, pero el write fan-out hacia 200 seguidores elegibles expande eso a unos dos mil millones de inserciones de referencias de timeline por día, o aproximadamente 23,100 por segundo en promedio. Comparar únicamente el QPS bruto de publicaciones oculta la carga principal de escritura.
Segundo, ¿comprende el candidato los límites del push, el pull y un enfoque híbrido? El fan-out-on-write puro hace que las lecturas sean económicas, pero un autor con 50 millones de seguidores genera 50 millones de inserciones. El fan-out-on-read puro hace que la publicación sea económica, pero cada lectura puede requerir combinar muchos autores seguidos. Un diseño sólido precalcula referencias para autores normales, hace pull de autores de alto fan-out durante las lecturas y deriva el límite a partir de los seguidores activos, la tasa de publicación, el presupuesto de la cola y los objetivos de frescura.
Tercero, ¿puede el candidato separar la fuente de verdad de las publicaciones, los grupos de candidatos y la presentación final? Un timeline almacena referencias ligeras en lugar de cuerpos copiados. El agregador combina una bandeja de entrada precalculada, publicaciones recientes de autores con alto fan-out y candidatos de recomendación; aplica autorización, eliminación, bloqueo y deduplicación; luego clasifica e hidrata. La puntuación de un modelo nunca anula las reglas de visibilidad.
Cuarto, ¿puede el candidato preservar una semántica de paginación útil mientras el ranking cambia? Las puntuaciones varían con la interacción y las versiones del modelo, por lo que un offset o una puntuación por sí solos provocan duplicados y omisiones. La respuesta debe proponer una sesión de feed congelada de corta duración o un cursor compuesto con control de versiones, y explicar qué sucede cuando ocurren nuevas publicaciones, eliminaciones, unfollows y cambios de visibilidad durante el desplazamiento.
Finalmente, el diseño debe recuperarse y ser falseable. El bus de eventos, la caché y los workers de fan-out pueden fallar o repetir trabajo. Las referencias idempotentes, el monitoreo del retraso (lag), el fallback acotado a las fuentes, el filtrado mediante tombstones y los escaneos de reparación deben converger. La validación debe incluir ráfagas de celebridades, eventos duplicados y desordenados, condiciones de carrera de unfollow, fugas de eliminación y pérdida de caché.
Preguntas para aclarar antes de responder
- ¿Qué alimenta la página principal? Principalmente publicaciones de autores seguidos, con un pequeño grupo de recomendaciones. Los anuncios, grupos y feeds temáticos quedan fuera del alcance.
- ¿Cuál es el contrato de ranking? El ranking por relevancia es el predeterminado. Los resultados deben ser frescos y mezclar fuentes deliberadamente, pero no se requiere un orden cronológico estricto.
- ¿Quién puede ver una publicación? Una publicación puede ser pública, solo para seguidores o privada. Los bloqueos, eliminaciones y restricciones de visibilidad tienen prioridad sobre los aciertos de caché y el ranking.
- ¿Quién necesita read-your-writes? El autor debe ver una nueva publicación de inmediato. Los seguidores normales activos tienen un objetivo de visibilidad de cinco segundos. Los seguidores desconectados pueden ponerse al día en su próxima visita.
- ¿Qué tan estable debe ser la paginación? Un desplazamiento continuo debe minimizar los duplicados y las omisiones. Las nuevas publicaciones pueden aparecer al actualizar o en una nueva sesión. La eliminación y el acceso revocado se aplican de inmediato dentro de la sesión actual.
- ¿Qué tan sesgado está el grafo? Un autor normal tiene un promedio de 200 seguidores elegibles, mientras que el más grande puede tener 50 millones. Un promedio no debe ocultar los puntos calientes (hotspots).
- ¿Cuánto se retiene? Precalcular las 500 referencias de candidatos más recientes para cada usuario activo. Retener los cuerpos de las publicaciones según la política del producto y recuperar elementos más antiguos de los índices de autores y recomendaciones cuando sea necesario.
- ¿Cuáles son los requisitos regionales? Atender lecturas localmente y replicar una publicación de forma asíncrona después de que se confirme en la región de origen del autor. La frescura ordinaria puede ser de segundos; la restricción de visibilidad utiliza una ruta de invalidación de mayor prioridad.
Estructura de respuesta de 30 segundos
“Separaría el almacén de publicaciones autoritativo, el grafo de seguimiento y la bandeja de entrada de candidatos por usuario. Una transacción de creación escribe la publicación y un evento de outbox. Los workers de fan-out insertan de forma idempotente a los autores normales en las bandejas de entrada de los seguidores activos, mientras que los autores de alto fan-out solo escriben en un índice de autores recientes y se extraen (pull) durante las lecturas. El agregador de feeds combina candidatos precalculados, de alto fan-out y recomendados; aplica autorización, eliminación, bloqueo y deduplicación; luego utiliza la recuperación y el ranking para crear una sesión de feed de corta duración. El cursor contiene la sesión y la posición, y los cuerpos de las publicaciones se hidratan únicamente para los elementos finales. Las eliminaciones y restricciones de visibilidad escriben tombstones autoritativos e invalidaciones de alta prioridad, mientras que cada lectura los vuelve a verificar. Durante un retraso en la cola, devuelve un feed materializado más antiguo y realiza lecturas acotadas de las fuentes. Monitorea la latencia de publicación a visibilidad, los duplicados, las fugas de eliminación y el p99 de cada etapa.”
Análisis detallado paso a paso
Paso 1: Derivar presupuestos de arquitectura a partir de la capacidad
Las lecturas diarias del feed son:
50,000,000 DAU × 20 pages/day = 1,000,000,000 feed reads/day
1,000,000,000 / 86,400 ≈ 11,574 average read QPS
11,574 × 5 peak factor ≈ 57,870 peak read QPSLa creación de publicaciones promedia 10,000,000 / 86,400 ≈ 116 QPS. Si los autores normales hacen fan-out a 200 seguidores activos en promedio, producen unos dos mil millones de inserciones de referencias de candidatos por día, o 2,000,000,000 / 86,400 ≈ 23,148 inserciones por segundo en promedio. Una sola publicación con 50 millones de seguidores excede muchos segundos del presupuesto normal de escritura, por lo que un fan-out completo sincrónico es inseguro.
Mantener 500 referencias para cada uno de los 50 millones de usuarios activos produce 25 mil millones de referencias. Si una referencia aproximada utiliza 64 bytes para post_id, author_id, una puntuación inicial, marca de tiempo e indicadores (flags), el límite inferior lógico es de aproximadamente 1.6 TB antes de índices, sobrecarga del motor y réplicas. Por lo tanto, los timelines deben almacenar referencias acotadas, no cuerpos de publicaciones copiados, y utilizar almacenamiento en niveles según la actividad.
Paso 2: Definir la propiedad, las API y el modelo de datos mínimo
El servicio de publicaciones es propietario del cuerpo, el autor, la hora de creación, la visibilidad, la versión y el tombstone de eliminación. El servicio de grafo social es propietario de los índices de adyacencia de following y followers. El servicio de feeds posee las referencias de candidatos, las sesiones y los registros de impresiones. El almacenamiento de objetos y una CDN albergan las imágenes; un timeline contiene únicamente referencias a medios. Las API principales pueden ser:
POST /v1/posts create a post with Idempotency-Key
DELETE /v1/posts/{post_id} write a deletion tombstone
PUT /v1/users/{id}/following/{author} follow an author
DELETE /v1/users/{id}/following/{author} unfollow an author
GET /v1/feed?cursor=...&limit=20 read one ranked page
GET /v1/posts/{post_id} hydrate one visible postposts almacena el estado autoritativo por post_id y un índice reciente sobre (author_id, created_at, post_id). follows debe listar seguidos por espectador y particionar (shard) seguidores por autor. feed_inbox se particiona por viewer_id; su clave de ordenación incluye una puntuación de recuperación, hora de creación y post_id. feed_sessions almacena temporalmente una versión de ranking, los ID de candidatos ordenados y la expiración. Los eventos de impresión e interacción se envían a registros independientes para características y experimentos en lugar de actualizar sincrónicamente cada candidato durante una lectura.
La creación de publicaciones recibe una clave de idempotencia del cliente. La publicación y el evento de outbox se confirman en una sola transacción de base de datos, tras lo cual el autor puede leer desde la fuente de verdad de publicaciones. El bus proporciona entrega al menos una vez (at-least-once). Una escritura única o condicional de (viewer_id, post_id) hace converger el fan-out duplicado. Los eventos llevan la versión de la publicación para que un evento antiguo no pueda resucitar una publicación eliminada o recientemente restringida.
Paso 3: Utilizar fan-out híbrido para autores normales y de alto fan-out
Después de que un autor normal publica, el servicio de fan-out lee fragmentos (shards) de seguidores activos elegibles e inserta por lotes una referencia ligera en cada bandeja de entrada. Los workers rastrean el progreso con cursores de fragmentos e ID de eventos. Un lote que agota el tiempo de espera reintenta el mismo trabajo sin crear un segundo candidato. Los usuarios desconectados o inactivos durante mucho tiempo no necesitan materializarse de inmediato; sus candidatos recientes pueden reconstruirse a partir del grafo de seguimiento en su próxima visita.
Una publicación de alto fan-out se dirige únicamente al índice reciente de (author_id, created_at) y a una caché caliente. Cuando un espectador sigue a dichos autores, el agregador extrae (pull) en paralelo un número acotado de elementos recientes de cada uno y los combina con la bandeja de entrada. El límite no debe ser una constante permanente de conteo de seguidores. Estima el costo de escritura de eligible_active_followers × posts_per_window y compáralo con el costo esperado de lectura-combinación, el margen de cola disponible y el presupuesto de frescura de cinco segundos. Si un autor se vuelve popular o publica en ráfagas, el plano de control puede cambiar al autor al modo pull. Los lotes que ya están en cola pueden completarse de forma idempotente o cancelarse, pero ambas rutas no deben ejecutarse sin límites.
El pull aún puede crear un fan-out de lectura costoso cuando un espectador sigue a muchos autores de alto fan-out. El agregador limita los candidatos, la concurrencia y los plazos por fuente; almacena en caché los índices de autores recientes; y devuelve otros candidatos elegibles cuando una fuente agota el tiempo de espera. La preagregación regional o por grupos de seguimiento es posible, pero solo se justifica después de que el costo de combinación medido se convierta en un cuello de botella.
Paso 4: Separar la generación de candidatos, el filtrado, el ranking y la hidratación
La ruta de lectura consta de cuatro etapas:
- Leer un lote de candidatos de la bandeja de entrada de autores normales y lotes acotados de fuentes de alto fan-out y recomendación.
- Deduplicar por
post_id, luego verificar seguimientos, bloqueos, tombstones, visibilidad actual y política regional. - Utilizar una puntuación económica para reducir el conjunto, luego un modelo más pesado para la probabilidad de interacción, frescura, calidad de la fuente y retroalimentación negativa, seguido de restricciones de diversidad y frecuencia.
- Hidratar por lotes el cuerpo, el resumen del autor y los recuentos agregados para los 20 elementos finales, devolverlos y registrar las impresiones de forma asíncrona.
El relato de ingeniería publicado por Meta describe un agregador de feeds que recopila candidatos, objetos y características antes del ranking, con múltiples pasadas de modelos que reducen el cómputo. La arquitectura publicada de Pinterest separa igualmente los grupos de candidatos no vistos, la generación de contenido y un feed materializado. Un diseño para una entrevista no necesita copiar ninguno de los dos sistemas, pero estos relatos muestran por qué copiar publicaciones completas en una caché y ordenarlas allí carece de límites importantes.
La autorización y las restricciones de producto se aplican antes y después del ranking. El filtrado temprano ahorra trabajo; volver a verificar la versión de la publicación durante la hidratación bloquea una eliminación o restricción de visibilidad que llegue durante el ranking. La puntuación de un modelo es solo una entrada de ordenación y no puede reintroducir contenido invisible. Los recuentos de interacción pueden ser eventualmente consistentes. El autor, el cuerpo, la visibilidad y el tombstone provienen de la versión autoritativa de la publicación.
Paso 5: Estabilizar el ranking dinámico con una sesión de feed
Un offset repite u omite elementos cuando llega nuevo contenido o cambian las puntuaciones. Un keyset de (score, post_id) por sí solo también es insuficiente cuando el nuevo cálculo del ranking cambia la puntuación antes de la siguiente página. La primera solicitud puede clasificar hasta 500 ID de candidatos y almacenarlos bajo una feed_session_id de 30 minutos. Un cursor opaco contiene la sesión, la siguiente posición, la huella digital de la consulta y la firma. Las páginas posteriores leen por posición, vuelven a verificar la visibilidad y rellenan huecos.
Las publicaciones nuevas aparecen cuando el espectador actualiza o inicia una nueva sesión en lugar de insertarse en el medio. Las eliminaciones, bloqueos y restricciones de visibilidad se filtran de inmediato, por lo que una sesión actual puede perder un elemento; el agregador rellena a partir de candidatos posteriores de la sesión. Si la caché de sesión se pierde o expira, devuelve un resultado reconocible de cursor expirado para que el cliente pueda mantener los ID ya mostrados y actualizar. No apliques silenciosamente una posición antigua a un nuevo ranking.
Si almacenar 500 ID congelados es demasiado costoso, almacena una época de ranking y un keyset compuesto, y permite que el cliente envíe un resumen de los ID mostrados. Ese diseño utiliza menos almacenamiento de sesión, pero dificulta la deduplicación, los cambios de modelo y el relleno de eliminaciones. Elige en función de la duración del desplazamiento continuo, la tasa aceptable de duplicados y el presupuesto de sesión en lugar de tratar la codificación del cursor como la respuesta principal.
Paso 6: Hacer converger seguimientos, eliminaciones y cambios de visibilidad correctamente
Después de que se confirma un seguimiento (follow), la siguiente lectura del espectador puede extraer las publicaciones recientes del nuevo autor mientras se ejecuta un backfill acotado de forma asíncrona. Dejar de seguir (unfollow) y bloquear actualizan primero el grafo autoritativo; la ruta de lectura filtra inmediatamente a ese autor y luego limpia la bandeja de entrada de forma asíncrona. Millones de eliminaciones físicas no tienen que completarse antes de que cese la presentación. Si los eventos de seguimiento y publicación llegan desordenados, una versión de relación en el candidato es solo una optimización. La visibilidad final siempre utiliza la regla autoritativa actual.
Al eliminar una publicación o hacerla privada, el servicio de publicaciones confirma conjuntamente la nueva versión, el tombstone y el evento de outbox de alta prioridad. La invalidación de caché, la limpieza de búsquedas y la limpieza de bandejas de entrada pueden ser asíncronas, pero la hidratación del feed lee por lotes la versión actual y la filtra. Una caché caliente de tombstones agiliza las comprobaciones, mientras que el registro duradero de la publicación evita que el contenido obsoleto reaparezca tras una pérdida de caché. Un escaneo de reparación elimina referencias antiguas; la limpieza física no es la autorización.
Los "me gusta" y comentarios no deben reescribir la bandeja de entrada de cada seguidor cada vez que cambia una puntuación. Los eventos de interacción actualizan recuentos agregados y características, y los espectadores activos reclasifican los candidatos en su siguiente solicitud. El contenido extremadamente popular puede actualizar una caché de características compartida. Esto acepta una obsolescencia temporal en el ranking y evita convertir cada interacción en otro fan-out global.
Paso 7: Diseñar la degradación, la recuperación y los límites regionales
Durante un retraso en la cola de fan-out, protege primero la creación de publicaciones y las lecturas de feeds materializados. El feed puede devolver un conjunto de candidatos elegibles más antiguo y realizar lecturas acotadas de fuentes para los seguidos recientemente activos del espectador. La frescura puede degradarse; la autorización no. Si un autor crea un punto caliente en la cola, cámbialo al modo pull y limita los lotes sin terminar. Tras la recuperación, ponte al día de forma idempotente por hora de evento y versión. Monitorea la antigüedad del evento más viejo, no solo la longitud de la cola.
Si la caché de candidatos falla, lee menos candidatos de la bandeja de entrada duradera o devuelve una sesión almacenada. Si el ranking agota el tiempo de espera, utiliza una puntuación de frescura determinista más reglas de diversidad. Cuando el almacén autoritativo de publicaciones o de grafos no esté disponible, sirve únicamente contenido previamente verificado dentro de un TTL de autorización seguro. Después de ese TTL, falla o restringe los resultados en lugar de mostrar contenido cuyo acceso haya podido ser revocado.
En múltiples regiones, la región de origen del autor acepta una publicación y asigna un ID global, luego los eventos se replican asíncronamente a las regiones de lectura. El contenido ordinario puede tener frescura a nivel de segundos; el autor obtiene read-your-writes inmediato a través de su región de origen. Las eliminaciones, bloqueos y restricciones de visibilidad utilizan replicación de mayor prioridad, y las réplicas antiguas se restringen hasta que el servicio global de tombstones confirma el estado. Las escrituras activo-activo en el grafo de seguimiento introducen conflictos de relaciones y solo deben implementarse ante un requisito explícito.
Paso 8: Probar los límites con métricas e inyección de fallos
Las métricas centrales incluyen éxito de creación, visibilidad de publicación al primer seguidor y al 95 % de seguidores activos, rendimiento de fan-out por fragmento y retraso más antiguo, latencia de pull para alto fan-out, recuento de candidatos, tasa de deduplicación, tasa de filtrado, p99 de recuperación y ranking, tamaño del lote de hidratación, tasa de aciertos de caché, expiración de cursores, duplicados por página, páginas vacías y fuga de contenido eliminado o revocado. Esta última métrica debe mantenerse en cero y requiere sondas sintéticas activas.
La inyección de fallos debe cubrir eventos de publicación duplicados y desordenados; publicaciones reiteradas por un autor de 50 millones de seguidores; un autor cambiando de push a pull en medio del fan-out; seguimiento, unfollow y publicación concurrentes; eliminación o cambio de privacidad durante la paginación; pérdida de la caché de tombstones; un fragmento de seguidores lento; caída y puesta al día del bus de eventos; tiempo de espera agotado en ranking; nodo de sesión de feed caído; y retraso en la replicación regional. Cada escenario asegura que no aparezca contenido no autorizado, que las referencias converjan, que la degradación de latencia sea observable y que la recuperación no amplifique escrituras duplicadas.
Respuesta de muestra de alta calidad
“Con 50 millones de DAU y 20 páginas al día, obtengo aproximadamente 11,600 lecturas de feed por segundo en promedio y 58,000 en un pico de cinco veces. Diez millones de publicaciones diarias representan solo unos 116 QPS, pero 200 seguidores activos por autor normal expanden eso a unas 23,100 inserciones de candidatos por segundo en promedio. Una publicación para 50 millones de seguidores no puede utilizar push completo sincrónico.
Separaría la fuente de verdad de publicaciones, el grafo social y la bandeja de entrada de candidatos. La transacción de creación escribe la publicación y el outbox. Los eventos de autores normales se distribuyen (fan-out) por fragmentos de seguidores en bandejas de entrada por usuario con idempotencia en viewer_id + post_id. Los autores de alto fan-out solo escriben en un índice de autores recientes y se extraen (pull) y combinan durante las lecturas del feed. El límite push-pull utiliza seguidores activos, tasa de publicación, presupuesto de cola y costo de lectura. Los timelines almacenan referencias; los cuerpos y medios se hidratan por lotes solo para los elementos finales.
Para una lectura, el agregador obtiene candidatos acotados de la bandeja de entrada, fuentes de alto fan-out y recomendaciones. Filtra y deduplica por seguimientos actuales, bloqueos, tombstones y visibilidad antes de una recuperación económica, ranking más pesado, diversidad y control de frecuencia. La primera página congela hasta 500 candidatos en una sesión de feed de 30 minutos, y el cursor contiene la sesión más la posición. Las publicaciones nuevas esperan a una actualización, mientras que las eliminaciones y restricciones de visibilidad se filtran y rellenan en cada página.
Las eliminaciones y cambios de privacidad confirman una versión autoritativa más una invalidación de alta prioridad. La limpieza de caché y bandeja de entrada puede demorarse, pero cada presentación vuelve a verificar el estado. Durante un retraso en la cola, devuelve un feed materializado más antiguo y realiza lecturas acotadas de las fuentes; durante un tiempo de espera agotado en ranking, recurre a la frescura. La autorización nunca se degrada. Monitorearía la latencia de publicación a visibilidad, el retraso más antiguo, el p99 de cada etapa de ranking, la tasa de duplicados y la fuga de contenido revocado, e inyectaría ráfagas de celebridades, eventos duplicados, carreras de unfollow, eliminaciones, pérdida de caché y fallos regionales.”
Errores comunes
- Comparar únicamente el QPS bruto de lectura y escritura. La publicación promedia unos 116 QPS, pero el fan-out de seguidores domina las escrituras. Calcula la amplificación y el grafo de cola pesada.
- Utilizar fan-out-on-write para todos los autores. Un autor con 50 millones de seguidores provoca 50 millones de inserciones. Haz pull de los autores de alto fan-out durante las lecturas.
- Fijar el umbral de celebridad como una constante permanente. La actividad de los seguidores, la tasa de publicación y el margen de cola varían. Clasifica a partir de costos y SLOs y protege las transiciones.
- Copiar cuerpos completos en los timelines. Las ediciones, eliminaciones y cambios de visibilidad crean una superficie de invalidación enorme. Almacena referencias y vuelve a comprobar las versiones durante la hidratación.
- Usar
offsetpara páginas clasificadas dinámicamente. Las inserciones y el recálculo del ranking provocan duplicados y omisiones. Utiliza una sesión de feed de corta duración o un cursor compuesto versionado. - Filtrar unfollows y eliminaciones únicamente en procesos en segundo plano. El retraso en la limpieza filtra contenido. Verifica el grafo autoritativo, los tombstones y la visibilidad durante las lecturas.
- Afirmar entrega exactly-once de extremo a extremo a partir del bus de eventos. Los workers, el almacenamiento y los reintentos aún duplican. Haz converger con ID de eventos, versiones de publicaciones y claves únicas de candidatos.
- Omitir la autorización durante la degradación. Un orden desactualizado y menos candidatos pueden ser aceptables; mostrar contenido no autorizado no lo es. Asigna al filtrado de seguridad su propio presupuesto y política de fallos.
- Probar solo el tráfico normal. Los riesgos críticos son los autores de alto fan-out, el lag, el desorden de eventos y las carreras de autorización. La inyección de fallos debe cubrir esos límites.
Preguntas de seguimiento y respuestas
Pregunta de seguimiento 1: ¿Cómo evitan los duplicados ambas rutas cuando un autor normal de repente obtiene 50 millones de seguidores?
El plano de control cambia al autor al modo pull bajo una versión. Los trabajos de fan-out leen esa versión de modo y permiten que solo se complete un conjunto acotado de lotes ya reclamados. Los candidatos son idempotentes en (viewer_id, post_id), por lo que las copias enviadas (push) y extraídas (pull) se fusionan en una sola. La cola asigna una cuota a cada autor y las nuevas publicaciones durante la transición van directamente al índice de alto fan-out.
Pregunta de seguimiento 2: ¿Qué sucede con una sesión de feed antigua después de que el espectador deja de seguir a un autor?
Una sesión congela el orden, no la autorización. Cada lote de hidratación de página comprueba el grafo actual de seguimiento y bloqueo. El contenido dejado de seguir se filtra y se reemplaza con candidatos posteriores. La limpieza asíncrona de la bandeja de entrada ahorra espacio pero no proporciona semántica de autorización inmediata.
Pregunta de seguimiento 3: ¿Cómo admitirías un orden estrictamente cronológico?
Reutiliza las fuentes de candidatos y los filtros de visibilidad, cambia la clave de ordenación a (created_at, post_id) y utiliza paginación por keyset con una marca de tiempo de límite superior (snapshot time). Las nuevas publicaciones aparecen tras actualizar. Las fuentes de alto fan-out y la bandeja de entrada normal aún necesitan combinarse, pero la sesión de ranking más pesada es innecesaria.
Pregunta de seguimiento 4: ¿Cómo aíslas un aumento en la tasa de duplicados después del lanzamiento de un modelo de ranking?
Compara los recuentos de candidatos previos y posteriores a la deduplicación, los ID de generación de sesión, las posiciones del cursor y los registros de impresiones por versión del modelo. Determina si la duplicación entra a través de una fuente, la salida de la clasificación o una sesión perdida. Mapea los alias de fuente al post_id autoritativo. Si el almacenamiento de sesiones está fallando intermitentemente (flapping), revertir el modelo no ayudará; restaura el almacén de sesiones y haz que los clientes actualicen explícitamente.
Pregunta de seguimiento 5: ¿Cómo sabes si el límite de fan-out híbrido es el correcto?
Reproduce sin conexión la distribución real de conteo de seguidores y actividad. Estima para cada autor las escrituras precalculadas, la espera en cola, la combinación en lectura y el costo de aciertos de caché. Mueve el límite gradualmente en línea mientras observas el p99 de publicación a visible, el p99 de lectura del feed, el total de escrituras en almacenamiento y la tasa de degradación. Añade histéresis para que los autores no oscilen continuamente entre los modos push y pull.