Planteamiento y contexto
Esta pregunta técnica general evalúa representaciones HTTP, negociación de contenido y límites de caché compartida. El objetivo es demostrar que un proxy no puede reutilizar un idioma o codificación para otra solicitud, manteniendo explicables el fallback y la resolución de problemas.
Qué evalúa el entrevistador
- Si distingues el URI de un recurso de sus representaciones y comprendes los encabezados de negociación proactiva.
- Si utilizas Vary para declarar los campos de solicitud que influyen en una respuesta y derivas las compensaciones de clave de caché y tasa de aciertos (hit rate).
- Si el fallback de idioma, tipo de medio y codificación es determinista en lugar de producir respuestas 406 inexplicables.
- Si reconoces los riesgos de caché compartida y privacidad derivados de cookies, autorización, rasgos de usuario y encabezados de alta cardinalidad.
Preguntas aclaratorias para hacer
Confirma si el recurso se puede compartir públicamente, qué dimensiones de variantes existen, si se permite la negociación dirigida por el servidor, si los clientes pueden elegir un idioma explícitamente y cómo la CDN realiza la partición (shard) mediante Vary. Pregunta sobre el fallback para idiomas no compatibles, las codificaciones permitidas, la personalización y la tasa de aciertos de caché aceptable.
Marco de respuesta de 30 segundos
Modelaría el URI del recurso por separado de la selección de representación, elegiría de forma determinista a partir de los valores ponderados de Accept, Accept-Language y Accept-Encoding, y devolvería Content-Type, Content-Language, Content-Encoding y Vary precisos. Una caché compartida reutiliza únicamente la misma clave de variante; las solicitudes personalizadas o de alta cardinalidad la omiten. Cuando ninguna representación coincide, se aplica una política documentada de fallback o 406, se registra la decisión y se prueban los aciertos de caché, los bytes y la privacidad con una matriz de solicitudes.
Análisis detallado paso a paso
1. Definir representaciones y dimensiones de negociación
Trata un único URI como un recurso con representaciones como HTML frente a JSON, chino frente a inglés, o gzip frente a br. Incluye solo los campos de solicitud que cambien los bytes o la semántica de la respuesta; no agregues todas las cookies ni el User-Agent completo por conveniencia. Registra la selección para que entradas normalizadas idénticas produzcan la misma representación.
2. Diseñar ponderaciones, fallback y errores
Analiza los factores de calidad y los comodines en la familia Accept y define la lista admitida por el servidor y su prioridad. El idioma puede recurrir en cascada (fallback) de la región al idioma base y luego a uno predeterminado; los tipos de medio pueden tener un valor predeterminado explícito. Devuelve 406 solo cuando el contrato exija rechazar cualquier representación no aceptable. Elige la compresión únicamente de una lista de permitidos y nunca dejes que valores desconocidos la eludan.
3. Hacer computables las variantes de caché
Enumera los encabezados de selección en Vary, por ejemplo Accept, Accept-Language, Accept-Encoding. Construye una clave de variante a partir del URI, el método y los valores normalizados de esos campos; la normalización cubre mayúsculas/minúsculas, espacios en blanco y orden para que grafías equivalentes no creen claves ilimitadas. Si la autorización, el estado de sesión o las cookies de usuario afectan la respuesta, utiliza una caché privada o evita explícitamente que se comparta.
4. Controlar la tasa de aciertos, la privacidad y el recuento de variantes
Cada dimensión divide la caché y reduce la tasa de aciertos. Accept-Language también puede convertirse en una señal de huella digital del navegador (browser fingerprinting). Las páginas públicas pueden mapear idiomas de cola larga a un conjunto finito admitido; los datos personalizados utilizan almacenamiento en caché privado, de corta duración o nulo. No utilices Vary: * para ocultar dependencias desconocidas porque impide la reutilización compartida.
5. Diseñar la observabilidad y la verificación
Registra las entradas normalizadas de negociación, la representación seleccionada, Vary, el estado de caché y el motivo del fallback sin registrar cookies sensibles completas. Prueba los encabezados de cada variante, la descompresión, el comportamiento de acierto y fallo en CDN y, especialmente, la secuencia “chino primero, inglés segundo”. Durante incidentes, compara Age, el estado de caché, los encabezados Content-* y los bytes reales, y luego reproduce una matriz de solicitudes fija.
Ejemplo de respuesta sólida
Enumeraría un conjunto finito de representaciones y elegiría de forma determinista a partir de los factores de calidad en Accept, Accept-Language y Accept-Encoding. La respuesta devuelve Content-Type, Content-Language, Content-Encoding y un Vary preciso; la clave de caché contiene únicamente esas dimensiones normalizadas. La autorización, el estado de sesión y los rasgos de alta cardinalidad se mantienen fuera de las cachés compartidas, mientras que los idiomas públicos de cola larga recurren a un valor predeterminado. Si nada es aceptable, el contrato opta por 406 o un valor predeterminado explícito. Los registros capturan la elección, el fallback y el estado de acierto sin cookies sensibles, y una matriz como “chino luego inglés, br luego gzip” demuestra que la CDN nunca reutiliza la variante equivocada.
Errores comunes
- Configurar Content-Language pero omitir Vary para un campo de solicitud que cambió la respuesta.
- Incluir cookies completas, User-Agent o encabezados arbitrarios en la clave de caché, destruyendo la tasa de aciertos.
- Devolver 406 para cada idioma no admitido sin un fallback de región, idioma base y valor predeterminado.
- Permitir que una caché compartida reutilice una respuesta que depende de Authorization o datos de sesión.
- Ignorar la negociación de codificación y devolver un Content-Encoding que el cliente no puede decodificar.
- Observar solo los códigos de estado en lugar de los encabezados Content-*, el estado de caché y los bytes reales.
Preguntas y respuestas de seguimiento
¿Por qué Vary no puede contener solo Accept-Language?
Si el tipo de medio o la compresión también cambian la respuesta, la caché también necesita esas dimensiones. Omitirlas permite que una caché compartida entregue una representación incompatible, provocando contenido mixto o fallos de decodificación.
¿Cuándo es útil Vary: *?
Indica que la selección depende de información no listada y normalmente impide la reutilización compartida. Puede ser una protección conservadora, pero no debe reemplazar el rastreo de la dependencia real y la elección del almacenamiento en caché privado.
¿Cómo se evita la explosión de claves por Accept-Language?
Mapea los idiomas de los clientes a un conjunto finito admitido, aplicando un fallback por región, idioma base y valor predeterminado. Cuando sea apropiado, utiliza una URL explícita o la elección del usuario para anular la negociación automática y monitorea la tasa de aciertos por variante.
¿El fallo en la negociación debe devolver 406 o una representación predeterminada?
El contrato de la interfaz lo decide. Las API automatizadas a menudo necesitan un error explícito, mientras que una página web puede recurrir a un idioma o tipo de medio predeterminado. Documenta y registra la misma regla; no devuelvas silenciosamente una representación con la semántica incorrecta.