Por que Foreman é recomendado por Heroku in Node.js?

Isto pode ser uma pergunta tola para tipos mais experientes, e espero que não haja longos debates aqui, mas ... ..

Porque é que a Heroku recomenda usar o procfile e lançar uma web separada e um processo de trabalho separado com o foreman?

Ligação: https://devcenter.heroku.com/articles/node-best-practices

Procfile:

web: bin/web
worker: bin/worker
Aqui está o meu pensamento e três razões para o recomendarem, mas gostaria que alguém me ajudasse a entender se eu ... estou no caminho certo...

Vamos imaginar este cenário:

1) um aplicativo " web " é para lidar com APIs 2) um aplicativo" trabalhador " é para coisas que leva tempo ou requer uma repetição sobre o fracasso. Ex. a enviar um e-mail. Uma API não quer esperar muito por uma resposta HTTP, então sim. 3) então, há uma hipotética aplicação "web + worker" que faz ambos.

A) Será que ter uma aplicação separada na web e nos trabalhadores é melhor para o desempenho?

Não vejo qualquer benefício em termos de desempenho em ter a aplicação separados em uma Web separada e aplicativos de trabalhadores. Em uma máquina de 2 CPU, se tivermos 2 processos web e 2 processos de trabalho, devido à natureza de nó de simples threaded.js, será tão performante quanto ter 2 processos de um "aplicativo combinado que faz ambos Trabalho Web + trabalhador".

b) a separação é por causa da legibilidade do Código?

Talvez eu possa concordar com este.

podemos ter aulas, funções, etc.. isso só pode ser usado em trabalhadores, e alguns que só podem ser usados em a parte da web.

É para a robustez?

Em teoria, sim... Digamos, por exemplo., 1. Se tivermos uma máquina 2 CPU, 2. Nós não nos separamos em web e trabalhador, e o código do aplicativo faz tanto trabalho "Trabalhador e web", 3. Rodamos 2 processos desse aplicativo com a ajuda de clusters, 4. agendamos 2 tarefas muito longas e demoradas (CPU BOUND, sem qualquer I/O, apenas por exemplo para que ele realmente pendura um processo de nó), todo o aplicativo apenas está suspenso porque dois processos estão ocupados a lidar com estas duas tarefas.

No entanto, neste caso, eu criaria 2 processos web e apenas um processo Operário. Dessa forma, se o trabalhador está super ocupado, a web no processo restante ainda pode levar pedidos de API e responder aos clientes. Acho que sim...

O meu pensamento está correcto? Porque é que a Heroku recomenda a divisão do nódulo?código js em aplicativos para trabalhadores e web?

Author: user1076731, 2018-01-10

1 answers

O zen de Heroku é O App de 12 factores. Heroku incentiva tipos de processo separados para web e trabalhadores, que será executado em dynos escaláveis separadamente. Ver https://12factor.net/concurrency.

Além disso, para o nó.js apps, Heroku faz recomendações e fornece suporte para otimizar a concurrencia de aplicação Usando nó.js clustering , para maximizar o desempenho do nó.aplicações js a correr em dynos multi-core. Isto permite-lhe espremer o máximo desempenho de cada instância dyno, antes de recorrer à escala vertical (ou seja, aumentando os recursos de cálculo atribuídos ao seu dynos) ou à escala horizontal (ou seja, aumentando o número de instâncias dyno por tipo de processo na sua aplicação).

Note que é teoricamente possível para você executar os processos Web e Worker em um único dyno, mas simplesmente não é recomendado. Em seu procfile você poderia ter algum tipo de processo" principal " que quando executado iria gerar processos adicionais. Entanto, então você vai entrar em questões como como como monitorar se seus processos estão funcionando corretamente, e outras questões. Tudo isso é tratado automaticamente por Heroku, se você "jogar pelas regras" (veja por exemplo Dyno crash restart policy).

A conclusão é que você pode ser capaz de reduzir os seus custos do dyno, executando tanto os processos Web como os trabalhadores em um único dyno, mas isso não é realmente o que Heroku pretende para você fazer, e se você fizer isso, você pode encontrar inesperado problema.

 1
Author: Yoni Rabinovitch, 2018-01-11 07:54:53