javascript - ejemplos - ¿Cómo mantener las variables que comparten todos los procesos de nodo en el clúster de nodo?
acceder al dom javascript (6)
Creo que toda la idea de clúster es tener instancias que puedan ejecutarse de forma independiente en diferentes CPU. Compartir la memoria (una variable global) a la que ambos pueden acceder y cambiar introduce una mayor complejidad (bloqueos, etc.) y hace que estas instancias dependan unas de otras.
Una base de datos externa sería una buena solución para esto, ya que se ocupa de todos los problemas de acceso a los datos, pero lo más probable es que disminuya el rendimiento.
La mensajería es una mejor idea. Puede mantener instancias locales de una var en sus grupos. Cuando un clúster actualiza el valor, envíe un mensaje al resto de ellos y actualice el valor. Esto es genial porque es asíncrono y no bloqueado, pero nuevamente su actualización de valor no se reflejará de inmediato.
¿Qué tal esto? Almacene vars en una base de datos y cada vez que haya un cambio de valor notifique a las instancias. Pueden almacenar los nuevos valores en vars locales y hacer llamadas a la base de datos solo cuando sea necesario
Parece que todos los procesos de nodo woker están funcionando como si estuvieran ejecutando una nueva copia de la misma aplicación. Pero quisiera mantener algunas variables que son compartidas por todos los trabajadores de nodo (procesos secundarios) en el clúster de nodos. ¿Hay una manera simple de hacer esto?
Nadie ha mencionado esto todavía, pero este es un caso perfecto para Node Worker Threads que acaba de salir del modo experimental en la última versión de Node v11.11.0.
Puede intentar comunicarse entre el proceso maestro y los procesos hijos. Por ejemplo:
script test.master.js:
var cluster = require(''cluster'');
var childScript = __dirname + ''/test.child.js'';
cluster.setupMaster({ exec: childScript });
proc = cluster.fork();
proc.on(''message'', function(message) {
console.log(''message from child: '', message);
proc.send(''Hello from master!'');
});
script test.child.js:
console.log(''Child initializing..'');
process.on(''message'', function(message) {
console.log(''message from master: '', message);
});
process.send(''Hello from Child!'');
Si está buscando compartir cosas en modo de solo lectura, revise mmap-object . Lo uso para grandes tablas de búsqueda en memoria.
Comprobando ahora mismo en un servidor, un archivo 346M está ocupando un total de 156M de memoria (mmap solo páginas en lo que se accede) y mmap-object compartiéndolo entre 44 procesos para una sobrecarga por proceso de 3.5M.
Debido a que es de solo lectura, no tengo que preocuparme por el bloqueo entre procesos y el desorden que puede traer.
Todos los procesos de trabajo son copias nuevas de su solicitud. Cada trabajador es un proceso completo creado con child_process.spawn. Así que no, no comparten variables. Y probablemente sea mejor así. Si desea compartir información entre procesos de trabajo (normalmente sesiones), debe considerar el almacenamiento de esta información en una base de datos.
Si está listo para ir al nodo todo el tiempo, podría usar algo como dnode para que sus trabajadores le pidan datos al proceso maestro.
Usé el servidor externo memcached o redis para ello.