Nuevo en Symfony 4.1: Locks dinámicos

El componente Lock se introdujo en Symfony 3.4 para simplificar el manejo de locks locales o remotos que garantizan un acceso único a un determinado recurso. Aunque es uno de los componentes más recientes, ya se usa en proyectos como el CMS Contao y el Google Cloud SDK.

Una de sus principales funcionalidades son los locks que expiran automáticamente después de que haya pasado un determinado tiempo llamado TTL (time to live). El problema es que para las tareas complejas es difícil elegir un buen TTL, así que es habitual empezar con un TTL no muy grande y después llamar al método refresh() para mantener el lock durante TTL segundos otra vez:

$lock->acquire();
try {
    while (!$finished) {
        // hacer aquí una parte del trabajo...
        $lock->refresh();
    }
} finally {
    $lock->release();
}

El problema de refresh() es que cuando realizas tareas diferentes, el TTL puede no ser suficiente para las tareas más complejas. Así que en Symfony 4.1 hemos mejorado el método refresh() para que acepte como argumento un TTL que se utiliza solamente para ese refresco del lock y no para los siguientes:

// el TTL original son 30 segundos
$lock = $factory->createLock('nombre-del-lock', 30);
// ...
$lock->acquire();
 
// mantiene el lock durante 30 segundos más
$lock->refresh();
// ...
 
// mantiene el lock durante 10 minutos (600 segundos) porque se va a hacer
// una tarea compleja que no se completa en los 30 segundos originales
$lock->refresh(600);
// ...
 
// el nuevo refresco mantiene el lock durante 30 segundos otra vez
$lock->refresh();
// ...

Esta funcionalidad fue contribuida por Jérémy Derussé en el pull request #26232.

Fuente: New in Symfony 4.1: Dynamic lock refresh

Comentarios

Publicada el

22 de marzo de 2018

Etiquetas

Proyectos Symfony destacados

La forma más sencilla de generar el backend de tus aplicaciones Symfony. Ver más

Descargas totales de Symfony

1.618.978.861

Ver descargas en tiempo real

Síguenos en @symfony_es para acceder a las últimas noticias.