Orivel Orivel
Abrir menu

Diseñar un servicio de notificaciones escalable

Compara respuestas de modelos para esta tarea benchmark de Diseño de sistemas y revisa puntuaciones, comentarios y ejemplos relacionados.

Inicia sesion o registrate para usar me gusta y favoritos. Registrarse

X f L

Indice

Resumen de la tarea

Generos de Comparacion

Diseño de sistemas

Modelo creador de la tarea

Modelos participantes

Modelos evaluadores

Enunciado de la tarea

Eres un ingeniero de software sénior en una empresa de redes sociales en rápido crecimiento. Tu tarea es diseñar un servicio de notificaciones escalable y fiable. Este servicio será responsable de enviar notificaciones a los usuarios sobre diversos eventos, como nuevos seguidores, me gusta en sus publicaciones, comentarios y mensajes directos.

Informacion complementaria

El sistema debe soportar los siguientes requisitos: 1. **Tipos de notificaciones:** Notificaciones push (a dispositivos móviles), notificaciones dentro de la aplicación (visibles dentro de la app) y notificaciones por correo electrónico. 2. **Escala:** La plataforma tiene 100 millones de usuarios activos diarios. El sistema debe manejar una carga pico de 50.000 solicitudes de notificación por segundo. 3. **Latencia:** El 99% de las notificaciones push y dentro de la aplicación deben entregarse al dispositivo de...

Mostrar mas

El sistema debe soportar los siguientes requisitos: 1. **Tipos de notificaciones:** Notificaciones push (a dispositivos móviles), notificaciones dentro de la aplicación (visibles dentro de la app) y notificaciones por correo electrónico. 2. **Escala:** La plataforma tiene 100 millones de usuarios activos diarios. El sistema debe manejar una carga pico de 50.000 solicitudes de notificación por segundo. 3. **Latencia:** El 99% de las notificaciones push y dentro de la aplicación deben entregarse al dispositivo del usuario dentro de 2 segundos desde que ocurre el evento. 4. **Fiabilidad:** El sistema debe garantizar entrega al menos una vez para todas las notificaciones. No se deben perder notificaciones, incluso en caso de fallos de componentes. 5. **Personalización:** Los usuarios deben poder configurar sus preferencias de notificación (p. ej., desactivar notificaciones por correo electrónico para los me gusta). Propón una arquitectura del sistema a alto nivel. Describe los componentes clave, sus responsabilidades y cómo interactúan. Explica tus elecciones de tecnologías (p. ej., bases de datos, colas de mensajes, caché) y discute los trade-offs involucrados. Aborda cómo tu diseño cumple con los requisitos de escalabilidad, baja latencia y fiabilidad.

Politica de evaluacion

Una respuesta de alta calidad presentará un diseño de sistema coherente y bien razonado. La evaluación se centrará en los siguientes aspectos: - **Claridad de la arquitectura:** La arquitectura propuesta debe ser lógica y estar claramente explicada, detallando los componentes principales (p. ej., API gateway, servicio de notificaciones, workers, colas de mensajes) y el flujo de datos entre ellos. - **Escalabilidad y rendimiento:** El diseño debe abordar eficazmente cómo manejaría la carga alta y los requisitos de...

Mostrar mas

Una respuesta de alta calidad presentará un diseño de sistema coherente y bien razonado. La evaluación se centrará en los siguientes aspectos: - **Claridad de la arquitectura:** La arquitectura propuesta debe ser lógica y estar claramente explicada, detallando los componentes principales (p. ej., API gateway, servicio de notificaciones, workers, colas de mensajes) y el flujo de datos entre ellos. - **Escalabilidad y rendimiento:** El diseño debe abordar eficazmente cómo manejaría la carga alta y los requisitos de baja latencia especificados. Esto incluye discutir estrategias como escalado horizontal, balanceo de carga y el uso de almacenes de datos y mecanismos de caché apropiados. - **Fiabilidad y tolerancia a fallos:** La respuesta debe demostrar comprensión de la construcción de sistemas resilientes. Debe explicar cómo el diseño asegura entrega al menos una vez y maneja fallos potenciales de componentes individuales, por ejemplo, mediante reintentos, redundancia y colas dead-letter. - **Elección de tecnologías y trade-offs:** La justificación para elegir tecnologías específicas (p. ej., Kafka vs. RabbitMQ, bases de datos NoSQL vs. SQL) debe ser sólida. La respuesta debe articular los compromisos del enfoque elegido, mostrando la comprensión de que no existe una solución 'perfecta' única.

Respuestas

Respuesta A: OpenAI GPT-5.5

Un servicio de notificaciones escalable debe construirse como una plataforma asíncrona y basada en eventos que separe la ingesta de eventos, la evaluación de preferencias, la persistencia de notificaciones, la entrega específica del canal y el seguimiento de la entrega. El principio de diseño más importante es que los sistemas de productos de origen, como seguidores, me gusta, comentarios y mensajes directos, no deben llamar de forma síncrona a los proveedores de notificaciones push móviles o a los dispositivos de los usuarios. Deben publicar eventos duraderos en una capa de mensajería, y la plataforma de notific...

Mostrar respuesta completa

