Open ThiagoBussola opened 2 months ago
O método cluster.fork() é utilizado para criar um novo processo filho. Quando este método é chamado, ele cria uma cópia exata do processo pai, incluindo todo o estado da aplicação. No entanto, a partir do momento em que o processo filho é criado, ele começa a executar o código a partir do ponto em que o cluster.fork() foi chamado.
A variável cluster.isPrimary é uma propriedade que indica se o processo atual é o processo pai (principal) ou um dos processos filhos.
Quando executamos o arquivo que contém o código do cluster, rodamos primeiramente com o processo primário, então irá cair no runPrimaryProcess() do ternário, que define a quantidade de processos que serão subidos, baseado na quantidade de cores do processador, para cada núcleo damos o cluster.fork() no for loop, que inicia outro processo da nossa aplicação.
Cada processo é criado no mesmo arquivo que foi executado o fork(), porém com a tag isPrimary = false, então ele cai no false do ternário e executa o runWorkerProcess(), que inicia o servidor para cada processo filho, enquanto o primaryProcess fica encarregado de distribuir as requisições.
cluster.isPrimary ? runPrimaryProcess() : runWorkerProcess(): verifica se este processo é o processo principal (pai),usando o cluster.isPrimary. Caso for o principal, chamamos de runPrimaryProcess(), para assim iniciar o processo principal e seus processos filhos, e caso não for o processo principal, significa que é um processo filho, então chamamos runWorkerProcess() para iniciar o processo filho.
Quando o aplicativo é iniciado, o cluster.isPrimary é avaliado. Se for true, o processo atual é o processo principal e runPrimaryProcess() é chamado para iniciar o processo principal. Se cluster.isPrimary for false, isso significa que o processo atual é um worker e runWorkerProcess() é chamado para iniciar o processo do worker. O processo principal cria workers usando cluster.fork() e os workers, quando criados, executam o servidor da aplicação. O código cluster.isPrimary ? runPrimaryProcess() : runWorkerProcess(); garante que o código apropriado (processo principal ou processo do worker) seja executado com base no papel do processo atual no cluster.
Quando o comando cluster.fork()
gera novas instâncias do processo principal, os forks criados são marcados como não principais e o código que disparou o comando também é executado na nova instância.
Nesse sentido, o a linha cluster.isPrimary ? runPrimaryProcess() : runWorkerProcess();
lida com essa situação; se o processo que está executando o código é o principal, a função runPrimaryProcess()
é chamada e nela são feitos os forks. Mas se o processo for um fork, então a execução é direcionada para a função runWorkerProcess()
que inicializa a função main da aplicação.
O método cluster.isPrimary pertence ao módulo cluster do Node.js e determina se o processo atual é o processo principal de um cluster Node.js ou não. Quando um cluster é iniciado no Node.js é criado um processo primário, que será o responsável por aceitar novas conexões e distribuí-las entre os processos filhos, que são cópias do processo primário. Quando um cluster.fork([env]) é realizado para criar um processo filho, é definido um 'NODE_UNIQUE_ID' no objeto de variáveis de ambiente ('env'). O cluster.isPrimary retorna true se o process.env.NODE_UNIQUE_ID é undefined e false se o process.env.NODE_UNIQUE_ID estiver definido. Assim, o cluster.isPrimary ? runPrimaryProcess() : runWorkerProcess(); faz a verificação se o processo é primário, se for ele rodará o runPrimaryProcess(). Se for um processo filho ele rodará o runWorkerProcess().
What does function runPrimary do ? :
adiciona a quantidade de cpus contidas na maquina; Pid é um identificador de processos do Node; o For cria cluster's a medida que existem CPUs uteis
runWorkerProcess é uma variavel que recebe o resultado de uma função assincrona que importa a pasta de server
a linha 13 possui um opereador ternario que valida se o processo atual é Primario(chama a função runPrimaryProcess) ou não(runWorkerProcess)
cluster.isPrimary: É um booleano que indica se o processo atual é o processo primário (master). No contexto de clustering, o processo primário é o responsável por criar e gerenciar os processos workers.
runPrimaryProcess: É uma função que você define para executar a lógica que deve ser realizada pelo processo primário. Normalmente, isso inclui a criação de workers.
runWorkerProcess: É uma função que você define para executar a lógica que deve ser realizada por cada worker. Normalmente, isso inclui a execução do servidor ou outra lógica de aplicação.
Em nossa última aula utilizamos o cluster.fork() para criar múltiplas instancias de nossa aplicação. Analise o arquivo e faça um estudo para entender como essa função interage com o código cluster.isPrimary ? runPrimaryProcess() : runWorkerProcess(); e explique seu funcionamento.
Para estudo leia os seguintes artigos: https://www.freecodecamp.org/portuguese/news/processos-filhos-em-node-js-tudo-o-que-voce-precisa-saber/ https://www.freecodecamp.org/news/scaling-node-js-applications-8492bd8afadc/ https://www.freecodecamp.org/news/how-to-scale-your-node-js-server-using-clustering-c8d43c656e8f/ https://nodejs.org/api/cluster.html#how-it-works