Para bien o para mal, hemos migrado toda nuestra aplicación web LAMP de máquinas dedicadas a la nube (máquinas Amazon EC2). Va muy bien hasta ahora, pero la forma en que hacemos crons es sub-óptimo. Tengo una pregunta específica de Amazon sobre cómo administrar mejor los trabajos cron en la nube usando "la forma de Amazon".
El problema : tenemos varios servidores web y necesitamos ejecutar crons para trabajos por lotes, como crear feeds RSS, activar correos electrónicos, muchas cosas diferentes en realidad. PERO los trabajos cron solo deben ejecutarse en una máquina porque a menudo escriben en la base de datos, por lo que duplicarían los resultados si se ejecutaran en varias máquinas.
Hasta ahora, hemos designado a uno de los servidores web como el "servidor web maestro" y tiene algunas tareas "especiales" que los otros servidores web no tienen. La compensación por la computación en la nube es la confiabilidad: no queremos un "servidor web maestro" porque es un único punto de falla. Queremos que todos sean idénticos y que puedan aumentar y reducir la escala sin recordar no sacar el servidor web principal del clúster.
¿Cómo podemos rediseñar nuestra aplicación para convertir trabajos cron de Linux en elementos de trabajo transitorios que no tienen un solo punto de falla?
Mis ideas hasta ahora:
- Tenga una máquina dedicada solo a ejecutar crons. Esto sería un poco más manejable, pero aún sería un punto de falla único y desperdiciaría algo de dinero teniendo una instancia adicional.
- Es posible que algunos trabajos se trasladen de los crons de Linux a MySQL Events; sin embargo, no soy un gran fanático de esta idea, ya que no quiero poner la lógica de la aplicación en la capa de la base de datos.
- Quizás podamos ejecutar todos los crons en todas las máquinas, pero cambiar nuestros scripts cron para que todos comiencen con un poco de lógica que implemente un mecanismo de bloqueo para que solo un servidor realmente actúe y los demás simplemente salten. No soy un fanático de esta idea, ya que suena potencialmente defectuoso y preferiría usar una de las mejores prácticas de Amazon en lugar de lanzar la nuestra.
- Me estoy imaginando una situación en la que los trabajos se programan en algún lugar, se agregan a una cola y luego los servidores web podrían ser cada uno un trabajador, que puede decir "oye, me quedo con este". Amazon Simple Workflow Service suena exactamente a este tipo de cosas, pero actualmente no sé mucho al respecto, por lo que cualquier detalle sería útil. ¿Parece algo pesado para algo tan simple como un cron? ¿Es el servicio adecuado o hay un servicio de Amazon más adecuado?
Actualización: desde que hice la pregunta, vi el seminario web de Amazon Simple Workflow Service en YouTube y me di cuenta de que a las 34:40 ( http://www.youtube.com/watch?v=lBUQiek8Jqk#t=34m40s ) vislumbré un diapositiva que menciona trabajos cron como una aplicación de muestra. En su página de documentación, " Muestras de AWS Flow Framework para Amazon SWF ", Amazon dice que tiene un código de muestra para crons:
... > Trabajos cron En este ejemplo, un flujo de trabajo de larga duración ejecuta periódicamente una actividad. Se demuestra la capacidad de continuar las ejecuciones como nuevas ejecuciones, de modo que una ejecución puede ejecutarse durante períodos de tiempo muy prolongados. ...
Descargué el AWS SDK para Java ( http://aws.amazon.com/sdkforjava/ ) y, efectivamente, enterrado dentro de unas ridículas capas de carpetas, hay algo de código Java ( aws-java-sdk-1.3.6/samples/AwsFlowFramework/src/com/amazonaws/services/simpleworkflow/flow/examples/periodicworkflow
).
El problema es que, si soy honesto, esto realmente no ayuda, ya que no es algo que pueda digerir fácilmente con mis habilidades. Falta la misma muestra en el SDK de PHP y no parece haber un tutorial que recorra el proceso. Básicamente, sigo buscando consejos o sugerencias.