Nel bene e nel male, abbiamo migrato tutta la nostra applicazione web LAMP da macchine dedicate al cloud (macchine Amazon EC2). Finora sta andando alla grande, ma il modo in cui facciamo i cron non è ottimale. Ho una domanda specifica per Amazon su come gestire al meglio i cron job nel cloud utilizzando "la modalità Amazon".
Il problema : abbiamo più server web e abbiamo bisogno di eseguire crons per lavori batch come la creazione di feed RSS, l'attivazione di e-mail, molte cose diverse in realtà. MA i cron job devono essere eseguiti solo su una macchina perché spesso scrivono nel database, quindi duplicherebbero i risultati se eseguiti su più macchine.
Finora, abbiamo designato uno dei server web come "server web principale" e ha alcuni compiti "speciali" che gli altri server web non hanno. Il compromesso per il cloud computing è l'affidabilità: non vogliamo un "server web master" perché è un singolo punto di errore. Vogliamo che siano tutti identici e che siano in grado di eseguire l'upscaling e il downscaling senza ricordarsi di non estrarre il server web principale dal cluster.
Come possiamo riprogettare la nostra applicazione per convertire i cron job di Linux in elementi di lavoro temporanei che non hanno un singolo punto di errore?
Le mie idee finora:
- Avere una macchina dedicata solo alla corsa dei cron. Questo sarebbe un po 'più gestibile, ma sarebbe comunque un single-point-of-failure e sprecherebbe un po' di soldi per avere un'istanza in più.
- Alcuni lavori potrebbero essere trasferiti da utenti Linux a eventi MySQL, tuttavia non sono un grande fan di questa idea in quanto non voglio inserire la logica dell'applicazione nel livello del database.
- Forse possiamo eseguire tutti i cron su tutte le macchine ma modificare i nostri script cron in modo che inizino tutti con un po 'di logica che implementa un meccanismo di blocco in modo che solo un server effettui un'azione e gli altri saltino. Non sono un fan di questa idea in quanto suona potenzialmente buggata e preferirei utilizzare una best practice di Amazon piuttosto che eseguire la nostra.
- Immagino una situazione in cui i lavori sono programmati da qualche parte, aggiunti a una coda e quindi i server web potrebbero essere ciascuno un lavoratore, che può dire "ehi, prendo questo". Amazon Simple Workflow Service suona esattamente questo genere di cose, ma al momento non ne so molto, quindi qualsiasi specifica sarebbe utile. Sembra un po 'pesante per qualcosa di semplice come un cron? È il servizio giusto o esiste un servizio Amazon più adatto?
Aggiornamento: da quando ho posto la domanda ho guardato il webinar Amazon Simple Workflow Service su YouTube e ho notato che alle 34:40 ( http://www.youtube.com/watch?v=lBUQiek8Jqk#t=34m40s ) ho intravisto un diapositiva che menziona cron jobs come applicazione di esempio. Nella loro pagina di documentazione, " Esempi di AWS Flow Framework per Amazon SWF ", Amazon afferma di avere un codice di esempio per crons:
... > Cron jobs In questo esempio, un flusso di lavoro a lunga esecuzione esegue periodicamente un'attività. Viene dimostrata la capacità di continuare le esecuzioni come nuove esecuzioni in modo che un'esecuzione possa essere eseguita per periodi di tempo molto estesi. ...
Ho scaricato l'SDK AWS per Java ( http://aws.amazon.com/sdkforjava/ ) e sicuramente sepolto all'interno di ridicoli livelli di cartelle c'è del codice java ( aws-java-sdk-1.3.6/samples/AwsFlowFramework/src/com/amazonaws/services/simpleworkflow/flow/examples/periodicworkflow
).
Il problema è che, se devo essere onesto, questo non aiuta davvero perché non è qualcosa che posso digerire facilmente con le mie abilità. Lo stesso esempio non è presente nell'SDK PHP e non sembra esserci un tutorial che accompagni il processo. Quindi, in pratica, sto ancora cercando consigli o suggerimenti.