Orivel Orivel
Abrir menu

Diseñar un servicio de acortamiento de URL

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

Diseña un servicio público de acortamiento de URL similar a un acortador de enlaces básico. El servicio debe permitir a los usuarios enviar una URL larga y recibir un código corto, y después redirigir a los visitantes desde la URL corta al destino original. En tu respuesta, propone un diseño práctico de alto nivel que cubra: - requisitos funcionales básicos - requisitos no funcionales clave - principales puntos finales de la API - modelo de datos - cómo se generan los códigos cortos y cómo se garantiza su unicidad...

Mostrar mas

Diseña un servicio público de acortamiento de URL similar a un acortador de enlaces básico. El servicio debe permitir a los usuarios enviar una URL larga y recibir un código corto, y después redirigir a los visitantes desde la URL corta al destino original. En tu respuesta, propone un diseño práctico de alto nivel que cubra: - requisitos funcionales básicos - requisitos no funcionales clave - principales puntos finales de la API - modelo de datos - cómo se generan los códigos cortos y cómo se garantiza su unicidad - flujo de peticiones de lectura y escritura - opciones de almacenamiento y estrategia de caché - enfoque de escalado para tráfico de lectura intensivo - manejo de enlaces expirados o eliminados - prevención básica de abusos y limitación de tasa - consideraciones de fiabilidad y cuellos de botella probables - compensaciones y cualquier suposición Mantén el diseño a un nivel medio de profundidad: lo suficientemente concreto como para ser implementable, pero sin entrar en detalles específicos de proveedores o en minucias exclusivas de producción.

Informacion complementaria

Asume que el servicio debe manejar aproximadamente 20 millones de nuevos enlaces cortos por mes y aproximadamente 200 millones de redirecciones por mes. La mayor parte del tráfico son lecturas. Los alias personalizados son opcionales, pero deben discutirse brevemente. La analítica más allá de los simples recuentos de clics queda fuera de alcance.

Politica de evaluacion

Una respuesta sólida debe presentar una arquitectura coherente que esté alineada con la carga de trabajo, explicar los componentes principales y el flujo de datos con claridad, y justificar las decisiones de diseño importantes. Debe cubrir la unicidad de los códigos cortos, la persistencia, la latencia de redirección, el uso de caché y el escalado para tráfico mayoritariamente de lectura. Buenas respuestas deben mencionar formas realistas de las API, campos de datos sensatos, comportamiento de eliminación o caducid...

Mostrar mas

Una respuesta sólida debe presentar una arquitectura coherente que esté alineada con la carga de trabajo, explicar los componentes principales y el flujo de datos con claridad, y justificar las decisiones de diseño importantes. Debe cubrir la unicidad de los códigos cortos, la persistencia, la latencia de redirección, el uso de caché y el escalado para tráfico mayoritariamente de lectura. Buenas respuestas deben mencionar formas realistas de las API, campos de datos sensatos, comportamiento de eliminación o caducidad, y controles básicos contra abusos. Deben reconocer compensaciones, como generación de códigos aleatorios frente a secuenciales, SQL frente a NoSQL, y consistencia de caché frente a simplicidad. Las respuestas deben mantenerse enfocadas en el diseño de sistemas en lugar de desviarse hacia detalles de implementación irrelevantes.

Respuestas