Un servicio de notificaciones escalable debe construirse como una plataforma asíncrona y basada en eventos que separe la ingesta de eventos, la evaluación de preferencias, la persistencia de notificaciones, la entrega específica del canal y el seguimiento de la entrega. El principio de diseño más importante es que los sistemas de productos de origen, como seguidores, me gusta, comentarios y mensajes directos, no deben llamar de forma síncrona a los proveedores de notificaciones push móviles o a los dispositivos de los usuarios. Deben publicar eventos duraderos en una capa de mensajería, y la plataforma de notificaciones debe procesar esos eventos de forma independiente con sólidas garantías de reintento e idempotencia. A un alto nivel, la arquitectura contiene estos componentes: productores de eventos, una API de ingesta, un registro de eventos duradero, procesadores de notificaciones, un servicio de preferencias del usuario, un servicio de plantillas y personalización, un almacén de notificaciones, colas de distribución por canal, trabajadores de entrega específicos del canal, integraciones de proveedores de terceros, una puerta de enlace en tiempo real para la entrega dentro de la aplicación e infraestructura de observabilidad/reintentos. Los servicios de producto generan eventos de notificación cuando ocurren acciones dirigidas al usuario. Por ejemplo, el servicio de grafo social emite un evento de nuevo seguidor, el servicio de publicaciones emite un evento de me gusta o comentario, y el servicio de mensajería emite un evento de mensaje directo. Cada evento contiene un ID de evento, tipo de evento, ID de usuario actor, ID de usuario destinatario o conjunto de destinatarios, ID de objeto, marca de tiempo de creación y metadatos necesarios para la representación. Los productores envían estos eventos a una API de ingesta de notificaciones o directamente a un bus de mensajes duradero. La API de ingesta valida el esquema, autentica al productor, asigna o verifica una clave de idempotencia y escribe el evento en el registro duradero antes de confirmar al productor. Esto evita la pérdida de notificaciones si los procesadores posteriores fallan. Para la columna vertebral de mensajería duradera, usaría Apache Kafka, Amazon MSK, Google Pub/Sub o Pulsar. Kafka/Pulsar son buenas opciones porque proporcionan alto rendimiento, ordenación particionada, retención, reproducción, grupos de consumidores y almacenamiento duradero. A 50.000 solicitudes de notificación por segundo, el flujo de eventos debe particionarse por ID de usuario destinatario para el orden a nivel de usuario cuando sea necesario, o por ID de evento cuando el orden estricto por usuario sea menos importante. La partición por destinatario ayuda a evitar notificaciones dentro de la aplicación fuera de orden para un solo usuario, pero puede crear particiones calientes para cuentas de celebridades o eventos grupales. Para casos de distribución masiva, como un evento que produce notificaciones a millones de seguidores, un servicio de distribución masiva separado debe dividir a los destinatarios en lotes y publicar trabajos de notificación derivados por destinatario en muchas particiones. Los procesadores de notificaciones consumen eventos sin procesar del registro de eventos duradero. Sus responsabilidades son determinar los destinatarios, obtener las preferencias del usuario, aplicar límites de velocidad y horas de silencio, desduplicar eventos, generar registros de notificación específicos del canal y publicar trabajos de entrega. Para eventos directos como un comentario en la publicación de un usuario, el conjunto de destinatarios es pequeño. Para eventos de distribución masiva como la publicación de una celebridad, el procesador debe evitar hacer toda la distribución de forma síncrona. Debe crear un trabajo de distribución masiva y procesar los destinatarios en fragmentos, utilizando lecturas por lotes del almacén de grafos sociales. Esto evita que un evento muy grande bloquee la ruta de baja latencia para las notificaciones normales. El servicio de preferencias del usuario almacena la configuración, como si un usuario desea notificaciones push, dentro de la aplicación o por correo electrónico para me gusta, comentarios, seguidores y mensajes directos. Las preferencias deben almacenarse en una base de datos de alta disponibilidad como DynamoDB, Cassandra, ScyllaDB o una base de datos relacional fragmentada. El patrón de acceso es principalmente búsqueda de clave-valor por ID de usuario y tipo de notificación, por lo que un almacén distribuido de clave-valor o de columnas anchas es apropiado. Para cumplir el objetivo de latencia de 2 segundos, las preferencias también deben almacenarse en caché en Redis, Memcached o una caché local en memoria con TTL cortos. Las actualizaciones de preferencias se escriben en la fuente de verdad de la base de datos y se propagan a las cachés mediante eventos de invalidación. La contrapartida es que la antigüedad de la caché puede hacer que una preferencia cambiada recientemente tarde unos segundos en aplicarse; si se requiere una consistencia estricta de las preferencias, los procesadores pueden leer directamente de la base de datos en caso de fallo de caché o para usuarios actualizados recientemente. El servicio de plantillas y personalización representa el contenido de las notificaciones. Mapea tipos de eventos a plantillas como "Alex le dio me gusta a tu publicación" o "Maya comentó: ...". Maneja la localización, los enlaces profundos, las URL de imágenes y las restricciones de carga útil específicas del canal. Las definiciones de plantillas se pueden almacenar en una base de datos de configuración y almacenar en caché de forma agresiva, ya que cambian con poca frecuencia. La representación debe realizarse antes de publicar los trabajos de entrega para que cada trabajo sea autónomo y se pueda reintentar de forma segura. El almacén de notificaciones es la fuente de verdad para las notificaciones dentro de la aplicación visibles para el usuario y el estado de entrega. Una buena opción es Cassandra, DynamoDB, ScyllaDB u otro almacén escalable horizontalmente particionado por ID de usuario destinatario y ordenado por marca de tiempo de notificación. El patrón de acceso principal es "obtener las últimas notificaciones para el usuario X", por lo que la tabla puede usar recipient_user_id como clave de partición y created_at o notification_id como clave de ordenación. El servicio escribe un registro de notificación dentro de la aplicación antes o de forma atómica con la publicación del trabajo de entrega dentro de la aplicación. Los registros incluyen ID de notificación, destinatario, tipo, contenido, estado, estado de leído/no leído, marcas de tiempo y clave de desduplicación. Este almacén garantiza que, incluso si la entrega de WebSocket falla, el usuario aún pueda ver la notificación al abrir la aplicación. Después de aplicar las preferencias y las plantillas, el procesador publica trabajos en colas de canal separadas: cola push, cola dentro de la aplicación y cola de correo electrónico. Separar las colas es importante porque cada canal tiene diferentes características de latencia y confiabilidad. Las colas push y dentro de la aplicación son sensibles a la latencia y deben aprovisionarse para un alto rendimiento con una cola mínima. El correo electrónico es menos sensible a la latencia y puede tolerar retrasos más largos, limitación de proveedores y procesamiento por lotes. Las colas separadas también evitan que un proveedor de correo electrónico lento afecte la entrega push. Los trabajadores de entrega push consumen de la cola push y envían notificaciones a Apple Push Notification service, Firebase Cloud Messaging u otros proveedores de notificaciones push móviles. Los tokens de dispositivo se almacenan en un registro de dispositivos indexado por ID de usuario, con token, plataforma, versión de la aplicación, idioma y marca de tiempo de la última vez visto. El registro puede usar un almacén distribuido de clave-valor y almacenar en caché los tokens activos. Los trabajadores push deben manejar las respuestas del proveedor, eliminar tokens no válidos, reintentar fallos transitorios con retroceso exponencial y registrar los intentos de entrega. Los acuses de recibo del proveedor push no garantizan que el usuario haya visto la notificación, solo que el proveedor la aceptó, por lo que el sistema debe distinguir la aceptación del proveedor de la recepción real del usuario. La entrega dentro de la aplicación tiene dos rutas. Primero, la notificación se persiste en el almacén de notificaciones. Segundo, un trabajador de entrega dentro de la aplicación la envía a los dispositivos actualmente conectados del usuario a través de una puerta de enlace en tiempo real. La puerta de enlace se puede implementar utilizando WebSockets, flujos HTTP/2 o una infraestructura de conexión persistente similar a la de notificaciones push móviles. Los nodos de la puerta de enlace mantienen el estado de conexión del usuario en memoria y publican información de presencia en un servicio de presencia distribuido. Una capa de enrutamiento o un mapa de presencia basado en Redis/NATS indica al trabajador dentro de la aplicación qué nodo de la puerta de enlace posee actualmente la conexión de un usuario. Si el usuario está desconectado o falla el envío de la puerta de enlace, no se pierde ninguna notificación porque la notificación persistida se obtendrá a través de la API de la bandeja de entrada de notificaciones de la aplicación en la próxima sesión. Para baja latencia, los nodos de la puerta de enlace deben implementarse regionalmente cerca de los usuarios y la cola dentro de la aplicación debe ser procesada por trabajadores en la misma región siempre que sea posible. Los trabajadores de entrega de correo electrónico consumen de la cola de correo electrónico y envían a través de proveedores como SES, SendGrid o Mailgun. Deben admitir la conmutación por error del proveedor, el manejo de rebotes, las listas de supresión, el cumplimiento de la cancelación de suscripción y los límites de velocidad por proveedor. Las notificaciones por correo electrónico se pueden agrupar o resumir para tipos de eventos de baja prioridad como los me gusta, mientras que los mensajes directos o los eventos relacionados con la seguridad pueden enviarse de inmediato. Dado que el correo electrónico es más lento y costoso, las preferencias del usuario y la limitación de velocidad son especialmente importantes. La confiabilidad se logra mediante escrituras duraderas, procesamiento al menos una vez, idempotencia, reintentos y colas de mensajes fallidos. La capa de ingesta solo confirma a los productores después de que el evento se escribe de forma duradera en Kafka/Pulsar. Los consumidores confirman los offsets solo después de haber escrito con éxito los registros de notificación y publicado los trabajos de canal posteriores. Dado que los reintentos pueden crear duplicados, cada evento y notificación debe tener claves de idempotencia estables. Por ejemplo, una clave de notificación de me gusta podría ser recipient_id + actor_id + post_id + event_type, mientras que una clave de notificación de comentario podría incluir comment_id. El almacén de notificaciones garantiza la unicidad de esta clave, o los procesadores realizan escrituras condicionales. Los trabajadores de entrega también deben usar IDs de intento y transiciones de estado idempotentes para que los trabajos duplicados no creen registros dentro de la aplicación duplicados o correos electrónicos duplicados cuando sea evitable. El sistema garantiza la entrega al menos una vez, no exactamente una vez, por lo que los clientes también deben desduplicar por ID de notificación. Se requieren colas de mensajes fallidos para mensajes venenosos, eventos mal formados, fallos repetidos del proveedor o registros que no se pueden representar. Una herramienta de reproducción debe permitir a los operadores solucionar problemas y reprocesar eventos del registro duradero original o de la cola de mensajes fallidos. La retención de Kafka debe ser lo suficientemente larga para admitir la recuperación operativa, por ejemplo, varios días. Los metadatos críticos y el estado de entrega también deben persistirse en la base de datos de notificaciones para fines de auditoría. Para cumplir con el requisito de escala de 100 millones de usuarios activos diarios y 50.000 solicitudes de notificación por segundo, todos los servicios principales deben ser escalables horizontalmente y sin estado siempre que sea posible. Las API de ingesta se escalan detrás de balanceadores de carga. Los temas de Kafka/Pulsar están particionados lo suficientemente amplios como para admitir el rendimiento máximo y el paralelismo de los consumidores. Los procesadores y los trabajadores de entrega se ejecutan en grupos de escalado automático o implementaciones de Kubernetes y escalan según el rezago de la cola, la CPU, la latencia del proveedor y la tasa de solicitudes. Las bases de datos se particionan por ID de usuario para distribuir la carga. Los problemas de claves calientes deben manejarse con trabajos de distribución fragmentados, manejo especial de usuarios celebridades y contrapresión. Para una distribución masiva extremadamente grande, el sistema puede usar distribución pull para notificaciones de baja prioridad: en lugar de escribir una notificación por seguidor de inmediato, almacena el evento una vez y lo materializa cuando un usuario abre la aplicación. Esto reduce la amplificación de escritura pero aumenta la complejidad de lectura y puede no ser apropiado para mensajes directos o comentarios. El objetivo de latencia de 2 segundos para el 99% de las notificaciones push y dentro de la aplicación se cumple manteniendo la ruta crítica corta: productor a registro duradero, búsqueda de preferencias del procesador desde la caché, escritura del registro de notificación, publicación en la cola del canal y entrega inmediata por trabajadores activos. Los trabajadores push y dentro de la aplicación deben estar sobrerre-aprovisionados para la carga máxima, y las colas deben usar carriles de prioridad para que los mensajes directos y los comentarios se procesen antes que los me gusta de baja prioridad. La implementación regional reduce la latencia de la red. Para usuarios en múltiples regiones, el enrutamiento puede basarse en la región de origen del destinatario, con replicación entre regiones para recuperación ante desastres. El diseño debe medir la latencia de extremo a extremo desde la creación del evento hasta la aceptación del proveedor o el envío de la puerta de enlace, no solo el tiempo de procesamiento interno. La observabilidad es esencial. La plataforma debe rastrear la tasa de solicitudes, el rezago de la cola por partición, la latencia de procesamiento, la tasa de aciertos de la caché de preferencias, los fallos de creación de notificaciones, las tasas de error del proveedor, los recuentos de reintentos, el volumen de mensajes fallidos, el éxito de la entrega de WebSocket, la latencia de aceptación del proveedor push y la latencia de extremo a extremo p50/p95/p99. El rastreo distribuido debe transportar el ID de evento original a través de cada componente. Las alertas deben activarse ante el crecimiento del rezago de la cola, fallos elevados, limitación de proveedores, latencia de escritura de la base de datos y SLO de latencia incumplidos. Existen varias compensaciones. Kafka o Pulsar agregan complejidad operativa pero proporcionan la durabilidad, la reproducción y el rendimiento necesarios para la entrega al menos una vez a esta escala. Cassandra o DynamoDB proporcionan alta escalabilidad de escritura y disponibilidad, pero ofrecen consultas ad hoc limitadas, por lo que los análisis deben enviarse a un almacén de datos separado. El almacenamiento en caché de preferencias mejora la latencia pero introduce problemas de consistencia de corta duración. La entrega al menos una vez es mucho más simple y confiable que la entrega exactamente una vez, pero el sistema debe tolerar duplicados utilizando claves de idempotencia y desduplicación del lado del cliente. La distribución al escribir (fanout-on-write) proporciona lecturas rápidas de la bandeja de entrada pero puede ser costosa para eventos de alto número de seguidores; la distribución al leer (fanout-on-read) ahorra escrituras pero complica la clasificación y la materialización en el momento de la lectura. Un modelo híbrido suele ser el mejor: distribución al escribir para notificaciones directas, importantes y de volumen normal, y distribución al leer o distribución por lotes para eventos masivos de baja prioridad. En resumen, el servicio debe utilizar una arquitectura duradera basada en eventos con flujos de mensajes particionados, procesadores sin estado, búsquedas de preferencias en caché, almacenamiento persistente de notificaciones, colas de canal separadas, trabajadores específicos del canal y mecanismos sólidos de reintento/idempotencia. Este diseño se escala horizontalmente a 50.000 solicitudes de notificación por segundo, mantiene la entrega push y dentro de la aplicación dentro del objetivo p99 de 2 segundos a través de la caché y colas de baja latencia, y garantiza que las notificaciones no se pierdan al persistir eventos y registros de notificación antes de confirmar el progreso.

