Tu primera experiencia con Node.js

1

驴D贸nde aprender backend con Node.js actualizado?

2

Todo lo que aprender谩s sobre backend con Node.js

3

驴Qu茅 es Node.js?

4

驴Qu茅 es Node.js y para qu茅 sirve?

5

Diferencias entre Node.js y JavaScript

6

Resumen: Diferencias Nodejs y Javascript

7

Instalaci贸n de Node.js

8

Arquitectura orientada a eventos

9

Node.js para la web

Manejo y uso de Streams con Node.js

10

Introducci贸n a streams

11

Readable y Writable streams

12

Duplex y Transforms streams

Uso de utilidades de Node.js

13

Sistema operativo y sistema de archivos

14

Administrar directorios y archivos

15

Consola, utilidades y debugging

16

Clusters y procesos hijos

Crea tu primer proyecto en Express.js

17

驴Qu茅 es Express.js y para qu茅 sirve?

18

Creando tu primer servidor con Express.js

19

Request y Response Objects

Aprende a crear un API con REST

20

Anatom铆a de una API Restful

21

Estructura de una pel铆cula con Moockaru

22

Implementando un CRUD en Express.js

23

M茅todos idempotentes del CRUD

24

Implementando una capa de servicios

C贸mo conectarse con librer铆as externas en Express.js

25

Creaci贸n de una BD en MongoAtlas

26

Conexi贸n a MongoAtlas una instancia de MongoDB

27

Conexi贸n con Robot3T y MongoDB Compass a una BD

28

Implementaci贸n de las acciones de MongoDB

29

Conexi贸n de nuestros servicios con MongoDB

Conoce como funcionan los Middleware en Express.js

30

驴Qu茅 es un middleware? Capa de manejo de errores usando un middleware

31

Manejo de errores as铆ncronos y s铆ncronos en Express

32

Capa de validaci贸n de datos usando un middleware

33

驴Qu茅 es Joi y Boom?

34

Implementando Boom

35

Implementando Joi

36

Probar la validaci贸n de nuestros endpoints

37

Middlewares populares en Express.js

Implementa tests en Node.js

38

Creaci贸n de tests para nuestros endpoints

39

Creaci贸n de tests para nuestros servicios

40

Creaci贸n de tests para nuestras utilidades

41

Agregando un comando para coverage

42

Debugging e inspect

Despliega tu primera aplicaci贸n en Express.js

43

Considerando las mejores pr谩cticas para el despliegue

44

Variables de entorno, CORS y HTTPS

45

驴C贸mo implementar una capa de manejo de cach茅?

46

驴C贸mo contener tu aplicaci贸n en Docker?

47

Despliegue en Now

Conclusiones

48

驴Qu茅 aprendiste en este curso?

Clusters y procesos hijos

16/48

Lectura

Una sola instancia de Node.js corre un solo hilo de ejecuci贸n. Para tomar ventaja de los sistemas con multiples core, necesitamos lanzar un cluster de procesos de Node.js para manejar la carga.

El m贸dulo cluster nos permite la creaci贸n f谩cil de procesos hijos que comparten el mismo puerto del servidor. Veamos un ejemplo en c贸digo:

const cluster = require("cluster");
const http = require("http");


// Requerimos la cantidad de CPUs que tiene la maquina actual
const numCPUs = require("os").cpus().length;


if (cluster.isMaster) {
  console.log(`Master ${process.pid} is running`);


  // Si el cluster es maestro, creamos tantos procesos como numero de CPUS
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }


  // Si por alguna raz贸n el cluster se finaliza hacemos un log
  cluster.on("exit", (worker, code, signal) => {
    console.log(`worker ${worker.process.pid} died`);
  });
} else {
  // Los diferentes workers pueden compartir la conexi贸n TCP
  // En este caso es una servidor HTTP
  http
    .createServer((req, res) => {
      res.writeHead(200);
      res.end("hello world\n");
    })
    .listen(8000);


  console.log(`Worker ${process.pid} started`);
}

Si corremos nuestro archivo de Node.js ahora compartir谩 el puerto 8000 con los diferentes workers:

