Node.js / Express y colas paralelas.

Estamos construyendo una infraestructura que cuenta con un servidor Node.js y Express.

En el servidor, lo que está sucediendo es como sigue:

  1. El servidor acepta una solicitud HTTP entrante del cliente.
  2. El servidor genera dos archivos (esta operación puede ser “relativamente larga”, es decir, también aproximadamente 0,1 segundos)
  3. El servidor carga los archivos generados (~ 20-200 KB cada uno) a un CDN externo
  4. El servidor responde al cliente, y esto incluye el URI del archivo en el CDN

Actualmente, el servidor está haciendo esto de forma secuencial para cada solicitud, y esto funciona bastante bien (Node / Express puede manejar solicitudes concurrentes automáticamente). Sin embargo, a medida que planeamos crecer, la cantidad de solicitudes concurrentes puede boost, y creemos que sería mejor para nosotros implementar una cola para procesar las solicitudes. De lo contrario, podemos arriesgarnos a tener demasiadas tareas ejecutándose al mismo tiempo y demasiadas conexiones abiertas a la CDN. Responder al cliente rápidamente no es algo relevante.

En lo que estaba pensando es tener una parte separada en el servidor Node que contenga algunos “trabajadores” (2-3, pero haremos pruebas para determinar el número correcto de operaciones simultáneas). Entonces, el nuevo flujo se vería algo así como:

  1. Después de aceptar la solicitud del cliente, el servidor agrega una operación a una cola.
  2. Hay 2-3 (a ser probados) trabajadores que toman elementos de la cola y realizan todas las operaciones (generan los archivos y los cargan en el CDN).
  3. Cuando el trabajador ha procesado la operación (no importa si permanece en la cola durante un tiempo relativamente largo), notifica al servidor Node (una callback) y el servidor responde al cliente (que ha estado esperando mientras tanto). ).

Que piensas de esta aproximación? ¿Crees que es la correcta?

Principalmente importante, ¿CÓMO se podría implementar esto en Node / Express?

Gracias por tu tiempo

tldr; Puede usar el módulo de clúster Node.js nativo para manejar muchas solicitudes simultáneas.

Algunos preámbulos: Node.js per se es un solo hilo. Su Event Loop es lo que lo hace excelente para manejar múltiples solicitudes simultáneamente, incluso en su modelo de subproceso único, que es una de sus mejores características de IMO.

El trato real: Entonces, ¿cómo podemos escalar esto para manejar incluso más conexiones concurrentes y usar todas las CPU disponibles? Con el módulo cluster .

Este módulo funcionará exactamente como lo indica @Qualcuno, lo que le permitirá crear múltiples trabajadores (también conocido como proceso) detrás del maestro para compartir la carga y utilizar más eficientemente las CPU disponibles.

De acuerdo con la documentación oficial de Node.js:

Debido a que los trabajadores son procesos separados, se pueden matar o reabastecer según las necesidades de su progtwig, sin afectar a otros trabajadores. Mientras haya algunos trabajadores aún con vida, el servidor continuará aceptando conexiones.

El ejemplo requerido:

var cluster = require('cluster'); var http = require('http'); var numCPUs = require('os').cpus().length; if (cluster.isMaster) { // Fork workers. for (var i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', function(worker, code, signal) { console.log('worker ' + worker.process.pid + ' died'); }); } else { // Workers can share any TCP connection // In this case its a HTTP server http.createServer(function(req, res) { res.writeHead(200); res.end("hello world\n"); }).listen(8000); } 

Espero que esto sea lo que necesitas.

Comenta si tienes más preguntas.

(Respondiendo a mi propia pregunta)

De acuerdo con esta pregunta sobre Stack Overflow, una solución en mi caso sería implementar una cola utilizando el módulo asíncrono de Caolan McMahon .

La aplicación principal creará trabajos y los colocará en una cola, que tiene un límite en el número de trabajos simultáneos que se pueden ejecutar. Esto permite procesar tareas simultáneamente pero con un estricto control sobre el límite. Funciona como el NSOperationQueue de Cocoa en Mac OSX.

Para hacer esto, usaría una estructura como la que Heroku proporciona con Web / Worker Dynos (servidores). Los servidores web pueden aceptar las solicitudes y pasar la información a los trabajadores, quienes pueden hacer el procesamiento y la carga de la información. Me gustaría que el sitio de front-end escuchara en un socket (socket.io) la url del CDN externo que se disparará desde el trabajador cuando finalice la carga. Esperemos que tenga sentido.

Puede usar el módulo Kue con Redis (base de datos para retener los trabajos) Respaldando la cola. crea puestos de trabajo y los coloca en un módulo kue usando y puede poner cuántos trabajadores han trabajado en ellos. Enlaces útiles: kue – https://github.com/Automattic/kue

    Intereting Posts