Resultado

#1 | Ganador

Votos ganadores

3 / 3

Puntuacion media

89
Modelos evaluadores OpenAI GPT-5.4

Puntuacion total

92

Comentario general

La respuesta A presenta una arquitectura de alto nivel completa y coherente con responsabilidades claras de los componentes, un flujo de datos realista y una gran atención a las preocupaciones operativas. Aborda directamente todos los canales requeridos, los objetivos de latencia, la semántica de entrega 'al menos una vez', el manejo de preferencias, los escenarios de fanout a gran escala, la idempotencia, los reintentos, la persistencia y la observabilidad. Su discusión tecnológica es equilibrada y matizada, con compensaciones concretas como fanout-en-escritura frente a fanout-en-lectura, consistencia de caché y la complejidad operativa de Kafka/Pulsar. La principal debilidad es que es algo larga y podría ser más condensada, pero técnicamente es sólida y está bien alineada con la solicitud.

Ver detalle de evaluacion

Calidad de la arquitectura

Peso 30%
92

La arquitectura está bien estructurada y es de extremo a extremo: ingesta, registro duradero, procesadores, servicio de preferencias, servicio de plantillas, almacén de notificaciones, colas por canal, trabajadores de entrega, puerta de enlace en tiempo real y observabilidad encajan coherentemente. También distingue el estado persistido en la aplicación de la entrega en tiempo real y maneja el fanout como una preocupación de primera clase.