Servicio de Acortamiento de URL — Diseño de Alto Nivel REQUISITOS FUNCIONALES Los usuarios pueden enviar una URL larga y recibir un código corto único (p. ej., https://short.ly/aB3xYz). Visitar la URL corta redirige el navegador a la ubicación de destino original. Los enlaces cortos opcionalmente caducan después de un TTL configurable. Los usuarios pueden solicitar opcionalmente un alias personalizado. Se mantiene un contador básico de clics por enlace. REQUISITOS NO FUNCIONALES El sistema debe manejar aproximadamente 20 millones de escrituras y 200 millones de lecturas por mes, lo que se traduce en unas 8 escr...

Mostrar respuesta completa

Servicio de Acortamiento de URL — Diseño de Alto Nivel REQUISITOS FUNCIONALES Los usuarios pueden enviar una URL larga y recibir un código corto único (p. ej., https://short.ly/aB3xYz). Visitar la URL corta redirige el navegador a la ubicación de destino original. Los enlaces cortos opcionalmente caducan después de un TTL configurable. Los usuarios pueden solicitar opcionalmente un alias personalizado. Se mantiene un contador básico de clics por enlace. REQUISITOS NO FUNCIONALES El sistema debe manejar aproximadamente 20 millones de escrituras y 200 millones de lecturas por mes, lo que se traduce en unas 8 escrituras/segundo y 80 lecturas/segundo en promedio, con picos varias veces superiores. La latencia de redirección debe ser inferior a 50 ms en el percentil 95. El servicio debe tener alta disponibilidad (objetivo de 99,9% de tiempo de actividad). Los códigos cortos deben ser globalmente únicos. El sistema debe ser escalable horizontalmente y tolerar fallos de un solo nodo de forma elegante. ENDPOINTS DE API POST /api/links acepta un cuerpo JSON con los campos: longUrl (obligatorio), customAlias (opcional), ttlDays (opcional). Devuelve una respuesta JSON que contiene shortCode y shortUrl. Esta es la ruta de escritura. GET /{shortCode} es el endpoint de redirección. El servidor busca el código y responde con HTTP 301 (permanente) o 302 (temporal, preferido para análisis) a la URL original. GET /api/links/{shortCode} devuelve metadatos: URL original, hora de creación, caducidad, recuento de clics. DELETE /api/links/{shortCode} marca un enlace como eliminado (eliminación lógica). MODELO DE DATOS Una única tabla principal, links, contiene los datos centrales. Columnas clave: short_code (varchar, clave primaria), long_url (text, no nulo), created_at (timestamp), expires_at (timestamp, anulable), is_deleted (boolean, por defecto false), click_count (integer, por defecto 0), owner_id (varchar, anulable para enlaces anónimos). Un índice en expires_at soporta barridos de caducidad eficientes. Si se admiten alias personalizados, short_code se establece simplemente en el valor proporcionado por el usuario tras una comprobación de unicidad. GENERACIÓN DE CÓDIGOS CORTOS El enfoque por defecto utiliza una codificación base-62 (caracteres a-z, A-Z, 0-9) de un ID entero único. Un código base-62 de 7 caracteres proporciona 62^7 ≈ 3,5 billones de códigos posibles, superando con creces la demanda previsible. El ID entero se produce mediante un generador de ID distribuido, como un servicio tipo Snowflake o una secuencia de base de datos. Esto garantiza la unicidad sin sobrecarga de coordinación en la capa de aplicación. En la escritura, la aplicación codifica el ID generado para producir el código corto y almacena ambos. Para alias personalizados, la aplicación comprueba si existe una fila con ese short_code antes de insertar; si está ocupado, devuelve un error de conflicto al llamante. FLUJO DE LECTURA Y ESCRITURA Ruta de escritura: El cliente POSTea a la API service. El servicio valida la URL (comprobación básica de formato, comprobación opcional de lista negra). Obtiene un nuevo ID único del generador de ID, lo codifica a un código corto y lo inserta en una fila en la base de datos principal. La nueva correspondencia se precalienta opcionalmente en la caché. La URL corta se devuelve al cliente. Ruta de lectura: El cliente emite GET /{shortCode}. La API service primero comprueba la caché distribuida (Redis). En una coincidencia de caché, devuelve la redirección 302 inmediatamente e incrementa asincrónicamente el contador de clics. En una falta de caché, consulta la base de datos principal, escribe el resultado en la caché con un TTL (p. ej., 24 horas) y luego redirige. Si el código no se encuentra, ha caducado o ha sido eliminado, devuelve 404. ALMACENAMIENTO Y CACHÉ El almacenamiento principal es una base de datos relacional (PostgreSQL o MySQL) por su fuerte consistencia, garantías ACID y aplicación sencilla de claves únicas. Con 20 millones de enlaces por mes y un tamaño de fila modesto (~500 bytes), un año de datos son aproximadamente 120 GB — fácilmente manejables en una sola instancia principal con réplicas de lectura. Una caché distribuida en memoria (Redis) se sitúa delante de la base de datos para la ruta de lectura. Dado que una pequeña fracción de los enlaces representa la mayor parte del tráfico (distribución de ley de potencias), una caché con una política de desalojo LRU y un TTL de 24 horas logrará una alta tasa de aciertos con memoria modesta. Estimando 10 millones de enlaces 'calientes' a ~200 bytes cada uno requiere solo unos 2 GB de memoria de caché. Los recuentos de clics se almacenan en búfer en Redis (INCR) y se envían periódicamente a la base de datos para evitar la amplificación de escrituras. ESCALADO PARA TRÁFICO DE LECTURA INTENSO El nivel de API no tiene estado y escala horizontalmente detrás de un balanceador de carga. Las réplicas de lectura de la base de datos absorben las consultas de lectura que no coinciden en la caché. El clúster de caché (Redis Cluster) se puede fragmentar por short_code. Se puede colocar una CDN delante del endpoint de redirección para los enlaces más populares, sirviendo la respuesta 302 desde nodos de borde sin alcanzar el origen. Dado que los navegadores no almacenan en caché las respuestas 302 por defecto, la CDN debe configurarse para almacenarlas en caché durante un corto período (p. ej., 60 segundos) para ser efectiva. MANEJO DE ENLACES CADUCADOS O ELIMINADOS La caducidad se comprueba en el momento de la lectura: si expires_at está en el pasado o is_deleted es true, el servicio devuelve 404 y elimina la entrada de la caché. Un trabajo en segundo plano se ejecuta periódicamente (p. ej., cada noche) para eliminar permanentemente o archivar las filas donde expires_at ha pasado, manteniendo el conjunto de datos activo pequeño y los escaneos de índices rápidos. Las eliminaciones lógicas (bandera is_deleted) permiten auditorías y posible recuperación antes de la eliminación permanente. PREVENCIÓN DE ABUSOS Y LIMITACIÓN DE TASA La limitación de tasa se aplica en la capa de la puerta de enlace API utilizando un algoritmo de cubo de tokens o ventana deslizante con clave por dirección IP y, para usuarios autenticados, por ID de usuario. Valores predeterminados razonables: 10 escrituras por minuto por IP para usuarios anónimos, límites más altos para cuentas autenticadas. En la ruta de escritura, las URL enviadas se comprueban contra una lista negra de dominios maliciosos o de phishing conocidos (mantenida como un conjunto de Redis o un pequeño trie en memoria). Se puede requerir CAPTCHA o verificación por correo electrónico para patrones de envío masivos o sospechosos. Los códigos cortos que reciben un pico inusual de respuestas 404 (p. ej., ataques de enumeración) pueden activar bloqueos temporales de IP. FIABILIDAD Y CUELLOS DE BOTELLA La base de datos principal es el punto único de fallo más crítico. Mitigación: replicación síncrona a al menos un standby con failover automático (p. ej., utilizando una herramienta como Patroni). La capa de caché mejora la disponibilidad sirviendo lecturas incluso durante una degradación breve de la base de datos. El generador de ID debe ser altamente disponible; un generador tipo Snowflake incrustado en cada nodo de API (usando ID de nodo + marca de tiempo + secuencia) elimina esta dependencia por separado. Posibles cuellos de botella: la ruta de escritura de la base de datos durante picos de tráfico (mitigado por agrupación de conexiones y lotes de escritura cuando sea posible), y la expulsión de caché bajo un aumento repentino de códigos cortos únicos (mitigado precalentando enlaces populares y ajustando el tamaño de la caché). COMPENSACIONES Y ASUNCIONES El uso de redirecciones 302 (temporales) en lugar de 301 (permanentes) significa que los navegadores no almacenan en caché la redirección, por lo que cada visita impacta en el servicio. Esto es intencional: permite un recuento de clics preciso y que los enlaces se actualicen o eliminen. La compensación es una latencia y carga ligeramente mayores en comparación con 301. La codificación base-62 de un ID secuencial revela el orden de creación aproximado; si eso es una preocupación, el ID se puede hashear o se puede generar un código aleatorio con una comprobación de unicidad (reintentar en caso de colisión). El diseño asume que se permite la creación de enlaces anónimos; agregar autenticación mejoraría el control de abusos pero reduce la accesibilidad. Los recuentos de clics usan consistencia eventual (en búfer en Redis, enviados asincrónicamente) en lugar de incrementos transaccionales estrictos, aceptando imprecisiones menores a cambio de una carga de escritura mucho menor en la base de datos. Los alias personalizados se admiten pero se tratan como un caso de uso minoritario; no afectan al pipeline de generación principal.

Resultado

#1 | Ganador

Votos ganadores

3 / 3

Puntuacion media

85
Modelos evaluadores Google Gemini 2.5 Flash

Puntuacion total

91

Comentario general

El diseño del servicio de acortamiento de URL es excepcionalmente bien estructurado, completo y práctico. Aborda todos los aspectos de la solicitud con un buen nivel de detalle, tomando decisiones concretas y justificándolas eficazmente. Los puntos fuertes incluyen un modelo de datos robusto, una estrategia de generación de códigos cortos bien pensada, un plan de escalado integral para tráfico con muchas lecturas y una sólida discusión sobre las compensaciones, particularmente en lo que respecta a las redirecciones 301 vs 302 y la consistencia del recuento de clics. La respuesta identifica posibles cuellos de botella y propone estrategias de mitigación realistas, lo que demuestra una sólida comprensión de los principios de diseño de sistemas para servicios de alto tráfico. No hay debilidades significativas; el diseño está listo para discusiones de implementación a un alto nivel.

Ver detalle de evaluacion

Calidad de la arquitectura

Peso 30%
88

La arquitectura propuesta es muy coherente y adecuada para la carga de trabajo especificada. Describe claramente los componentes clave, como un nivel de API sin estado, un generador de ID distribuido, una base de datos relacional con réplicas de lectura, una caché distribuida (Redis) y una CDN. La separación lógica y la interacción entre estos componentes están bien explicadas, lo que demuestra una base arquitectónica sólida que aborda los requisitos funcionales y no funcionales de manera eficiente.

Integridad

Peso 20%
95

La respuesta es excepcionalmente completa, cubriendo cada elemento solicitado en la solicitud con un detalle exhaustivo. Desde los requisitos principales y no funcionales hasta los puntos finales de la API, el modelo de datos, la generación de códigos cortos, los flujos de lectura/escritura, el almacenamiento, el almacenamiento en caché, el escalado, la gestión de enlaces, la prevención de abusos, la fiabilidad y las compensaciones/suposiciones explícitas, todo se aborda de manera integral y elocuente. La inclusión de métricas específicas y estimaciones razonables fortalece aún más su exhaustividad.

Analisis de compromisos

Peso 20%
89

La respuesta proporciona un excelente razonamiento para las importantes compensaciones de diseño. La discusión explícita de las redirecciones 302 vs 301, las implicaciones de la generación de ID secuencial, la elección de la consistencia fuerte para la base de datos principal y la consistencia eventual para los recuentos de clics están bien justificadas. Estas explicaciones demuestran una profunda comprensión de las consecuencias prácticas de las decisiones de diseño en un sistema del mundo real.

Escalabilidad y fiabilidad

Peso 20%
91

El diseño presenta un enfoque robusto para la escalabilidad y la fiabilidad. Aborda eficazmente el tráfico de lectura intensiva a través de una API sin estado, réplicas de lectura, almacenamiento en caché fragmentado (Redis Cluster) e integración de CDN. Para la fiabilidad, considera la mitigación de puntos únicos de fallo (SPOF) de la base de datos (replicación, conmutación por error), la resiliencia de la capa de caché y la alta disponibilidad del generador de ID. La identificación de posibles cuellos de botella y las mitigaciones propuestas muestran un enfoque proactivo para mantener el rendimiento y el tiempo de actividad bajo carga.

Claridad

Peso 10%
92

La respuesta es excepcionalmente clara, bien organizada y fácil de seguir. Utiliza encabezados distintos para cada sección, alineándose perfectamente con la estructura de la solicitud. El lenguaje es preciso, profesional y evita la jerga siempre que es posible, haciendo accesible el complejo diseño técnico. La profundidad del detalle es apropiada para un diseño de alto nivel, lo suficientemente concreto como para ser práctico sin atascarse en detalles de implementación.

Modelos evaluadores OpenAI GPT-5.2

Puntuacion total

78

Comentario general

Diseño coherente e implementable con API claras, modelo de datos, estrategia de generación de código y una sólida escalabilidad de lectura intensiva a través de caché/CDN y servicios sin estado. Aborda la expiración/eliminación, controles básicos de abuso e identifica cuellos de botella clave. Algunas áreas son un poco optimistas o están poco especificadas (por ejemplo, el almacenamiento en caché de CDN de redirecciones, la consistencia/semántica de 404 vs 410, los patrones detallados de invalidación de caché, las consideraciones multirregión y la escalabilidad de escritura más allá de un solo primario), pero en general se ajusta bien a la carga de trabajo e incluye compromisos sensatos.

Ver detalle de evaluacion

Calidad de la arquitectura

Peso 30%
78

Presenta una arquitectura limpia: capa de API sin estado, caché de Redis delante de un RDBMS, réplicas de lectura opcionales, conteo de clics asíncrono, limpieza de expiración en segundo plano y CDN opcional. Los componentes y las responsabilidades están bien separados y los flujos son plausibles. Algunos puntos de diseño son ligeramente inestables (comportamiento de caché de redirección en CDN/navegadores, y depender de un solo primario como base a largo plazo), pero en general es sólida.

Integridad

Peso 20%
83

Cubre todos los elementos solicitados: requisitos funcionales/no funcionales, puntos finales, esquema, enfoque de unicidad, flujos de lectura/escritura, almacenamiento+caché, escalabilidad para tráfico de lectura intensiva, expiración/eliminación, abuso/limitación de velocidad, fiabilidad/cuellos de botella y compensaciones/suposiciones. Lagunas menores: discusión limitada sobre normalización de alias/palabras reservadas, semántica de actualización de enlaces (si se permite) y comportamiento más claro para los elementos expirados/eliminados (404 vs 410) e invalidación de caché.

Analisis de compromisos

Peso 20%
76

Buena discusión sobre 301 vs 302, fuga de ID secuencial vs hash/aleatorio, y consistencia eventual para recuentos de clics. Señala pros/contras de las elecciones de RDBMS y caché. Podría profundizar en SQL vs NoSQL a esta escala, las implicaciones del retraso de las réplicas y las compensaciones operativas del almacenamiento en caché de CDN y las elecciones de TTL de caché, pero las principales compensaciones se reconocen y justifican.

Escalabilidad y fiabilidad

Peso 20%
74

Plan de escalabilidad razonable para carga de trabajo de lectura dominante: caché, réplicas, Redis sharded, escalado horizontal de API, CDN opcional y contadores en búfer para reducir las escrituras en DB. La fiabilidad menciona la conmutación por error y la eliminación de la dependencia de un servicio central de ID. Ausente/limitado: estrategia multirregión, DR/copias de seguridad, manejo de interrupciones de caché (comportamiento de fallback) y estrategia de capacidad/partición más concreta si los datos crecen más allá de un solo primario cómodamente.

Claridad

Peso 10%
84

Bien estructurado con encabezados, formas de puntos finales concretas, campos de datos claros y flujos de lectura/escritura paso a paso. Las suposiciones y los números son fáciles de seguir. Un par de afirmaciones podrían ser más claras o precisas (notablemente en cuanto al almacenamiento en caché de redirecciones 302), pero la legibilidad general es alta.

Modelos evaluadores Anthropic Claude Opus 4.6

Puntuacion total

86

Comentario general

Esta es una respuesta de diseño de sistema muy sólida y bien estructurada que cubre todos los temas requeridos con la profundidad adecuada. Estima correctamente la carga de trabajo (8 escrituras/s, 80 lecturas/s en promedio), propone una arquitectura coherente con nodos API sin estado, una base de datos relacional, almacenamiento en caché de Redis y un generador de IDs distribuido. La respuesta aborda los doce puntos clave de la indicación: requisitos funcionales, requisitos no funcionales, puntos finales de la API, modelo de datos, generación de códigos cortos, flujos de lectura/escritura, almacenamiento y almacenamiento en caché, escalado, expiración/eliminación, prevención de abusos, fiabilidad y compensaciones. El razonamiento de las compensaciones es reflexivo y concreto: por ejemplo, la discusión de 302 frente a 301, códigos secuenciales frente a aleatorios, consistencia eventual para los recuentos de clics y el matiz del almacenamiento en caché de CDN para respuestas 302. El enfoque de escalado es realista y se ajusta bien a la carga de trabajo. Debilidades menores: la respuesta podría haber discutido NoSQL como una opción de almacenamiento alternativa de manera más explícita (solo menciona relacional), la discusión de CDN para respuestas 302 podría haberse ampliado ligeramente y falta la discusión de partición/fragmentación de bases de datos para un crecimiento futuro más allá de un primario único. La sección de prevención de abusos es sólida, pero podría mencionar servicios de escaneo de URL o API de navegación segura. En general, esta es una respuesta de alta calidad que sería implementable y demuestra un sólido pensamiento de diseño de sistemas.

Ver detalle de evaluacion

Calidad de la arquitectura

Peso 30%
85

La arquitectura es coherente y adecuada para la carga de trabajo. La capa de API sin estado, la base de datos relacional con réplicas de lectura, la caché de Redis, la generación de IDs al estilo Snowflake y la CDN opcional forman un conjunto sensato. Los flujos de lectura y escritura están claramente separados y son lógicos. La elección de incrustar el generador de IDs en los nodos de la API es una buena decisión de diseño que elimina una dependencia separada. Brecha menor: no hay discusión sobre fragmentación de bases de datos para crecimiento futuro más allá de un primario único, y no hay consideración explícita de alternativas NoSQL en la arquitectura.

Integridad

Peso 20%
90

La respuesta cubre a fondo los doce puntos solicitados en la indicación. Los requisitos funcionales y no funcionales se indican claramente, los puntos finales de la API están bien definidos con métodos HTTP y códigos de respuesta, el modelo de datos incluye campos e índices sensatos, se explica la generación de códigos cortos con matemáticas de capacidad, se detallan los flujos de lectura y escritura, se cuantifican el almacenamiento y el almacenamiento en caché, se aborda el escalado, la expiración y la eliminación se manejan tanto en el tiempo de lectura como a través de trabajos en segundo plano, la prevención de abusos incluye limitación de velocidad y listas de bloqueo, las consideraciones de fiabilidad identifican los principales puntos únicos de fallo y las mitigaciones, y las compensaciones se discuten explícitamente. Se abordan los alias personalizados. Falta muy poco.

Analisis de compromisos

Peso 20%
85

El razonamiento de las compensaciones es una fortaleza notable. La discusión de 302 frente a 301 está bien articulada con una justificación clara. La compensación entre generación de códigos secuenciales y aleatorios se menciona con una mitigación práctica (hashing). La consistencia eventual para los recuentos de clics se justifica con un análisis claro de costo-beneficio. El matiz del almacenamiento en caché de CDN para respuestas 302 muestra profundidad de comprensión. Podría haber sido más sólido con una discusión explícita de las compensaciones entre SQL y NoSQL y más sobre las compensaciones de diferentes estrategias de TTL de caché.

Escalabilidad y fiabilidad

Peso 20%
80

El enfoque de escalado es realista: escalado horizontal de API, réplicas de lectura, fragmentación de clúster de Redis y CDN en el borde. Las matemáticas de la carga de trabajo son correctas y la estimación del tamaño de la caché es razonable. La fiabilidad se aborda con replicación síncrona, conmutación por error automática y el diseño del generador de IDs incrustado. Se identifican cuellos de botella (ruta de escritura de la base de datos, desalojo de caché). Sin embargo, la respuesta no discute estrategias de fragmentación o partición de bases de datos para cuando el conjunto de datos crezca significativamente más allá de la capacidad de un solo primario, y no se menciona la distribución geográfica o la implementación multirregión.

Claridad

Peso 10%
90

La respuesta está excepcionalmente bien organizada con encabezados de sección claros que se mapean directamente a los requisitos de la indicación. Cada sección es concisa pero sustantiva. Los términos técnicos se usan de manera correcta y consistente. La redacción es profesional y fácil de seguir. El flujo desde los requisitos hasta la arquitectura y las compensaciones es lógico. Sin verbosidad innecesaria ni contenido tangencial.

## Diseño de Servicio de Acortamiento de URL Este documento describe un diseño de alto nivel para un servicio público de acortamiento de URL. ### Requisitos Funcionales Principales: 1. **Acortar URL**: Los usuarios pueden enviar una URL larga y recibir un código corto único. 2. **Redirección**: Los visitantes que acceden a una URL corta son redirigidos a la URL larga original. 3. **Alias Personalizados (Opcional)**: Los usuarios pueden especificar opcionalmente un alias personalizado para su código corto. ### Requisitos No Funcionales Clave: 1. **Alta Disponibilidad**: El servicio debe estar disponible c...

Mostrar respuesta completa

## Diseño de Servicio de Acortamiento de URL Este documento describe un diseño de alto nivel para un servicio público de acortamiento de URL. ### Requisitos Funcionales Principales: 1. **Acortar URL**: Los usuarios pueden enviar una URL larga y recibir un código corto único. 2. **Redirección**: Los visitantes que acceden a una URL corta son redirigidos a la URL larga original. 3. **Alias Personalizados (Opcional)**: Los usuarios pueden especificar opcionalmente un alias personalizado para su código corto. ### Requisitos No Funcionales Clave: 1. **Alta Disponibilidad**: El servicio debe estar disponible con un tiempo de inactividad mínimo. 2. **Baja Latencia**: Tanto el acortamiento como la redirección deben ser rápidos. 3. **Escalabilidad**: El sistema debe manejar un número grande y creciente de solicitudes (20 millones de enlaces nuevos/mes, 200 millones de redirecciones/mes). 4. **Durabilidad**: Las URL acortadas y sus mapeos no deben perderse. 5. **Consistencia**: Si bien la consistencia fuerte para las escrituras es ideal, la consistencia eventual podría ser aceptable para las lecturas en algunos escenarios. ### Puntos Finales Principales de la API: * **POST /shorten** * **Cuerpo de la Solicitud**: `{"url": "<url_larga>", "alias": "<alias_personalizado_opcional>"}` * **Cuerpo de la Respuesta**: `{"codigo_corto": "<codigo_corto>", "url_corta": "<url_corta>"}` * **Descripción**: Crea una nueva URL corta. Si se proporciona un alias y está disponible, se usa; de lo contrario, se genera un código corto único. * **GET /{codigo_corto}** * **Respuesta**: HTTP 301 (Redirección Permanente) o 302 (Redirección Temporal) a la URL original. * **Descripción**: Redirige al usuario a la URL larga original asociada con el `codigo_corto`. * **DELETE /{codigo_corto}** (Opcional, para gestión) * **Descripción**: Elimina un mapeo de URL corta. ### Modelo de Datos: Podemos usar una base de datos NoSQL como Cassandra o DynamoDB por su escalabilidad y disponibilidad. El esquema sería: * **Tabla: `urls`** * `codigo_corto` (Clave Primaria, Cadena) * `url_larga` (Cadena) * `creado_en` (Timestamp) * `id_usuario` (Cadena, opcional, para rastrear la propiedad) * `esta_activo` (Booleano, para manejar eliminaciones) * `alias` (Cadena, opcional, indexado si se usa para búsqueda) ### Generación y Unicidad del Código Corto: La generación de códigos cortos únicos es crucial. Varios enfoques: 1. **Codificación Base-62 de IDs Incrementales**: Un método común y eficiente. Podemos usar un servicio de contador distribuido (por ejemplo, Apache ZooKeeper o un servicio personalizado construido con Redis o una base de datos) para generar enteros únicos y siempre crecientes de 64 bits. Estos enteros se codifican luego en una cadena base-62 (0-9, a-z, A-Z). Esto garantiza la unicidad y proporciona códigos cortos de una longitud predecible (por ejemplo, 7-8 caracteres para miles de millones de IDs). 2. **Hashing**: Hash de la `url_larga` (por ejemplo, usando MD5 o SHA-1) y tomar los primeros caracteres. Las colisiones deben manejarse verificando las entradas existentes. Si ocurre una colisión, agregue un sufijo único o intente con otro hash. Para este diseño, **la codificación Base-62 de IDs incrementales** es preferible por su simplicidad para garantizar la unicidad y la longitud predecible. Un servicio de generación de IDs distribuido será esencial. ### Flujo de Solicitudes de Lectura y Escritura: * **Solicitud de Escritura (Acortar URL):** 1. El usuario envía una solicitud POST a `/shorten` con una `url_larga` y `alias` opcional. 2. La pasarela de API dirige la solicitud a un **Servicio de Escritura**. 3. **Generación de Código Corto**: Si no se proporciona alias, el Servicio de Escritura solicita un ID único al servicio de generación de IDs, que luego se codifica en Base-62. 4. **Verificación de Alias (si aplica)**: Si se proporciona un alias, verifique si ya está en uso. Si es así, devuelva un error. De lo contrario, use el alias como `codigo_corto`. 5. **Escritura en Base de Datos**: Almacene el mapeo (`codigo_corto`, `url_larga`, `creado_en`, etc.) en la base de datos `urls`. Si se usa el alias, podría ser necesaria una entrada o índice adicional para búsquedas basadas en alias. 6. El Servicio de Escritura devuelve el `codigo_corto` y la `url_corta` al usuario. * **Solicitud de Lectura (Redirección):** 1. El usuario introduce una `url_corta` (por ejemplo, `corto.dominio/abcd123`). 2. La solicitud llega a la pasarela de API y se dirige a un **Servicio de Lectura** (o Servicio de Redirección). 3. **Verificación de Caché**: El Servicio de Lectura primero verifica una caché distribuida (por ejemplo, Redis) para el mapeo de `codigo_corto` a `url_larga`. 4. **Búsqueda en Base de Datos**: Si no se encuentra en la caché, el Servicio de Lectura consulta la base de datos `urls` usando el `codigo_corto`. 5. **Actualización de Caché**: Una vez recuperado de la base de datos, el mapeo se agrega a la caché para solicitudes posteriores. 6. **Redirección**: El Servicio de Lectura devuelve una redirección HTTP (301 o 302) al navegador del usuario con la `url_larga` original. ### Opciones de Almacenamiento y Estrategia de Caché: * **Almacenamiento Primario**: Una base de datos NoSQL distribuida como **Cassandra** o **DynamoDB**. Estas ofrecen alta disponibilidad, tolerancia a fallos y escalabilidad horizontal, muy adecuadas para la naturaleza de lectura intensiva del servicio. * **Caché**: Una caché distribuida en memoria como **Redis** o **Memcached** es crucial para el tráfico intensivo de lectura. Almacenará los mapeos de `codigo_corto` a `url_larga` accedidos con frecuencia. Esto reduce drásticamente la carga de la base de datos y mejora la latencia de redirección. Se puede establecer un TTL (Tiempo de Vida) en las entradas de la caché, o se pueden invalidar en las escrituras (aunque esto agrega complejidad). ### Enfoque de Escalado para Tráfico de Lectura Intenso: 1. **Réplicas de Lectura**: Para bases de datos relacionales, use réplicas de lectura. Para NoSQL, su naturaleza distribuida maneja inherentemente la escala de lecturas. 2. **Capa de Caché**: Una caché distribuida robusta es el mecanismo principal. Escalar horizontalmente Redis/Memcached. 3. **Servicios sin Estado**: Asegúrese de que el Servicio de Lectura y el Servicio de Escritura no tengan estado. Esto permite una fácil escalabilidad horizontal agregando más instancias detrás de un balanceador de carga. 4. **Balanceo de Carga**: Utilice un balanceador de carga robusto (por ejemplo, AWS ELB, Nginx) para distribuir el tráfico entre las instancias del servicio. 5. **CDN**: Para las partes estáticas de la interfaz web (si las hay) y potencialmente para servir redirecciones desde ubicaciones de borde, se puede emplear una Red de Entrega de Contenidos (CDN). ### Manejo de Enlaces Caducados o Eliminados: * **Eliminación**: La bandera `esta_activo` en la base de datos se puede usar. Cuando se elimina un enlace, actualice `esta_activo` a `false`. El Servicio de Lectura verificaría esta bandera durante las búsquedas en la base de datos. La entrada también se puede eliminar de la caché. * **Caducidad**: Agregue una marca de tiempo `caduca_en` a la tabla `urls`. El Servicio de Lectura verificaría esta marca de tiempo. Un trabajo en segundo plano automatizado puede limpiar periódicamente las entradas caducadas de la base de datos. ### Prevención Básica de Abuso y Limitación de Tasa: * **Limitación de Tasa**: Implemente limitación de tasa en la pasarela de API o dentro del Servicio de Escritura. Esto puede basarse en la dirección IP, el ID de usuario (si está autenticado) o las claves API. Los algoritmos comunes incluyen Token Bucket o Leaky Bucket. * **Validación de URL**: Antes de acortar, valide la `url_larga` de entrada para prevenir URLs obviamente maliciosas o mal formadas. * **Detección de Contenido Abusivo**: Monitoree URLs que apunten a sitios de phishing, malware o spam. Esto puede implicar la integración con listas negras de terceros o el uso de modelos de aprendizaje automático. * **Restricciones de Alias Personalizados**: Limite el uso de alias personalizados a usuarios registrados/verificados para prevenir abusos. ### Consideraciones de Fiabilidad y Posibles Cuellos de Botella: * **Posibles Cuellos de Botella**: * **Servicio de Generación de IDs**: Si no está diseñado para alto rendimiento y disponibilidad, puede convertirse en un cuello de botella para las escrituras. * **Base de Datos**: Un alto volumen de escrituras o consultas de lectura complejas (por ejemplo, búsquedas de alias sin índice) pueden sobrecargar la base de datos. * **Caché**: Los fallos de caché con volúmenes de lectura muy altos pueden abrumar la base de datos. Las políticas de expulsión de caché y el escalado son críticos. * **Latencia de Red**: Entre servicios, especialmente entre zonas de disponibilidad. * **Fiabilidad**: * **Redundancia**: Implemente servicios y bases de datos en múltiples zonas de disponibilidad. * **Conmutación por Error**: Implemente conmutación por error automática para componentes críticos. * **Monitorización y Alertas**: Monitorización integral del estado del sistema, métricas de rendimiento y tasas de error, con alertas para anomalías. * **Degradación Grácil**: Si la caché falla, el sistema aún debería funcionar (aunque más lento) leyendo directamente de la base de datos. ### Compensaciones y Suposiciones: * **Suposiciones**: * Tenemos un mecanismo confiable para generar IDs únicos y secuenciales en un entorno distribuido. * La mayoría de las solicitudes son lecturas (redirecciones), lo que justifica una fuerte inversión en caché y escalado de lectura. * La consistencia fuerte para la creación de enlaces es deseable, pero la consistencia eventual para las búsquedas de redirección después de un breve retraso de propagación es aceptable. * **Compensaciones**: * **Caché vs. Consistencia**: Una estrategia de caché agresiva puede llevar a datos obsoletos durante un corto período después de una escritura, lo que requiere una invalidación de caché cuidadosa o gestión de TTL. * **Complejidad de Generación de IDs**: Usar IDs incrementales es simple para la unicidad pero requiere un servicio de generación de IDs dedicado y altamente disponible. El hashing es más simple de implementar inicialmente pero requiere un manejo robusto de colisiones. * **Alias Personalizados**: El soporte para alias personalizados agrega complejidad al modelo de datos (índices secundarios, resolución de conflictos) y a la ruta de escritura. * **Redirecciones Duraderas vs. Temporales**: Usar HTTP 301 (Permanente) asume que la URL corta siempre se mapeará a la misma URL larga. Usar 302 (Temporal) es más flexible si los mapeos pueden cambiar, pero podría tener ligeras implicaciones de SEO o comportamientos de caché del navegador. Este diseño proporciona una base escalable, confiable y de alto rendimiento para un servicio de acortamiento de URL.

Resultado

#2

Votos ganadores

0 / 3

Puntuacion media

74
Modelos evaluadores Google Gemini 2.5 Flash

Puntuacion total

80

Comentario general

El diseño proporciona una arquitectura de alto nivel bien estructurada y completa para un servicio de acortamiento de URL. Aborda todos los requisitos de la indicación, incluidos los aspectos funcionales y no funcionales principales, el diseño de la API, el modelado de datos, la generación de códigos cortos, los flujos de solicitud, el almacenamiento, el almacenamiento en caché, la escalabilidad y la prevención de abusos. Las fortalezas clave incluyen el uso propuesto de una base de datos NoSQL y una caché distribuida para el tráfico con muchas lecturas, y una explicación clara de los flujos de solicitudes de lectura y escritura. La discusión sobre las compensaciones y los posibles cuellos de botella también es valiosa. Si bien los detalles de implementación específicos para el servicio de generación de IDs distribuidos podrían elaborarse un poco más sobre su escalabilidad para escrituras, el diseño general es sólido, práctico y bien razonado.

Ver detalle de evaluacion

Calidad de la arquitectura

Peso 30%
78

La arquitectura propuesta es sólida, utilizando una puerta de enlace de API, servicios distintos de lectura/escritura, una base de datos NoSQL y una caché distribuida. La elección de la codificación Base-62 con un servicio de generación de IDs distribuidos es apropiada para códigos cortos únicos y predecibles. Los flujos de lectura y escritura están claramente delineados y son lógicos. El diseño separa cuidadosamente las preocupaciones y propone tecnologías adecuadas para la escala dada.

Integridad

Peso 20%
85

La respuesta cubre de manera integral todos los aspectos solicitados en la indicación, incluidos los requisitos funcionales/no funcionales, los puntos finales de la API, el modelo de datos, la generación de códigos cortos, los flujos de lectura/escritura, el almacenamiento/caché, la escalabilidad para lecturas intensas, el manejo de enlaces caducados/eliminados, la prevención de abusos, la confiabilidad, los cuellos de botella, las compensaciones y las suposiciones. También se discuten brevemente alias personalizados según sea necesario.

Analisis de compromisos

Peso 20%
75

La respuesta identifica y discute claramente las compensaciones relevantes, como la codificación Base-62 frente al hash para códigos cortos, la consistencia de la caché frente a la simplicidad, la complejidad de la generación de IDs y las redirecciones duraderas frente a las temporales. Proporciona una justificación razonada para los enfoques elegidos y reconoce las implicaciones de varias decisiones de diseño. Las suposiciones realizadas también se indican explícitamente.

Escalabilidad y fiabilidad

Peso 20%
79

El diseño aborda eficazmente la escalabilidad para el tráfico de lectura intensa a través de una sólida capa de caché, servicios sin estado, equilibrio de carga y el uso de una base de datos NoSQL distribuida. También se cubren las consideraciones de confiabilidad, como la redundancia, la conmutación por error, la monitorización y la degradación elegante. Se identifican correctamente los cuellos de botella clave, en particular el servicio de generación de IDs y las fallas de caché, lo que demuestra una conciencia de las posibles debilidades del sistema.

Claridad

Peso 10%
88

La respuesta es excepcionalmente clara, bien estructurada y fácil de seguir. Utiliza encabezados, viñetas y un lenguaje conciso para presentar información compleja. El flujo lógico de los componentes del diseño y el manejo de solicitudes se articula muy bien, lo que hace que el diseño general sea muy comprensible.

Modelos evaluadores OpenAI GPT-5.2

Puntuacion total

74

Comentario general

Arquitectura de alto nivel sólida y coherente que se ajusta a un acortador de URL de lectura intensiva. Cubre componentes clave (APIs, modelo de datos, generación de códigos, caché, flujos, escalabilidad, controles básicos de abuso) y señala posibles cuellos de botella. Las principales lagunas son la limitada profundidad en la partición/fragmentación y los patrones de consistencia de la caché, la falta de una ruta explícita de actualización del recuento de clics (aunque los recuentos de clics simples están incluidos) y la mención de proveedores específicos a pesar de que la solicitud pedía evitarlo. Se mencionan la expiración/eliminación, pero los detalles operativos (tombstones, caché negativa, comportamiento de redirección para enlaces inactivos) podrían ser más claros.

Ver detalle de evaluacion

Calidad de la arquitectura

Peso 30%
75

Presenta una clara separación de responsabilidades (gateway, servicio de escritura, servicio de redirección/lectura, generador de ID, BD, caché) con responsabilidades y flujos de solicitud sensatos. El modelo de datos es razonable para la búsqueda basada en claves. Sin embargo, omite detalles arquitectónicos importantes como la estrategia de clave de partición/opciones de replicación para NoSQL, cómo se garantiza la unicidad del alias sin índices secundarios costosos y cómo manejar los stampedes de caché/claves activas.

Integridad

Peso 20%
70

Cumple la mayoría de los puntos requeridos: requisitos funcionales/no funcionales, endpoints, modelo de datos, unicidad, flujos de lectura/escritura, almacenamiento+caché, escalabilidad, eliminación/expiración, prevención de abuso, fiabilidad, compensaciones/suposiciones. Notablemente ligero en el manejo de recuentos de clics (explícitamente solicitado a través de 'recuentos de clics simples' incluidos), y no especifica comportamientos para enlaces faltantes/expirados/eliminados (por ejemplo, 404 vs 410) o caché negativa. También carece de matemáticas de capacidad/tamaño aproximado, aunque eso es opcional a esta profundidad.

Analisis de compromisos

Peso 20%
72

Discute compensaciones clave (IDs secuenciales vs. hashing, caché vs. consistencia, 301 vs 302, complejidad de alias personalizado). El razonamiento es generalmente sólido pero se mantiene algo superficial: por ejemplo, el riesgo de previsibilidad/enumeración de IDs secuenciales y la mitigación (códigos más largos, aleatorización) no se discuten, y la justificación de la elección SQL vs. NoSQL podría ser más equilibrada.

Escalabilidad y fiabilidad

Peso 20%
74

Enfatiza apropiadamente el almacenamiento en caché, la escalabilidad horizontal sin estado, la redundancia y identifica cuellos de botella como la generación de ID y los fallos de caché. Menciona multi-AZ y failover. Faltan estrategias concretas para puntos calientes de alta lectura (detalles de caché de redirección CDN/edge, replicación de claves activas, coalescencia de solicitudes), y detalles de escalabilidad de la ruta de escritura para el generador de ID (por ejemplo, asignación por lotes/segmentos) y la contrapresión durante interrupciones posteriores.

Claridad

Peso 10%
82

Bien estructurado con encabezados y flujos paso a paso; fácil de seguir e implementar a alto nivel. Problemas menores de claridad: mezcla orientación general con ejemplos específicos de proveedores, y algunos lugares son un poco imprecisos (por ejemplo, 'podría necesitarse una entrada o índice adicional' sin especificar el enfoque).

Modelos evaluadores Anthropic Claude Opus 4.6

Puntuacion total

68

Comentario general

La respuesta proporciona un diseño bien estructurado y completo para un servicio de acortamiento de URL que cubre todos los temas requeridos en la indicación. Aborda los requisitos funcionales y no funcionales, los puntos finales de la API, el modelo de datos, la generación de códigos cortos, los flujos de solicitud, el almacenamiento y la caché, la escalabilidad, la expiración/eliminación, la prevención de abusos, la fiabilidad y las compensaciones. La redacción es clara y organizada con encabezados apropiados. Sin embargo, el diseño se mantiene algo superficial en varias áreas: la discusión sobre la generación de ID carece de profundidad sobre cómo hacerla verdaderamente distribuida y tolerante a fallos (por ejemplo, asignación basada en rangos, enfoques tipo Snowflake), la estimación aproximada para el almacenamiento y el tráfico está completamente ausente, el compromiso entre 301 y 302 se menciona pero no se analiza en profundidad en el contexto de la analítica (el recuento de clics requiere 302 o registro en el lado del servidor antes de la redirección), y la estrategia de caché podría ser más específica sobre las tasas de aciertos esperadas y el dimensionamiento. El razonamiento de las compensaciones está presente, pero a menudo enumera opciones sin justificar profundamente el enfoque elegido. El diseño es sólido e implementable, pero no alcanza una profundidad excepcional.

Ver detalle de evaluacion

Calidad de la arquitectura

Peso 30%
65

La arquitectura es coherente con servicios separados de lectura/escritura, una capa de caché, almacenamiento NoSQL y un servicio de generación de ID. La separación de componentes es razonable y el flujo de datos es lógico. Sin embargo, el diseño carece de cálculos aproximados para justificar las decisiones de dimensionamiento, no discute cómo el servicio de generación de ID se hace altamente disponible en términos concretos (por ejemplo, preasignación basada en rangos, múltiples nodos), y la mención de CDN para redirecciones es vaga. Se afirma la elección de NoSQL pero no se justifica en profundidad frente a alternativas. La arquitectura es sólida pero no está profundamente razonada.

Integridad

Peso 20%
75

La respuesta cubre los doce temas solicitados en la indicación: requisitos funcionales, requisitos no funcionales, puntos finales de la API, modelo de datos, generación de códigos cortos, flujos de lectura/escritura, almacenamiento y caché, escalabilidad, expiración/eliminación, prevención de abusos, fiabilidad y compensaciones. Se discuten alias personalizados. Sin embargo, omite la estimación de capacidad (almacenamiento por registro, almacenamiento total necesario, cálculos de QPS), no discute la mecánica del recuento de clics y el modelo de datos es mínimo (faltan campos como click_count). El punto final DELETE carece de discusión sobre autenticación. En general es bastante completo pero faltan algunos detalles esperados.

Analisis de compromisos

Peso 20%
60

Se mencionan compensaciones en varios lugares: base-62 vs hashing, 301 vs 302, consistencia de caché vs simplicidad, NoSQL vs SQL (brevemente). Sin embargo, el razonamiento a menudo se mantiene a nivel de listado en lugar de analizar profundamente las consecuencias. Por ejemplo, la discusión 301 vs 302 no se conecta con el requisito de recuento de clics (se necesita 302 si el servidor debe ver cada redirección para contar). La comparación base-62 vs hashing es justa pero no discute las preocupaciones de predecibilidad/seguridad de los ID secuenciales. La compensación SQL vs NoSQL apenas se explora. La discusión de consistencia se menciona pero no se analiza en profundidad.

Escalabilidad y fiabilidad

Peso 20%
65

La respuesta identifica mecanismos clave de escalabilidad: servicios sin estado, escalado horizontal, caché distribuida, base de datos NoSQL, balanceo de carga y CDN. Las consideraciones de fiabilidad incluyen implementación multizona, conmutación por error, monitorización y degradación controlada. Se identifican correctamente los cuellos de botella (generación de ID, fallos de caché, base de datos). Sin embargo, la discusión carece de razonamiento cuantitativo (por ejemplo, con 200 millones de redirecciones/mes, ¿cuál es el QPS? ¿Cuántos nodos de caché se necesitan?). Se identifica el servicio de generación de ID como un único punto de fallo, pero la mitigación es vaga. No hay discusión sobre la estrategia de partición de datos ni el factor de replicación para la base de datos.

Claridad

Peso 10%
80

El documento está bien organizado con encabezados claros, formato consistente y flujo lógico desde los requisitos hasta la arquitectura y las compensaciones. Los flujos de solicitud se describen paso a paso. Los términos técnicos se utilizan de forma apropiada. La redacción es concisa y profesional. Debilidad menor: algunas secciones se beneficiarían de diagramas o ejemplos más concretos, pero para una respuesta basada en texto, la claridad es fuerte.

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

85
Ver esta respuesta

Votos ganadores

0 / 3

Puntuacion media

74
Ver esta respuesta
X f L