Estoy construyendo una aplicación que implica un procesamiento de imágenes significativo. Lo estamos construyendo en una casa solar distribuida, con un número arbitrario de máquinas de procesamiento que reciben solicitudes para representar imágenes de un intercambio RabbitMQ.¿Está usando una columna mySQL de una manera sensata para lograr el bloqueo global?
Debido a que una solicitud de una imagen podría entrar mientras que una prestación ya está en proceso, y porque no quieren tener dos servidores render duplicar el trabajo, he creado una columna en la tabla de imágenes MySQL llamado is_rendering como un booleano .
Cuando un servidor de render recibe una solicitud de render se sigue una serie de pasos que se ve así:
- Seleccionar para una actualización de la fila de imagen
- Si is_rendering == true aborto render solicitud
- Establecer is_rendering == true y confirmar la transacción
- representar la imagen y guardar la imagen en miniatura en una tienda accesible globalmente
- Conjunto is_rendering == false y volver
definitivamente las obras, pero me preocupa que estas actualizaciones de bases de datos frecuentes parecen un poco tonta. Además, estoy considerando el caso límite en el que un servidor de renderización falla en el medio de un renderizado y deja is_rendering == true, lo que impide que esa imagen se represente. La solución que estoy considerando a este problema es cambiar la columna de la is_rendering de un tinyint (1) a un campo de fecha y hora, y el almacenamiento de la fecha de bloqueo como el valor "verdadero", y el valor nulo como "falsa". Una verificación de estado del servicio periódico podría seleccionar todas las filas con un valor de is_rendering más allá de un cierto período de tiempo y liberar el bloqueo en este caso.
Es éste un enfoque cuerdo a este problema, o existen otros enfoques más elegantes que debería considerar?
He implementado el enfoque de bloqueo de campo de fecha y hora varias veces – ilanco
No veo ninguna otra forma de bloqueo, salvo la introducción de dicha columna. Solo yo lo convertiría en un estado, como '0 = not_rendered, 1 = rendering, 2 = rendered'. Pero tal vez malentendí un poco tu flujo de trabajo. Y, por supuesto, el uso de las transacciones 'InnoDB' garantizará que solo una consulta simultánea pueda establecer una imagen en el estado de la representación. –
Si el enfoque en sí es sensato, no lo sé, pero como alternativa a una columna, una tabla 1: 1 'is_render (int)' por separado me parece más manejable. Simplemente agregue/elimine registros y no tendrá que escanear todos los registros de imágenes en la verificación de estado. Sin embargo, si necesita la imagen al mismo tiempo, puede ser un trabajo extra. – mkjeldsen