Tema representativo de entrevista

Entrevista de diseño de sistemas: Diseñar una canalización de transformación y entrega de imágenes

Diseño de sistemasDifícil
Equipo editorial de Offer.ccPublicado Actualizado

Pregunta

Diseñe un servicio que acepte originales y genere derivados redimensionados, recortados, comprimidos y convertidos sin duplicar el trabajo ni agotar los recursos debido a parámetros maliciosos.

Problema y alcance

La plataforma recibe 10 millones de originales por día, mientras que los clientes solicitan muchas dimensiones, recortes y formatos de salida. Diseñe el almacenamiento de originales, los trabajos de transformación, el almacenamiento en caché de imágenes derivadas y la entrega por CDN. Los originales deben ser reprocesables; las capas de edición colaborativa, los modelos de moderación de contenido y la calibración de color profesional quedan fuera del alcance. Los números son suposiciones para la entrevista, no puntos de referencia de la industria.

Qué evalúa el entrevistador

Separar la identidad de un original, una solicitud de transformación y un activo derivado. Explicar cómo coexiste el procesamiento asíncrono con lecturas de baja latencia. Las respuestas sólidas cubren claves de caché deterministas, fusión de trabajos duplicados, contrapresión en colas, bombas de píxeles y descompresión, autorización de objetos, negociación de contenido y limpieza tras la eliminación.

Preguntas aclaratorias

  • ¿Se permiten dimensiones, recortes y filtros arbitrarios? ¿Cuáles son los límites de píxeles, tamaño de archivo y tiempo?
  • ¿Qué formatos, niveles de calidad, espacios de color y comportamientos de animación se requieren?
  • ¿Debe ser sincrónica la primera solicitud, o puede devolver 202 con el estado del trabajo?
  • ¿Cuáles son los requisitos de retención, aislamiento de inquilinos y entre regiones?
  • ¿Los resultados son públicos, o cada URL debe llevar autorización?

Un marco de respuesta de 30 segundos

“Almacenaría los originales como activos inmutables direccionados por contenido y codificaría los parámetros de transformación normalizados en una clave derivada. Las lecturas consultan primero la CDN y el objeto derivado; un error de caché envía un trabajo idempotente particionado por inquilino y original. Los workers se ejecutan en un sandbox con límites de píxeles, memoria, CPU, descompresión y salida, para luego publicar atómicamente un objeto temporal validado. Los reintentos llevan una versión del procesador y un presupuesto, mientras que las solicitudes idénticas comparten un solo trabajo. La capa de acceso aplica URLs firmadas, negociación y controles de caché; los eventos de eliminación limpian los índices derivados y las entradas de la CDN.”

Diseño detallado paso a paso

La API de subida autentica, verifica un resumen criptográfico y escribe el objeto original. Los metadatos registran asset_id, inquilino, hash de contenido, tipo de medio, dimensiones, cantidad de fotogramas, información de color, estado de escaneo y política de retención. La deduplicación de contenido nunca reemplaza una comprobación de autorización del inquilino. Valide los bytes mágicos y la capacidad de decodificación en lugar de confiar en un nombre de archivo o en Content-Type.

Normalice los parámetros de transformación como límites de dimensiones, coordenadas de recorte, algoritmo de remuestreo, calidad, rotación, fondo y formato de salida en una secuencia estable. Una clave derivada puede ser hash(original_bytes, normalized_transform, processor_version). Las actualizaciones del procesador cambian la versión, de modo que los algoritmos antiguos y nuevos no se sobrescriban silenciosamente entre sí. Rechace valores negativos, NaN, proporciones extremas y filtros recursivos.

La ruta de lectura verifica la CDN, el índice de objetos derivados y la tabla de deduplicación de trabajos. Un derivado utilizable devuelve Cache-Control, ETag y el tipo de contenido correcto. En caso de no encontrarlo, cree un trabajo PENDING y devuelva una URL de estado cuando la latencia sea aceptable; una imagen común pequeña puede usar una ruta sincrónica estrictamente limitada. Una restricción única en (tenant_id, derived_key) permite que solicitudes idénticas compartan el trabajo.

Particione las colas por inquilino y hash del original, y programe por costo de píxeles en lugar de por cantidad de solicitudes. Las cuotas de inquilinos, la concurrencia global y las colas de prioridad proporcionan contrapresión; una sola imagen enorme no puede ocupar a todos los workers. Los trabajos llevan concesiones (leases) y versiones del procesador, de modo que un worker cancelado pueda reintentarse. El retroceso exponencial es para fallas recuperables; los parámetros inválidos y los formatos no compatibles fallan explícitamente.

El sandbox de procesamiento limita la CPU, la memoria, el disco temporal, la tasa de descompresión, la cantidad de fotogramas y las dimensiones de salida, y no puede acceder a redes internas. Recalcule los píxeles y fotogramas reales después de decodificar para detener las bombas de descompresión. Escriba un objeto temporal, valide el resumen criptográfico, las dimensiones y el formato, y luego publique de forma atómica mediante escrituras condicionales o versionadas. Defina políticas explícitas para SVG, perfiles ICC y metadatos para evitar scripts, escalada de directorios y fugas de privacidad.