Integridad

Peso 20%
94

Cubre todos los tipos de notificación requeridos, preferencias de usuario, escala, latencia, fiabilidad, elecciones tecnológicas y compensaciones. También añade preocupaciones prácticas importantes que faltaban, como el registro de dispositivos, colas de mensajes fallidos, claves de idempotencia, lotes de fanout, despliegue regional, observabilidad y herramientas de recuperación.

Analisis de compromisos

Peso 20%
91

La respuesta ofrece un sólido razonamiento comparativo para Kafka/Pulsar, opciones de NoSQL, consistencia de caché, 'al menos una vez' frente a 'exactamente una vez', y fanout-en-escritura frente a fanout-en-lectura. Estas compensaciones son concretas y están directamente ligadas al comportamiento de la carga de trabajo y del producto.

Escalabilidad y fiabilidad

Peso 20%
93

Esta es una fortaleza importante. El diseño explica claramente la escalabilidad horizontal, la partición, el aislamiento de colas por canal, la mitigación de claves 'hot', los reintentos, el manejo de offsets del consumidor, las escrituras condicionales para deduplicación, las colas de mensajes fallidos, la repetición y la durabilidad antes del acuse de recibo. Soporta directamente la entrega 'al menos una vez' y el objetivo de 2 segundos con mecanismos realistas.

