MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como evitar que vários processos de nó façam coisas repetitivas?


Uma maneira de fazer isso é atribuir um ID numérico exclusivo a cada um de seus documentos do MongoDB e atribuir um identificador numérico exclusivo a cada um de seus workers do node.js.

Por exemplo, tenha um env var chamado NUM_WORKERS e, em seguida, em seu módulo node.js:
var NumWorkers = process.env.NUM_WORKERS || 1;

Em seguida, você precisa atribuir um ID de número de instância exclusivo e contíguo (no intervalo de 0 a NumWorkers-1) a cada um de seus trabalhadores (por exemplo, por meio de um parâmetro de linha de comando lido pelo processo node.js quando ele é inicializado). Você pode armazenar isso em uma variável chamada MyWorkerInstanceNum.

Ao escolher um documento do MongoDB, chame a seguinte função (passando o documentId exclusivo do 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);
}

Apenas continue a processar o documento se isMine() retornar true. Assim, vários trabalhadores podem "escolher" um documento, mas apenas um trabalhador realmente o processará.