sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo evitar que los procesos de múltiples nodos hagan cosas repetitivas?

Una forma de hacerlo es asignar un ID numérico único a cada uno de sus documentos MongoDB y asignar un identificador numérico único a cada uno de sus trabajadores de node.js.

Por ejemplo, tenga un env var llamado NUM_WORKERS, y luego en su módulo node.js:

var NumWorkers = process.env.NUM_WORKERS || 1;

Luego, debe asignar una identificación de número de instancia única y contigua (en el rango de 0 a NumWorkers-1) a cada uno de sus trabajadores (por ejemplo, a través de un parámetro de línea de comando leído por su proceso node.js cuando se inicializa). Puede almacenar eso en una variable llamada MyWorkerInstanceNum.

Cuando elija un documento de MongoDB, llame a la siguiente función (pasando el ID de documento único del documento como parámetro):

function isMine(documentId){
    //
    // Example: documentId=10
    //          NumWorkers= 4
    // (10 % 4) = 2
    // If MyWorkerInstanceNum is 2, return true, else return false.
    return ((documentId % NumWorkers) === MyWorkerInstanceNum);
}

Solo continúe procesando el documento si isMine() devuelve verdadero. Por lo tanto, varios trabajadores pueden "elegir" un documento, pero solo un trabajador lo procesará.