Claridad

Peso 10%
84

La explicación es clara, lógicamente ordenada y precisa a pesar de ser larga. Comunica bien el flujo de datos, aunque la longitud la hace ligeramente más densa y menos escaneable inmediatamente que una respuesta más estructurada.

Modelos evaluadores Google Gemini 2.5 Flash

Puntuacion total

92

Comentario general

La Respuesta A proporciona un diseño de sistema excepcionalmente detallado y robusto. Demuestra una profunda comprensión de los desafíos complejos de los sistemas distribuidos, como el fanout para cuentas de celebridades, la construcción específica de claves de idempotencia y los matices de la entrega al menos una vez. La arquitectura es muy granular, bien razonada y aborda explícitamente todos los requisitos con soluciones sofisticadas y discusiones sobre compensaciones, lo que refleja la experiencia esperada de un ingeniero de software senior.

Ver detalle de evaluacion

Calidad de la arquitectura

Peso 30%
95

La Respuesta A presenta una arquitectura muy detallada y lógica, separando claramente las responsabilidades y proporcionando soluciones robustas para escenarios complejos como el fanout a gran escala y la entrega en la aplicación de dos vías. Las interacciones de los componentes están bien definidas.

Integridad

Peso 20%
92

La Respuesta A aborda de manera integral todos los requisitos, incluidos temas avanzados como ejemplos específicos de claves de idempotencia, observabilidad detallada y estrategias de fanout matizadas (al escribir vs. al leer), lo que demuestra una comprensión muy completa.

Analisis de compromisos

Peso 20%
90

La Respuesta A integra discusiones sobre compensaciones a lo largo del diseño y destaca explícitamente las compensaciones fundamentales del diseño del sistema (por ejemplo, al menos una vez frente a exactamente una vez, estrategias de fanout), mostrando una profunda comprensión de las implicaciones más allá de las simples elecciones tecnológicas.

Escalabilidad y fiabilidad

Peso 20%
93

La Respuesta A ofrece una excelente cobertura tanto de escalabilidad como de fiabilidad, detallando mecanismos específicos como estrategias de partición, confirmaciones de offset del consumidor, escrituras duraderas antes del acuse de recibo, manejo de claves calientes y colas de prioridad, lo que demuestra un sólido dominio de los detalles de implementación.

Claridad

Peso 10%
88

La Respuesta A es muy clara, está bien estructurada y utiliza un lenguaje profesional, lo que facilita el seguimiento del complejo diseño a pesar de su profundidad. El flujo lógico es excelente.

Modelos evaluadores Anthropic Claude Opus 4.7

Puntuacion total

84

Comentario general

La Respuesta A ofrece un diseño de sistema impulsado por prosa y profundamente razonado que aborda problemas sutiles e importantes: particiones activas para la distribución de celebridades, distribución en escritura vs. distribución en lectura híbrida, construcción de claves de idempotencia, enrutamiento de presencia para WebSockets, despliegue regional, carriles de prioridad para colas y la distinción entre la aceptación del proveedor y la recepción del usuario. Los compromisos se discuten en contexto en lugar de enumerarse superficialmente. La narrativa es larga pero coherente y demuestra una profundidad de nivel superior. Debilidades menores: carece de un diagrama visual y de encabezados/tablas estructurados que facilitarían el escaneo.

Ver detalle de evaluacion

Calidad de la arquitectura

Peso 30%
85

Desglose completo de componentes con manejo sofisticado de la distribución, partición por destinatario, enrutamiento de presencia, colas de canal separadas y almacenamiento de notificaciones persistente como fuente de verdad. Aborda problemas sutiles como la distribución de celebridades y los carriles de prioridad.

Integridad

Peso 20%
85

Cubre la ingesta, el registro duradero, los procesadores, las preferencias, las plantillas, el almacenamiento de notificaciones, las colas de canal, los trabajadores, la puerta de enlace WebSocket, el registro de dispositivos, la DLQ, la observabilidad, el despliegue regional y el manejo explícito de los cuatro requisitos.

Analisis de compromisos

Peso 20%
85

Discute compromisos concretos en contexto: al menos una vez vs. exactamente una vez, distribución en escritura vs. distribución en lectura híbrida, estado obsoleto de la caché vs. consistencia, partición por destinatario vs. ID de evento, complejidad operativa de Kafka vs. beneficios de durabilidad.

Escalabilidad y fiabilidad

Peso 20%
85

Sólida historia de fiabilidad: escrituras duraderas antes del acuse de recibo, confirmaciones de desplazamiento después del éxito del sistema descendente, claves de idempotencia con ejemplos concretos, DLQ con herramientas de repetición, mitigación de claves activas, despliegue regional para latencia, carriles de prioridad.

Claridad

Peso 10%
70

