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.
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:
Qual é a abordagem preferida?
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.
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.
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.
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!
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:)
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
Tags architecture tomcat cluster