Executando trabalhos em segundo plano Em um ambiente em cluster

4

Eu tenho uma questão de arquitetura. Em um ambiente de aplicativo da web em cluster, posso pensar em três maneiras de lidar com tarefas em segundo plano:

  1. tem uma máquina dedicada para executar todos os trabalhos, liberando assim os servidores da web de fazê-lo
  2. faça com que cada servidor da web também execute trabalhos em segundo plano, usando um mecanismo para garantir que não haja duas máquinas iniciando o mesmo trabalho
  3. ter um dos servidores da web duplicados como jobs-runner

Qual é a abordagem preferida?

    
por Peldi Guilizzoni 28.09.2011 / 11:04

6 respostas

0

Se você tem os recursos, e não importa para as tarefas em segundo plano de onde eles são executados, eu optaria pela opção 1.

Não há motivos para isso, além de por que sobrecarregar seus servidores da Web se você não precisar.

    
por 28.09.2011 / 18:56
0

Depende do seu orçamento, mas a abordagem mais desejável é executar trabalhos em máquinas separadas daqueles que veiculam conteúdo da web. Dá uma boa separação de interesses e você não precisa se preocupar com a experiência na web que está sendo afetada por um trabalho pesado sendo executado.

    
por 28.09.2011 / 18:58
0

IANAExpert, mas imagino que a opção 1 seria preferível. O raciocínio por trás disso é uma simples separação de preocupações. Se os trabalhos tiverem sua própria máquina dedicada, você poderá gerenciar melhor o crescimento. Se você usar a opção 2, terá um potencial de processamento de trabalho que não corresponde aos requisitos. Embora os recursos utilizados devam ser os mesmos, independentemente de uma ou várias máquinas estarem executando as tarefas, imagino que o sistema de filas que você está usando tenha alguma sobrecarga. Além disso, se algo der errado com a fila ou com o servidor da web, você não trará o outro para baixo. Você já fez o silo de cada parte do seu aplicativo, para que você possa crescer conforme necessário, não como sua arquitetura exige.

    
por 28.09.2011 / 18:59
0

Cada opção tem prós e contras e para selecionar a maneira preferida em qualquer caso é necessário (imho) um pouco mais de informação. Por exemplo, que tipo de trabalhos em segundo plano? Essa é uma questão crucial, porque se, por exemplo, o processo de negócios for interessante, aproveite o cluster já presente.

Se, por exemplo, os processos de manutenção não diretamente relacionados aos negócios (ou às necessidades dos usuários) puderem ter mais sentido em ter um hardware separado (ou virtual).

Na minha experiência, às vezes, todos nós somos um pouco relutantes em usar o cluster, mas os clusters estão no lugar certo para usá-los!

    
por 28.09.2011 / 19:34
0

Peldi, considere o uso de uma abordagem que permita ter uma única fila de trabalhos (preferencialmente no banco de dados) e um ou vários corredores de trabalho. Dessa forma, você pode executar um ou vários trabalhadores em uma ou várias máquinas diferentes - e isso tornará sua configuração flexível.

Eu não sei que tipo de tarefas você vai executar e quais tecnologias usará, mas no mundo Ruby / Rails essa tarefa pode ser resolvida usando delayed_job

Algumas outras informações sobre processamento em segundo plano estão disponíveis no link

Pessoalmente, no meu projeto, executo trabalhos em segundo plano na mesma máquina em que o banco de dados reside, mas posso adicionar mais trabalhadores / máquinas mais tarde, se houver necessidade.

Espero que isso ajude:)

    
por 28.09.2011 / 20:30
0

Enfrentado a mesma situação em que você está:

Eu não escolheria a opção 1, pois você tem um único ponto de falha. ou um trabalho de arquitetura adicional para derrogar essa falha

Eu não escolheria a opção 3, pois você acabará com códigos da Web não-idênticos e isso impedirá qualquer automação futura.

Eu usaria a opção 2 e teria um serviço de fila central, de preferência um baseado em nuvem, já que ele já estará em cluster, economizando assim o ônus do failover, da escala, etc.

Estou assumindo que você já lidou com o failover e o carregamento usando um cluster com seus códigos da Web, então eu simplesmente adicionaria à carga de trabalho desses cavalos, mas executando em um processo separado.

Espero que ajude

    
por 29.09.2011 / 18:47