¿Cuál es el mejor enfoque para progtwigr tareas en el clúster de docker?

Actualmente, tengo una aplicación ejecutándose en un server. Hay un crontab configurado de acuerdo con las reglas especificadas, hay tareas que se ejecutan en determinados momentos.

Ahora, estoy pensando en migrar mi aplicación al contenedor acoplable para que pueda ejecutar varias instancias de mi aplicación de forma independiente. Lo que me pregunto cómo hacer es cómo progtwigr tareas en varios contenedores de docker .

Digamos que tengo un command php que cada hora obtiene datos nuevos de aplicaciones de terceros a través de API. Actualmente, usaría un cron para progtwigrlo así: 0 */1 * * * php /some/path/index.php mycommand . Puede haber múltiples commands similares lanzados en diferentes frecuencias.

No puedo simplemente empaquetar crontab en mi image de portlet ya que el command se lanzaría 5 veces cuando hay 5 contenedores en ejecución. Quiero lanzarlo solo una vez de forma independiente en el recuento de contenedores en funcionamiento.

¿Cuál sería la solución ideal para lograr esto?

Podría usar un mecanismo de locking, usando algo como networkingis. Básicamente funcionaría así.

El script se activa, lo primero que hace es intentar get el locking. Si obtiene el locking, se mueve hacia adelante, si algo más tiene el locking, luego sale. Haga lo que hace el script y luego suelte el locking.

Como solo un script puede get el locking a la vez, solo permitirá que el script se ejecute una vez.

Es importante eliminar el locking cuando se completa el script, y también agregar un TTL al locking, de modo que si el script muere antes de liberar el locking, el locking se abrirá automáticamente después de que expire el TTL.

Aquí hay algunos documentos sobre cómo usar Redis como un locking distribuido. https://networkingis.io/topics/distlock

Una estrategia simple en su caso sería usar contenedores con roles separados. Por ejemplo, en lugar de utilizar 5 contenedores que responden a requestes HTTP Y ejecutar cron, puede tener 4 contenedores ejecutando solo su aplicación y una exclusivamente para tareas cron.

Si alguna vez necesita ampliar sus trabajos cron agregando más nodos, entonces necesitará una solución distribuida de queue / locking como describió @Ken Cochrane.