Un posible problema con los servicios cron en Beanstalk es que un comando programado determinado podría ser invocado por más de un servicio si la aplicación se ejecuta en más de una instancia. Se necesita coordinación entre las instancias en ejecución de Tomcat para garantizar que los trabajos se ejecuten solo en una, y que si uno de ellos muere, el servicio cron no se interrumpe.
Cómo estoy poniendo en práctica es como esto:
- paquete del trabajo cron "archivo de configuración" en la guerra. Este archivo debe contener frecuencias y URL (ya que cada cron real es simplemente una invocación de una URL específica, como lo hace AE)
- Use una sola tabla de base de datos para mantener la coordinación. Requiere al menos dos columnas.
- tecla principal o única que (cadena) para mantener el comando junto con su frecuencia. (por ejemplo, "@daily http://your-app/some/cron/handler/url")
- una segunda columna que contiene el último tiempo de ejecución.
cada instancia de Tomcat se ejecutará un hilo cron que debe leer la configuración de la guerra y programar en sí a dormir el tiempo necesario hasta la siguiente invocación de servicio. una vez que llega el momento, la instancia primero debe intentar "reclamar" la invocación primero agarrando la última vez de invocación para ese comando de la base de datos y luego actualizándola para obtener el "bloqueo".
query(SELECT last_execution_time FROM crontable WHERE command = ?)
if(NOW() - last_execution_time < reasonable window) skip;
query(UPDATE crontable SET last_execution_time = NOW() WHERE command = ? AND last_execution_time = ?)
if(number of rows updated == 0) skip;
run task()
El elemento clave aquí es que también incluimos el last_execution_time
en la cláusula WHERE, asegurando que si algún otro instancia lo actualiza entre cuando SELE CT y UPDATE, la actualización devolverá que no se afectaron las filas y esta instancia se saltará la ejecución de esa tarea.
Conoce el servicio Simple Queue: http://aws.amazon.com/sqs/ – Calvin
También puede resultarle útil la revisión de TyphoonAE (http://code.google.com/p/typhoonae/). –