Prosa bien estructurada pero muy larga y con pocas ayudas visuales; los párrafos densos dificultan el escaneo a pesar del flujo lógico.

## Arquitectura de Servicio de Notificaciones Escalable ### Descripción General del Sistema El servicio de notificaciones está diseñado como un sistema distribuido y basado en eventos que procesa notificaciones de forma asíncrona para manejar 50,000 solicitudes por segundo con una latencia inferior a 2 segundos para el 99% de las entregas. La arquitectura sigue un patrón de microservicios con una clara separación de responsabilidades. ### Arquitectura de Alto Nivel ``` Fuentes de Eventos → API Gateway → Servicio de Notificaciones → Cola de Mensajes → Trabajadores de Entrega...

Mostrar respuesta completa

## Arquitectura de Servicio de Notificaciones Escalable ### Descripción General del Sistema El servicio de notificaciones está diseñado como un sistema distribuido y basado en eventos que procesa notificaciones de forma asíncrona para manejar 50,000 solicitudes por segundo con una latencia inferior a 2 segundos para el 99% de las entregas. La arquitectura sigue un patrón de microservicios con una clara separación de responsabilidades. ### Arquitectura de Alto Nivel ``` Fuentes de Eventos → API Gateway → Servicio de Notificaciones → Cola de Mensajes → Trabajadores de Entrega ↓ Servicio de Preferencias ↓ Capa de Caché (Redis) ↓ Base de Datos (PostgreSQL) ``` ### Componentes Clave #### 1. API Gateway - **Responsabilidad:** Punto de entrada para todas las solicitudes de notificación. Maneja limitación de tasa, autenticación y validación de solicitudes. - **Tecnología:** NGINX o AWS API Gateway - **Razón:** Proporciona un único punto de entrada, permite la limitación de tráfico para evitar sobrecargas y distribuye el tráfico entre los servicios backend. #### 2. Servicio de Notificaciones (Procesamiento Central) - **Responsabilidad:** Recibe eventos de notificación, los valida, los enriquece con las preferencias del usuario y los publica en la cola de mensajes. - **Tecnología:** Microservicio sin estado (Node.js, Go o Java) - **Características Clave:** - Valida la carga útil de la notificación - Obtiene las preferencias del usuario de la caché - Determina los canales de notificación (push, in-app, email) según la configuración del usuario - Publica notificaciones enriquecidas en la cola de mensajes - **Escalabilidad:** Escalable horizontalmente; múltiples instancias detrás de un balanceador de carga #### 3. Cola de Mensajes (Bus de Eventos) - **Tecnología:** Apache Kafka o AWS SQS/SNS - **Razón:** - Desacopla la generación de notificaciones de la entrega - Proporciona durabilidad y capacidad de repetición para garantizar la entrega al menos una vez - Permite el procesamiento paralelo de notificaciones - Maneja picos de tráfico al almacenar temporalmente las solicitudes - **Configuración:** Múltiples particiones (ej. 100-200) para permitir el consumo paralelo - **Estructura de Temas:** Temas separados para notificaciones push, in-app y de correo electrónico para permitir una escalabilidad independiente #### 4. Servicio de Preferencias - **Responsabilidad:** Gestiona las preferencias y configuraciones de notificación del usuario. - **Tecnología:** Microservicio con backend PostgreSQL - **Características:** - Almacena las preferencias del usuario (tipos de notificación, canales, límites de frecuencia) - Proporciona una API para que los usuarios actualicen sus preferencias - Almacena en caché las preferencias en Redis para un acceso rápido - **Escalabilidad:** Servicio con alta carga de lectura; el almacenamiento en caché reduce significativamente la carga de la base de datos #### 5. Capa de Caché - **Tecnología:** Redis Cluster - **Propósito:** - Almacena en caché las preferencias del usuario (TTL: 1 hora) - Almacena en caché los tokens de dispositivos de usuario para notificaciones push - Almacena contadores de limitación de tasa - Reduce las consultas a la base de datos en más del 90% - **Razón:** Latencia inferior a milisegundos para la búsqueda de preferencias #### 6. Trabajadores de Entrega - **Trabajador de Notificaciones Push:** - Consume del tema push - Se integra con FCM (Firebase Cloud Messaging) y APNs (Apple Push Notification service) - Maneja la gestión de tokens de dispositivo y la limpieza de tokens inválidos - Implementa retroceso exponencial para reintentos - **Trabajador de Notificaciones In-App:** - Consume del tema in-app - Almacena notificaciones en una base de datos de series temporales (ej. Cassandra o ClickHouse) - Publica en servidores WebSocket para entrega en tiempo real - Mantiene el estado de notificación leído/no leído - **Trabajador de Notificaciones por Correo Electrónico:** - Consume del tema de correo electrónico - Agrupa correos electrónicos para mayor eficiencia - Se integra con el servicio de correo electrónico (SendGrid, AWS SES) - Implementa limitación de tasa para evitar filtros de spam #### 7. Servidor WebSocket - **Responsabilidad:** Mantiene conexiones persistentes con clientes móviles y web para notificaciones in-app en tiempo real. - **Tecnología:** Node.js con Socket.io o Go con gorilla/websocket - **Escalabilidad:** Servidores sin estado; utiliza pub/sub de Redis para comunicación entre servidores - **Respaldo:** Long-polling HTTP para clientes que no admiten WebSocket #### 8. Almacén de Notificaciones (Base de Datos de Series Temporales) - **Tecnología:** Cassandra o ClickHouse - **Propósito:** Almacena todas las notificaciones para auditoría, análisis e historial de notificaciones del usuario - **Razón:** Optimizado para cargas de trabajo con alta escritura y consultas por rango de tiempo - **Retención:** 90 días de historial de notificaciones #### 9. Registro de Dispositivos de Usuario - **Tecnología:** Redis + PostgreSQL - **Propósito:** Mantiene el mapeo de usuarios a sus dispositivos y tokens push - **Características:** - Rastrea el registro/anulación de registro de dispositivos - Almacena metadatos del dispositivo (SO, versión de la aplicación) - Maneja la actualización y anulación de tokens ### Flujo de Datos 1. **Ingesta de Eventos:** Las fuentes de eventos (acciones del usuario, eventos del sistema) envían solicitudes de notificación al API Gateway 2. **Validación y Enriquecimiento:** El Servicio de Notificaciones valida la carga útil y obtiene las preferencias del usuario de la caché 3. **Determinación de Canal:** Basado en las preferencias, la notificación se dirige al tema apropiado (push, in-app, email) 4. **Encolamiento:** La Cola de Mensajes almacena temporalmente las notificaciones y garantiza la durabilidad 5. **Entrega:** Trabajadores especializados consumen de los temas y entregan a través de los canales respectivos 6. **Acuse de Recibo:** Los trabajadores de entrega confirman la entrega exitosa y actualizan el estado de la notificación ### Cumplimiento de Requisitos #### Escalabilidad (50,000 req/seg) - **Escalado Horizontal:** Todos los componentes son sin estado y escalables horizontalmente - **Particionamiento de la Cola de Mensajes:** Temas de Kafka particionados entre múltiples brokers; cada partición puede manejar ~500-1000 req/seg - **Fragmentación de Base de Datos:** Datos de usuario fragmentados por user_id para distribuir la carga - **Estrategia de Caché:** Redis almacena en caché los datos

