¿Qué es el encoding justo a tiempo?
El encoding justo a tiempo crea bajo demanda una variante multimedia solicitada en lugar de calcular de antemano cada variante de resolución, códec o calidad. Después, el resultado puede almacenarse en caché para solicitudes posteriores.
Cómo funciona el encoding justo a tiempo
Un sistema justo a tiempo sitúa el codificador detrás de la URL de entrega. Una solicitud indica un origen y una receta; se consulta una caché para buscar un resultado almacenado y el encoding solo se ejecuta si no se encuentra, tras lo cual la salida se devuelve y se almacena para solicitudes posteriores. Esa caché puede ser una CDN delante del codificador, un almacenamiento que el propio servicio gestiona o ambos. Un codificador que no dispone de ninguno repite el trabajo en cada solicitud, y un resultado almacenado solo se reutiliza hasta que vence o se expulsa de la caché. Para las imágenes, la unidad de trabajo es una URL. Para el video, la unidad práctica es un segmento de un stream adaptativo, en lugar del archivo completo: un reproductor HLS solicita primero listas de reproducción, que el servicio genera sobre la marcha, y después solicita segmentos cortos, cada uno de los cuales se codifica la primera vez que se solicita. Solo se codifican las variantes y los intervalos de tiempo solicitados; los reproductores cargan segmentos por adelantado respecto de la posición de reproducción, por lo que pueden incluirse segmentos que nadie termina viendo. Mux, que lo llama transcodificación justo a tiempo, describe el envío en streaming de fotogramas desde el transcodificador antes de que se complete el resto del archivo.
Datos clave
- ¿El empaquetado justo a tiempo es lo mismo? No. El empaquetado justo a tiempo vuelve a empaquetar variantes que ya existen en el formato de streaming que solicita un reproductor. AWS Elemental MediaPackage lo describe como la creación de un manifiesto en un formato compatible con el dispositivo que lo solicita; su contenido de origen proviene de un codificador anterior para el video en vivo y, para el video bajo demanda, de archivos HLS o MP4 almacenados en Amazon S3. nginx-vod-module describe el reempaquetado sobre la marcha de archivos MP4 a DASH, HDS, HLS y MSS. Ninguno describe el encoding a una nueva resolución o tasa de bits, por lo que la escala de encoding debe seguir produciéndose de antemano. El encoding justo a tiempo también aplaza ese paso.
- ¿Qué costo tiene la primera solicitud y qué ocurre si llegan muchas a la vez? La primera solicitud de una salida debe esperar a que se recupere el archivo de origen y se realice el encoding; las solicitudes posteriores son aciertos de caché mientras el resultado permanezca almacenado en ella. La documentación de imgproxy señala que las CDN suelen eliminar el contenido al que se accede con poca frecuencia, por lo que una salida que se solicita rara vez puede codificarse más de una vez. Las primeras solicitudes concurrentes de la misma salida pueden iniciar un encoding cada una, a menos que la caché situada delante las agrupe en una sola o que el propio codificador comparta el trabajo en curso, como hace el servidor de imágenes imagor. La agrupación tiene condiciones: Cloudflare agrupa por centro de datos,
proxy_cache_lockde NGINX está desactivado de forma predeterminada y, en Fastly, una respuesta que no puede almacenarse en caché hace que las solicitudes en cola se envíen al origen una tras otra. - ¿Qué ocurre con la salida almacenada en caché cuando cambia la configuración de encoding? Nada de inmediato, salvo que el cambio altere la clave de caché. Un resultado almacenado se encuentra por su clave, normalmente formada por el origen, las opciones de procesamiento y el formato de salida, por lo que un cambio en un ajuste preestablecido del lado del servidor, la calidad predeterminada o una marca de agua que no se refleje en la solicitud deja la salida anterior en su lugar hasta que vence o se invalida. imgproxy documenta una opción de URL
cachebusterprecisamente para este caso y señala que su caché interna no tiene invalidación manual, sino únicamente el vencimiento establecido en el almacenamiento que utiliza. Incluir una versión en la URL cuando cambia una receta asigna de inmediato una nueva clave a la nueva salida. - ¿Qué debería ocurrir cuando falla un encoding? La respuesta de error necesita su propia política de caché. Si lleva el tiempo de vida de un resultado satisfactorio, un fallo transitorio persiste: un usuario de imgproxy informó de una respuesta 504 enviada con un encabezado
Cache-Controlde un año y almacenada por una caché NGINX situada más adelante. Si los errores nunca se almacenan en caché, cada solicitud de un archivo de origen defectuoso repite el fallo costoso. Sin encabezados de caché explícitos, HTTP permite que una caché almacene y reutilice una respuesta 404, que puede almacenarse en caché de forma heurística, pero no una respuesta 500, 503 o 504. Las directivas deCache-Controlcambian esto en uno u otro sentido:max-ageopublicpermite almacenar un error de ese tipo, yno-storeprohíbe almacenar cualquier respuesta.
Cuándo es importante el encoding justo a tiempo
El encoding justo a tiempo resulta útil cuando no puedes predecir qué variantes o qué partes de un archivo se solicitarán: grandes archivos de contenido y subidas de usuarios cuyo material rara vez se ve en su mayoría, o tamaños de imagen que dependen de diseños que aún no has creado. Los procesos de encoding que nadie solicita nunca se ejecutan. Para el material que rara vez se solicita, el tiempo que un resultado permanece en caché determina con qué frecuencia una solicitud repetida vuelve a pagar el costo del encoding. En cambio, realiza el encoding de antemano cuando todas las salidas deban estar listas antes de la publicación, cuando alguien deba revisarlas primero o cuando la primera solicitud deba ser tan rápida como todas las posteriores. Una escala fija de variantes no es, por sí sola, un motivo para realizar el encoding de antemano: un codificador justo a tiempo puede servir variantes predefinidas y aun así omitir los segmentos que nadie solicita.
Cómo ayuda Transloadit con el encoding justo a tiempo
Transloadit ofrece encoding justo a tiempo a través de su Smart CDN. Para video, el Robot /video/ondemand genera listas de reproducción y segmentos HLS bajo demanda: un reproductor solicita la lista de reproducción multivariante desde una URL de tlcdn.com, cada segmento se codifica la primera vez que se solicita y el Smart CDN almacena en caché las listas de reproducción y los segmentos para espectadores posteriores. Para imágenes y otros archivos, una URL de Smart CDN ejecuta un Template cuando no encuentra el resultado en caché y sirve el resultado almacenado en caché hasta que vence.
La documentación de /video/ondemand describe la salida HLS. El Robot /file/serve establece cuánto tiempo se almacenan los resultados en caché: de forma predeterminada, indica a las CDN que conserven un resultado durante 24 horas y a los navegadores durante 72 horas, y cache_duration modifica ambos plazos. Cuando las URL de las listas de reproducción se firman con sign_urls_for, los plazos de vencimiento más cortos reducen la reutilización de la caché y pueden aumentar la regeneración de segmentos. Las páginas enlazadas no indican qué ocurre con los resultados que ya están en caché cuando se edita un Template, ni qué recibe un reproductor cuando falla el encoding de un segmento, así que prueba ambas situaciones antes de depender de ese comportamiento.
Fuentes
- Blog de ingeniería de Mux: transcodificación justo a tiempo y contenido cuyo encoding evita
- AWS Elemental MediaPackage: conceptos y terminología (empaquetado justo a tiempo)
- README de kaltura/nginx-vod-module: reempaquetado sobre la marcha y recomendaciones de almacenamiento en caché
- RFC 8216: HTTP Live Streaming, sección 6.3.3 (los clientes cargan segmentos por adelantado)
- RFC 9110: semántica HTTP, sección 15.1 (códigos de estado que permiten el almacenamiento en caché de forma heurística)
- RFC 9111: almacenamiento en caché HTTP (almacenamiento y reutilización de respuestas, solicitudes agrupadas, directivas de Cache-Control)
- Cloudflare: comportamiento predeterminado de la caché, incluida la agrupación de solicitudes
- NGINX ngx_http_proxy_module: proxy_cache_lock y proxy_cache_valid
- Fastly: agrupación de solicitudes
- Código fuente de cshum/imagor: las solicitudes concurrentes del mismo resultado comparten una operación en curso
- imgproxy: clave de caché interna, vencimiento y limitaciones
- imgproxy: opciones de procesamiento, incluida cachebuster
- Incidencia 686 de imgproxy: un responsable de mantenimiento explica por qué dejar el almacenamiento en caché a las CDN y los servidores de caché
- Incidencia 1677 de imgproxy: Cache-Control enviado en una solicitud fallida