Execução confiável de operações em segundo plano

1

Estou procurando uma recomendação sobre como executar operações em segundo plano com segurança. Tenho muitos servidores postando mensagens de operação no AWS SQS e tenho outro servidor que executará essas operações intensivas da CPU quando ocioso.

  1. Eu preciso de algum tipo de mecanismo de pesquisa para verificar o SQS de vez em quando para novas operações. O cron é a melhor maneira de fazer isso? Eu estava pensando em colocar um script PHP no cron e sondar a cada 5 minutos - isso é confiável?

  2. Preciso ter certeza de que uma operação (mensagem do SQS) seja processada por vez. Algum processamento pode levar mais de 5 minutos - como posso notificar o cron para não pesquisar se as operações estão pendentes?

  3. Como posso executar operações apenas quando a CPU está inativa? O PHP disponibiliza dados da CPU?

Acima de tudo, preciso que isso seja altamente confiável. Se o processamento em uma operação falhar, isso não afetará operações futuras.

Alguém pode me apontar na direção certa?

    
por Errol Fitzgerald 23.03.2014 / 23:26

1 resposta

2

I need some sort of polling mechanism to check SQS every so often for new operations. Is cron the best way to do this? I was thinking of putting a PHP script in cron and poll every 5 minutes - is this reliable?

Isso deve ser bastante confiável, a menos que você precise de algo mais refinado.

I need to make sure one operation (message from SQS) is processed at a time. Some processing may take more than 5 minutes - how can I notify cron not to poll if operations are pending?

Faça seu programa checar a existência de algum arquivo de carimbo. Se existir, o programa chamado cron sairá sem fazer mais trabalho.

How can I run operations only when the CPU is idle? Does PHP make CPU data available?

Se você executar suas operações intensivas de CPU por meio da classe de agendamento IDLE usando chrt --idle command args

Note que isso será executado na fila de processamento quando o processador não tiver outro trabalho a fazer, você pode achar que esse comportamento leva o processo a se tornar lento demais! Uma conseqüência disso é que sua carga sempre aparecerá um pouco abaixo de 1 (já que o processo permanecerá por longos períodos na fila de execução sem ser agendado).

Finalmente, você pode usar o comando batch para agendar tarefas a serem executadas quando a carga estiver abaixo de um determinado valor - francamente, não é muito dinâmico e não será retido depois de iniciado.

    
por 23.03.2014 / 23:59