Resultado

#2

Votos ganadores

0 / 3

Puntuacion media

75
Modelos evaluadores OpenAI GPT-5.4

Puntuacion total

73

Comentario general

La respuesta B presenta un diseño razonable impulsado por eventos con los principales bloques de construcción esperados para un servicio de notificaciones, que incluyen puerta de enlace API, cola, servicio de preferencias, caché, trabajadores y entrega WebSocket. Aborda la escalabilidad, la latencia y la confiabilidad a un nivel alto decente e incluye algunas opciones de implementación y notas operativas. Sin embargo, es más genérico, tiene menos detalles precisos del flujo de extremo a extremo y proporciona un tratamiento más débil de problemas difíciles como la semántica de deduplicación, el orden de persistencia de notificaciones, el manejo de grandes distribuciones, particiones activas, repetición y mecanismos exactos para garantizar la ausencia de pérdidas ante fallas. Algunas opciones tecnológicas también están menos bien justificadas o son ligeramente inadecuadas, como ClickHouse para el historial de notificaciones y la mezcla de Kafka con SQS/SNS sin discutir sus diferentes semánticas.

Ver detalle de evaluacion

Calidad de la arquitectura

Peso 30%
72

La arquitectura incluye los principales componentes esperados y un flujo asíncrono sensato, pero se mantiene más genérica y omite algunos detalles estructurales importantes. No especifica completamente los límites de persistencia, las rutas de repetición o cómo algunos componentes se coordinan ante fallas, por lo que el diseño se siente menos robusto y menos profundamente pensado.

Integridad

Peso 20%
74

Cubre los requisitos principales de la pregunta y agrega temas operativos útiles, pero varias áreas se manejan de manera superficial. En particular, los eventos de gran distribución, el modelado detallado del estado de entrega, las garantías más sólidas de no pérdida y la interacción entre la persistencia y la entrega no se exploran con suficiente profundidad.

Analisis de compromisos

Peso 20%
70

Hay una tabla de compensaciones y cierta justificación, lo cual es útil, pero el razonamiento es relativamente superficial. Algunas opciones se presentan de manera demasiado amplia o ambigua, como Kafka o SQS/SNS indistintamente, sin discutir las diferencias semánticas que importan para este diseño.

Escalabilidad y fiabilidad

Peso 20%
73

La respuesta aborda la escalabilidad horizontal, las particiones, las reintentos y las DLQ, por lo que es correcta en la dirección. Sin embargo, el tratamiento de la confiabilidad es menos riguroso: los límites de acuse de recibo, las escrituras idempotentes, el orden, la repetición y el manejo de fallas no se describen con suficiente especificidad para justificar completamente los requisitos de no pérdida y al menos una vez a esta escala.

Claridad

Peso 10%
82

La respuesta es fácil de leer, está bien seccionada y es fácil de escanear. Su formato mejora la accesibilidad, aunque parte de esa claridad se logra a expensas de la profundidad técnica y la precisión.

Modelos evaluadores Google Gemini 2.5 Flash

Puntuacion total

80

Comentario general

La Respuesta B presenta un diseño de sistema claro y bien organizado. Su uso de un diagrama de alto nivel, viñetas y una tabla dedicada de compensaciones mejora la legibilidad. Cubre todos los requisitos principales de manera efectiva, pero la profundidad del detalle y la sofisticación de las soluciones para escenarios complejos no son tan pronunciadas como en la Respuesta A. Si bien es sólida, carece de algunas de las consideraciones avanzadas presentes en la Respuesta A.

Ver detalle de evaluacion

Calidad de la arquitectura

Peso 30%
80

La Respuesta B proporciona una arquitectura de alto nivel clara con un diagrama útil. Sin embargo, algunos componentes como el 'Servicio de Notificaciones' son menos granulares que en la Respuesta A, y ofrece menos detalles sobre el manejo de escenarios complejos de distribución.

Integridad

Peso 20%
80

La Respuesta B cubre todos los requisitos principales, pero la profundidad del detalle para ciertos aspectos, como mecanismos específicos de idempotencia o consideraciones avanzadas de distribución, es menos extensa en comparación con la Respuesta A.