$ node server.js
Master 3596 is running
Worker 4324 started
Worker 4520 started
Worker 6056 started
Worker 5644 started

En Windows, todav铆a no es posible establecer un nombre de proceso server en un worker.

Aportes 32

Preguntas 1

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Reg铆strate o inicia sesi贸n para participar.

Hola Devs, por lo visto muchos de nosotros ha tenido inconvenientes al entender muchas cosas del curso, por esta razon, vengo a tratar de explicarles a aquellos que estan perdidos como yo lo estuve, vamos a ver鈥

驴Que es un Cluster en NodeJS?
-Segun la documentacion:
El m贸dulo de cl煤ster proporciona una forma de crear procesos secundarios que se ejecutan simult谩neamente y comparten el mismo puerto del servidor.

Node.js ejecuta programaci贸n de un solo hilo, que es muy eficiente en la memoria, pero para aprovechar los sistemas de m煤ltiples n煤cleos de las computadoras, el m贸dulo Cluster le permite crear f谩cilmente procesos secundarios que cada uno ejecuta en su propio hilo 煤nico, para manejar la carga.

-Segun mi analisis: El Cluster de NodeJS no es mas que tomar el hilo principal que ejecuta Node y usando los cores del procesador, crear mas hilos de ejecucion, pero que dependen del hilo principal, aun asi Node siguira ejecutandose en un solo hilo, solo que con los Clusters tendra sub-hilos podriamos decir que puedan ejecutar mas procesos, de esta manera manejar la carga al hilo principal.

Ahora bien se preguntaran como lo implemento:

Segun la documentacion dice que se crea de esta manera:

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  console.log(`Master ${process.pid} is running`);

  // Fork workers.
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`worker ${worker.process.pid} died`);
  });
} else {
  // Workers can share any TCP connection
  // In this case it is an HTTP server
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('hello world\n');
  }).listen(8000);

  console.log(`Worker ${process.pid} started`);
}

Ahora bien, se preguntaran, que carajos significa todo eso, que aun estan como el principio; bien, no se me alarmen, vamos a explicar detalladamente por pasos del codigo, comencemos:

La primera parte del codigo es algo que ya todos ustedes saben, traemos los modulos de 鈥榗luster鈥: nos permite instanciar nuestro cluster, y 鈥榟ttp鈥: nos permite crear nuestro servidor.

const cluster = require("cluster");
const http = require("http");

La siguiente linea de codigo es esta:

const numCPUs = require("os").cpus().length;

-Ustedes saben que hace esta linea, basicamente trae el modulo 鈥榦s鈥 de Node y nos ayudara mediante el metodo 鈥榗pus()鈥 de ver todos los cores que tiene nuestro CPU y 鈥榣ength鈥 nos devolvera cuantos cores existen, esto nos devuelve el numero porque el metodo cpus() es un array de objetos, bien. Ya tenemos el numero de cores.

La siguiente linea de codigo es esta:

if (cluster.isMaster) {
  console.log(`Master ${process.pid} is running`);

Esta linea no es compleja, basicamente lo que dice es: Con una sentencia if preguntamos si el cluster que posee un metodo bool isMaster, si el cluster es el maestro o si es el principal, es decir que no tiene mas clusters instanciados aparte del principal, entonces como no tenemos otras instancias de clusters entrara y lanzara ese mensaje en consola con el numero del proceso que esta corriendo.

Bien, la siguiente linea es esta:

for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

Basicamente lo que hara es, que instanciara o creara tantos hijos como cores tenga, creara un hijo para cada Core del procesador que previamente comprobamos cuantos habian.
Simplemente el metodo fork() hara la instancia, es como en GitHub hacemos Fork a un repositorio, tomamos del repositorio padre una copia, en este caso hacen lo mismo, del cluster padre derivamos los hijos.

En el siguiente codigo dice:

cluster.on("exit", (worker, code, signal) => {
    console.log(`worker ${worker.process.pid} died`);
  });

En este seccion del codigo, abrimos un evento con 鈥.on鈥 y nos asesoramos de cuanto el cluster muera con 鈥榚xit鈥, el siguiente parametro es una funcion y recibe:
worker: Este es el cluster o la instancia del proceso.
code: Este nos dara el codigo de error si logra pasar algo.
signal: Este nos mostrara quien mato a nuestro cluster o instancia del proceso.
Y vemos en la consola como simplemente imprimimos en caso de que muera o matemos nuestro proceso, un mensaje accediendo al codigo del proceso o pid.

Ahora bien, si se da el caso de que el cluster no se el maestro o el principal hilo, este instanciara nuestro servidor en el puerto 8000 (Bueno, ya esto ustedes lo sabian xd), con el siguiente codigo:

} else {
  http
    .createServer((req, res) => {
      res.writeHead(200);
      res.end("hello world\n");
    })
    .listen(8000);

Por ultimo, imprimimos en consola los workers que hemos instanciados anteriormente, accediendo a su codigo de proceso o pid con el siguiente codigo:

 console.log(`Worker ${process.pid} started`);
}

