Balanceo de carga de base de datos

Conozca el comportamiento de Spurtcommerce durante los momentos de mayor tráfico

El equipo ha probado a fondo la aplicación para comprobar cómo maneja de manera competente un gran volumen de tráfico y solicitudes

Escalar una aplicación Node puede ser complicado. No es tarea fácil. Se requiere experiencia tanto en el conocimiento profundo de Node como en la gestión eficiente de los recursos. Para escalar la aplicación, podemos usar escalado vertical, escalado horizontal o ambos. Además, hay otros factores que deben considerarse para un mejor rendimiento de Node, como el modo "Cluster" o los "Worker Threads". Aquí nos enfocaremos en el modo "Cluster", ya que es el que se ha implementado en Spurtcommerce.

El modo Clúster se usa para iniciar múltiples copias de Node que ejecutan el mismo servidor. Dado que el bucle de eventos de Node.js es de un solo hilo, no podemos hacerlo multihilo directamente. Pero al iniciar múltiples copias, obtenemos varias instancias del bucle de eventos, lo cual actúa como si fuera multihilo.

Cuando escribimos código en Node.js que tarda en ejecutarse, el servidor bloquea cualquier otra solicitud entrante hasta que finalice esa petición, lo que provoca cuellos de botella si hay muchas solicitudes en cola.

Aquí es donde entra en juego el clúster

El clustering en Node.js nos permite crear procesos separados que comparten el mismo puerto del servidor. Aprovecha todos los núcleos del procesador, ejecutando la aplicación en cada uno de ellos. Si un servidor falla, otro toma su lugar. Incluso en condiciones de tráfico pesado, Node asigna automáticamente los recursos del trabajador y gestiona el balanceo de carga interno. Se crea un proceso principal llamado "Cluster Manager".

Rol del Cluster Manager:

  • Se encarga de monitorear y rastrear el estado de cada instancia de la aplicación ejecutándose simultáneamente.
  • Puede iniciar y detener instancias, enviar datos y realizar tareas administrativas relacionadas con la gestión de recursos.

Servidor Node de un solo hilo

Servidor Node multihilo (usando Clustering):

Después de app.js, el cluster manager es la primera instancia de Node. Es responsable de procesar solicitudes entrantes y crear instancias de trabajadores. El cluster manager requiere el módulo "Cluster" de la biblioteca estándar. Al usar la función "fork", Node vuelve a ejecutar app.js como una nueva instancia worker.

const cluster = require('cluster’); // cluster is a standard library module.
console.log(cluster.isMaster);  //It return false for the first time.

El cluster manager tiene una propiedad llamada Master, que se establece en true. Cuando se ejecuta "fork", app.js se ejecuta nuevamente, pero ahora como worker (no master). Podemos crear múltiples copias de la aplicación con cluster.fork(), dependiendo de la cantidad de núcleos disponibles.

const cluster = require('cluster');
          if (cluster.isMaster) {
              cluster.fork();
              cluster.fork();
              cluster.fork();//You can create multiple instances according to the                           // cores available on your system.
          } else {
              const express = require('express');
              const app = express();
              app.get('/', (req, res)=>{
                  res.send('Hello');
              });
              app.listen(3000);
          }  

Si tenemos rutas que requieren mucho procesamiento y otras que son más ligeras, podemos usar clústeres para iniciar múltiples instancias del servidor. Una manejará las rutas pesadas y otra las ligeras.

Así es como en Spurtcommerce, nuestra solución de comercio electrónico, hemos usado clustering en Node para mejorar el rendimiento de la aplicación.