Para o bem ou para o mal, migramos todo o nosso aplicativo da web LAMP de máquinas dedicadas para a nuvem (máquinas Amazon EC2). Está indo muito bem até agora, mas a forma como fazemos crons está abaixo do ideal. Tenho uma pergunta específica da Amazon sobre como gerenciar melhor os cron jobs na nuvem usando "o jeito da Amazon".
O problema : temos vários servidores da web e precisamos executar crons para jobs em lote, como criar feeds RSS, disparar e-mails, muitas coisas diferentes, na verdade. MAS os cron jobs precisam ser executados apenas em uma máquina porque eles geralmente gravam no banco de dados e, portanto, duplicariam os resultados se executados em várias máquinas.
Até agora, designamos um dos servidores web como o "servidor web mestre" e ele tem algumas tarefas "especiais" que os outros servidores web não têm. A desvantagem da computação em nuvem é a confiabilidade - não queremos um "servidor web mestre" porque é um ponto único de falha. Queremos que todos sejam idênticos e sejam capazes de aumentar e diminuir a escala sem nos lembrar de não retirar o servidor da web mestre do cluster.
Como podemos redesenhar nosso aplicativo para converter tarefas cron do Linux em itens de trabalho transitórios que não têm um único ponto de falha?
Minhas ideias até agora:
- Tenha uma máquina dedicada apenas ao funcionamento de crons. Isso seria um pouco mais gerenciável, mas ainda seria um ponto único de falha e desperdiçaria algum dinheiro tendo uma instância extra.
- Alguns trabalhos podem ser movidos de crons do Linux para eventos do MySQL, no entanto, não sou um grande fã dessa ideia, pois não quero colocar a lógica do aplicativo na camada do banco de dados.
- Talvez possamos executar todos os crons em todas as máquinas, mas mudar nossos scripts cron para que todos eles comecem com um pouco de lógica que implementa um mecanismo de bloqueio de forma que apenas um servidor realmente execute uma ação e os outros simplesmente pulem. Não sou fã dessa ideia, pois parece potencialmente problemática e eu preferiria usar uma prática recomendada da Amazon em vez de lançar a nossa própria.
- Estou imaginando uma situação em que os jobs são agendados em algum lugar, adicionados a uma fila e então os servidores da web podem ser cada um um trabalhador, que pode dizer "ei, vou pegar esse aqui". O Amazon Simple Workflow Service soa exatamente esse tipo de coisa, mas atualmente não sei muito sobre ele, portanto, quaisquer detalhes seriam úteis. Parece meio pesado para algo tão simples como um cron? É o serviço certo ou existe um serviço Amazon mais adequado?
Atualização: depois de fazer a pergunta, assisti ao seminário on-line do Amazon Simple Workflow Service no YouTube e notei às 34:40 ( http://www.youtube.com/watch?v=lBUQiek8Jqk#t=34m40s ) que vislumbrei um slide mencionando cron jobs como um aplicativo de amostra. Em sua página de documentação, " Amostras do AWS Flow Framework para Amazon SWF ", a Amazon afirma ter um código de amostra para crons:
... > Cron jobs Neste exemplo, um fluxo de trabalho de longa execução executa periodicamente uma atividade. É demonstrada a capacidade de continuar as execuções como novas execuções, de forma que uma execução possa ser executada por longos períodos de tempo. ...
Eu baixei o AWS SDK para Java ( http://aws.amazon.com/sdkforjava/ ) e com certeza enterrado em camadas ridículas de pastas há algum código java ( aws-java-sdk-1.3.6/samples/AwsFlowFramework/src/com/amazonaws/services/simpleworkflow/flow/examples/periodicworkflow
).
O problema é que, para ser honesto, isso não ajuda muito, pois não é algo que posso digerir facilmente com meu conjunto de habilidades. A mesma amostra está faltando no SDK do PHP e não parece haver um tutorial que analise o processo. Então, basicamente, ainda estou procurando conselhos ou dicas.