En resumen, un cluster ayudara al hilo principal a manejar la carga o procesos utilizando los Cores del CPU.
Piensen en esto, el Hilo principal es la empresa y los hilos hijos (procesos hijos) son los empleados. (Espero que me entiendan).

Espero que les haya ayudado mi explicacion, si me he equivocado en algo por favor aclararlo con un comentario para el estudiante que lo lea pueda tenerlo en cuenta.
Recuerden #NuncaPararDeAprender

Aqu铆 pueden ver este mismo ejemplo pero explicado mucho mejor y con m谩s contexto

el metodo cluster.fork(), lo que hace, segun la documentacion de node, aparece un nuevo proceso de la app, es como si hubieras ejecutado " node server.js " pero este codigo ya no se ejecuta como master, si no como proceso hijo

El man a copiado y pegado el c贸digo de la documentaci贸n de node xD y ya.

Alguien m谩s ha sentido que este ha sido el curso m谩s pobre de todos los cursos que hay en Escuela de JS

Muy poca informaci贸n en esta clase, de cualquier forma podemos ir a la segura en la documentaci贸n oficial (Node/Cluster)[https://nodejs.org/api/cluster.html]

Muchachos, para los que se sienten un poco perdidos, les dejo otros cursos de backend con node que son muy buenos. Pueden hacer este https://platzi.com/clases/fundamentos-node/ primero . Pienso que con este se sacaran todas las dudas que tienen hasta el momento. Y luego pueden tomar este https://platzi.com/clases/backend-js/ . Ademas les dejo otro que es mucho mas avanzado https://platzi.com/clases/practico-node/ . No se frustren, para todo hay solucion! Cualquier duda escribanme

Esto se divide los procesos a ejecutar entre los distintos nucleos disponibles autom谩ticamente? o nosotros tenemos que decirle que hacer en cada uno?

Muy interesante, pero falta mas info, por ejemplo, en que casos usarlo y cuando no, seria bueno un ejemplo de cada uno

Se entiende empero es muy vaga su explicaci贸n.

馃挜馃挩 Documentaci贸n de node https://nodejs.org/api/cluster.html

馃挩 Ac谩 dejo algo de informaci贸n adicional: https://nodejspedia.com/es/tutorial/2817/modulo-de-cluster

Seg煤n la l贸gica del c贸digo, puedo entender que si no hay un cluster maestro se crea el servidor HTTP. pero en que momento se repite el c贸digo. Ya que un if-else es uno u otro pero no ambos.

No fue sino hasta cuando abr铆 varios tabs apuntando al servidor que entend铆 este tema. Est谩 genial, aunque siento que hace falta un ejercicio m谩s pr谩ctico que le permita a uno ver exactamente c贸mo podemos controlar cada hilo.

no me quedo claro que es un cluster鈥 馃槮

nope, nada, aun perdido, este man no explica bien, he hecho toda la escuela de javascript y todo iba de maravilla hasta que llegue aqui, ando viendo los videos tipo netflix, porque copiar lo que hace el profesor no es aprender鈥eguire viendo a ver donde llega este curso.

Manejo aun Windows.

no se si esto sirva de ayuda pero al ejecutar el c贸digo se daran cuenta que se generan varios procesos que estan vinculados al principal (master).

var numCPUs = require('os').cpus().length;
const {Transform} = require('stream'); 

if (cluster.isMaster) {
  // Fork workers.
  console.log(`Master process ${process.pid} PID`);
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
 
  cluster.on('death', function(worker) {
    console.log('worker ' + worker.pid + ' died');
  });
} else {
    const upTransform = new Transform({
        transform(chunk,encoding,callback){
            const text = chunk.toString().toUpperCase();
            this.push(text + `from ${process.pid} PID\n`)
            callback();
        }
    })
    console.log(`Process ${process.pid} pid started`)
    process.stdin.pipe(upTransform).pipe(process.stdout);
}
Master process 1142 PID
Process 1149 pid started
Process 1150 pid started
Process 1156 pid started
Process 1157 pid started
carlos
CARLOS
from 1157 PID
federico
FEDERICO
from 1149 PID

Fernando yo hice primero el de node fundamentals y no me gust贸 para nada, este chavo explica mucho mejor y tiene ordenados sus archivos. Yo no lo recomiendo

Ser铆a bueno saber en qu茅 situaciones es recomendable usar el cluster, porque por lo que vi en el Curso de Esenciales de Node que dict贸 Emir Salazar no necesariamente mejora el rendimiento sino que pueden ocasionar todo lo contrario.

No entendi nada, jaja, estaria bueno hacer un video explicativo bien detallado del tema, porque parece muy interesante, saludos!.

Literalmente copio y pego la documentacion de NodeJS sin explicar nada, el peor curso que he tomado de platzi. Proceso a dar una corta explicacion.

El objetivo de usar cluster se hace con el fin de usar todos los hilos de cada procesador para agilizar los procesos o solicitudes que se realizan en el, como ya se ha dicho desde el principio NodeJS corre en un solo hilo esto significa que si un computador tiene octa-core NodeJS esta usando solamente UNO de esos 8 para realizar todas las solicitudes y por mas que sea asincrono en algun momento no va a ser suficiente. Es ahi donde entran los cluster cada cluster.fork() cada proceso hijo tiene su propio motor V8 y su propio uso de memoria esto que significa.

por esta razon este codigo se ejecuta una segunda vez ya que como se indica cada fork() tiene su propio uso de memoria y su propio motor V8, es importante tener en cuenta que el objetivo de esto es que el hilo principal MASTER sea quien maneje los demas hilos, en otras palabras los procesos hijos(cluster.fork) son los encargados del trabajo sucio.

La verdad es que creo que este curso tendrian que renovarlo, las explicaciones son muy vagas y los ejemplos los hace de corrida sin explicar bien algunos detalles鈥 Yo sabia cosas de Node de antes y de express, y a mi me ha costado entender algunas de las cosas que explicaba, no me imagin贸 alguien que este empezando.

isMaster esta deprecado y sustituido por isPrimary

Yo dir铆a que el clustering en NodeJS es una alternativa interesante para garantizar la atenci贸n de peticiones concurrentes y sacar el m谩ximo provecho al hardware (cantidad de n煤cleos) del servidor. Otra alternativa que he usado ser铆a ejecutar las aplicaciones con PM2 o alg煤n otro process manager, que tambi茅n cuentan con opciones de clusterizaci贸n o forking de procesos.

Que interesante esto, para aprovechar los cpus de nuestro servidor.

驴 Entonces, el uso de clusters nos permitir谩 que los archivos que requeramos ejecutar en nuestro servidor en NodeJs cargu茅 en m煤ltiples procesos ?

En la pr谩ctica lo que nos permite es mejorar el rendimiento, 驴No?

hasta ahora esta bien explicado!!

Tengo Windows, entonces seguir茅 con Express.

Esta seria la opci贸n multi-proceso de Node. Cada vez que se hace cluster.fork() se esta creando un nuevo proceso de V8.

excelente seguimos aprendiendo

Gracias!