TI-UNICESUMAR / 2024-desafio-profissional-v-ESOFT5S-A

10 stars 14 forks source link

Entendendo o módulo Cluster #15

Open ThiagoBussola opened 2 months ago

ThiagoBussola commented 2 months ago

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

natanaelbalbo commented 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.

matheushb commented 2 months ago

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.

LorenzoMBegnozzi commented 2 months ago

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.

Yvesmorello commented 2 months ago

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.

gabriel-guerra commented 2 months ago

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.

cassiab13 commented 2 months ago

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().

joaoarteagle commented 2 months ago

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)

EnzoLavieri commented 1 month ago

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.