Analisis de compromisos

Peso 20%
75

La Respuesta B proporciona una tabla clara para las elecciones tecnológicas y sus compensaciones, que está bien presentada. Sin embargo, las compensaciones se centran principalmente en los pros y los contras de la tecnología elegida en lugar de implicaciones más amplias del diseño del sistema, lo que la hace menos profunda que la Respuesta A.

Escalabilidad y fiabilidad

Peso 20%
82

La Respuesta B ofrece una buena cobertura de escalabilidad y confiabilidad, mencionando escalado horizontal, particionamiento de Kafka, fragmentación de bases de datos, almacenamiento en caché, reintentos y DLQ. Sin embargo, carece de algunos de los detalles de implementación granulares y estrategias específicas que se encuentran en la Respuesta A.

Claridad

Peso 10%
90

La Respuesta B es excepcionalmente clara y bien organizada, utilizando encabezados, viñetas, un diagrama de alto nivel y una tabla dedicada de compensaciones. La sección 'Cumplimiento de Requisitos' es particularmente efectiva por su claridad y franqueza.

Modelos evaluadores Anthropic Claude Opus 4.7

Puntuacion total

71

Comentario general

La respuesta B está bien organizada con encabezados claros, un boceto de diagrama y una tabla de compensaciones, lo que facilita su lectura. Cubre los componentes principales (API gateway, Kafka, Redis, workers, WebSocket, Cassandra) y aborda cada requisito explícitamente. Sin embargo, el diseño es más superficial: no aborda seriamente la amplificación de fanout para usuarios famosos, las estrategias de partición, el manejo de claves 'hot', el enrutamiento de presencia a través de nodos WebSocket, ni los matices del diseño de claves de idempotencia. Las compensaciones se presentan como una tabla pero carecen de profundidad. Se menciona PostgreSQL para las preferencias a esta escala sin una justificación sólida dado el patrón de acceso clave-valor.

Ver detalle de evaluacion

Calidad de la arquitectura

Peso 30%
70

Arquitectura estándar sólida con todos los componentes esperados claramente identificados, pero el tratamiento es más a nivel de libro de texto. Carece de profundidad en la amplificación de fanout, claves 'hot' de partición y enrutamiento de presencia/conexión a través de nodos WebSocket.

Integridad

Peso 20%
75

Cubre todos los componentes principales y se mapea explícitamente a cada requisito, además de preocupaciones operativas como despliegue, costo y cuellos de botella. Omite el servicio de plantillas/renderizado y el manejo detallado de fanout.

Analisis de compromisos

Peso 20%
65

Proporciona una tabla de compensaciones que enumera pros y contras por tecnología, pero el razonamiento es breve y genérico. No justifica profundamente opciones como PostgreSQL para preferencias a esta escala ni discute las compensaciones semánticas de entrega.

Escalabilidad y fiabilidad

Peso 20%
70

Aborda el factor de replicación, reintentos con retroceso, DLQ, idempotencia y escalado horizontal, pero el tratamiento es de alto nivel. Las afirmaciones cuantitativas (por ejemplo, 500-1000 req/seg por partición, 80% de reducción de caché) se afirman sin matices.

Claridad

Peso 10%
80

Excelente uso de encabezados, viñetas, boceto de diagrama y tabla de compensaciones que facilitan la navegación y revisión del diseño.

Resumen comparativo

Para cada tarea y discusion, el orden final se decide por agregacion de rangos por evaluador (rango promedio + desempate Borda). La puntuacion media se muestra como referencia.

Evaluadores: 3

Votos ganadores

3 / 3

Puntuacion media

89
Ver esta respuesta

Votos ganadores

0 / 3

Puntuacion media

75
Ver esta respuesta

Resultados de evaluacion

Modelos evaluadores Anthropic Claude Opus 4.7

Motivo del ganador

La Respuesta A gana en los criterios de mayor peso (calidad de la arquitectura 30% y razonamiento de compensaciones 20%) debido a una participación sustancialmente más profunda en desafíos de diseño de sistemas no obvios como el sharding de fanout, particiones activas, fanout híbrido en escritura/lectura, construcción de claves de idempotencia y enrutamiento de presencia. Si bien la Respuesta B tiene una mejor claridad visual y formato, su profundidad técnica es menor, y estas ventajas de formato no compensan el razonamiento arquitectónico superior de A bajo los pesos dados.

Modelos evaluadores Google Gemini 2.5 Flash

Motivo del ganador

La Respuesta A gana debido a su profundidad, detalle y enfoque integral superiores en el diseño del sistema. Proporciona componentes arquitectónicos más granulares, aborda casos extremos complejos como la distribución para usuarios famosos y ofrece una discusión más profunda de las compensaciones más allá de las simples elecciones tecnológicas. Si bien la Respuesta B es clara y está bien estructurada, la Respuesta A demuestra un mayor nivel de experiencia esperado de un ingeniero de software senior que diseña un servicio de notificación altamente escalable y confiable.

Modelos evaluadores OpenAI GPT-5.4

Motivo del ganador

La respuesta A gana porque sus fortalezas ponderadas son significativamente mayores en los criterios más importantes: calidad de la arquitectura, completitud, razonamiento de compensaciones y escalabilidad/fiabilidad. Proporciona una descomposición del sistema más realista, explica cómo interactúan los componentes en escenarios de fallo y muestra una comprensión más profunda de la entrega al menos una vez, la idempotencia, la persistencia, las colas, la difusión, las rutas de baja latencia y la recuperación operativa. La respuesta B es sólida pero más genérica y menos rigurosa en los aspectos de diseño difíciles requeridos por la indicación.

X f L