Almacene en caché los derivados según su clave. La eliminación del original o los cambios de permisos emiten un evento de activo que invalida el índice derivado y la CDN. Los activos privados utilizan URLs firmadas de corta duración cuyas firmas cubren inquilino, clave derivada, expiración y encabezados de respuesta permitidos. Mantenga Vary limitado a las dimensiones de negociación que realmente cambien la salida; los parámetros de consulta arbitrarios no deben crear variantes de caché ilimitadas.

Monitoree el éxito de escritura de originales, la antigüedad de la cola, el rendimiento ponderado por píxeles, la tasa de aciertos de caché, la fusión de trabajos duplicados, la latencia p95 de transformación, las clases de fallas, los picos de sandbox, el crecimiento de derivados y los errores 5xx de la CDN. La conciliación compara los metadatos originales, los estados terminales de los trabajos, los índices derivados y los listados de objetos para eliminar huérfanos. Inyecte terminaciones de workers, tiempos de espera del almacén de objetos, mensajes duplicados, actualizaciones del procesador, fallas de invalidación de CDN y agotamiento de cuotas de inquilinos.

Respuesta de ejemplo de alta calidad

“Trataría el original como un activo direccionable inmutable y combinaría los parámetros normalizados con una versión del procesador en una clave derivada. Una solicitud verifica la CDN y el objeto derivado; un fallo de caché crea un trabajo compartido bajo una restricción única y devuelve el trabajo existente o una URL de estado. Las colas se programan por inquilino y costo de píxeles. Los workers se ejecutan en un sandbox que limita la tasa de descompresión, la memoria, la CPU, los fotogramas y el tamaño de salida, para luego validar y publicar atómicamente un resultado temporal.

El acceso privado utiliza una URL firmada que cubre inquilino, clave derivada y expiración; las respuestas públicas configuran ETag, Cache-Control y el tipo de contenido correctos. Los eventos de eliminación limpian índices y entradas de la CDN. Las métricas cubren tasa de aciertos, antigüedad de la cola, latencia p95, picos de recursos y clases de fallas; la conciliación encuentra objetos huérfanos. Las solicitudes idénticas no se recalculan, las imágenes hostiles no pueden agotar la capacidad y las actualizaciones del procesador no pueden contaminar los derivados antiguos.”

Errores comunes

  • Usar el nombre de archivo como identidad → los cambios de nombre y las colisiones sobrescriben activos → use hashes de contenido e IDs de activos.
  • Concatenar parámetros sin procesar → las solicitudes equivalentes fragmentan la caché → normalice antes de generar la clave.
  • Crear un trabajo para cada fallo de caché → las imágenes populares desencadenan una tormenta de procesamiento → fusione por inquilino y clave derivada.
  • Limitar solo los bytes → una bomba de descompresión se expande en píxeles enormes → limite los píxeles decodificados, los fotogramas y la proporción.
  • Procesar cada solicitud sincrónicamente → el trabajo lento bloquea las lecturas → combine una cola asíncrona con una ruta rápida acotada.
  • Escribir directamente en el objeto final → los clientes pueden leer salidas parciales → valide un objeto temporal y publique atómicamente.
  • Firmar solo la URL → los parámetros o la política de respuesta pueden cambiar → firme inquilino, clave, expiración y política.
  • Eliminar solo el original → los derivados privados siguen siendo accesibles → impulse la limpieza a partir de eventos de activos.

Preguntas de seguimiento y respuestas

Pregunta de seguimiento 1: ¿Por qué incluir la versión del procesador en la clave de caché?

Diferentes algoritmos o bibliotecas pueden producir bytes diferentes. El versionado permite que los nuevos resultados coexistan y que los resultados antiguos se retiren deliberadamente.

Pregunta de seguimiento 2: ¿Cómo maneja las imágenes animadas?

Incluya la cantidad de fotogramas, la duración y la política de salida en el modelo de costos, limite los fotogramas y píxeles totales, y use una clave separada para la miniatura del primer fotograma.

Pregunta de seguimiento 3: ¿Cuándo devuelve 202?

Devuelva 202, un ID de trabajo y pautas de reintento cuando el costo sea impredecible, la salida sea grande o la cola esté saturada. Los formatos comunes pequeños pueden usar un presupuesto sincrónico estricto.

Pregunta de seguimiento 4: ¿Cómo previene el envenenamiento de caché?

Solo el servidor crea claves a partir de parámetros normalizados. Valide el tipo, la longitud y el resumen criptográfico antes de la publicación; vincule las cachés privadas a la autorización del inquilino.

Pregunta de seguimiento 5: ¿Qué sucede con las URLs antiguas tras reemplazar un original?

Use IDs de versión inmutables. El reemplazo crea un nuevo activo o evento de versión; los derivados antiguos permanecen o expiran según la retención en lugar de cambiar los bytes silenciosamente.

Pregunta de seguimiento 6: ¿Cómo mantiene los costos justos?

Cobre por píxeles decodificados, píxeles de salida y complejidad del filtro. Los token buckets de inquilinos, los límites de concurrencia y los presupuestos diarios controlan el trabajo costoso y generan respuestas de cuota auditables.

Fuentes públicas

Preguntas relacionadas

Herramienta de entrevista relacionada

Usa Resolver para una respuesta de diseño de sistemas

Aclara primero los requisitos y luego avanza a través de la escala, la arquitectura, la elección de componentes y las compensaciones (trade-offs).

Ver la herramienta