MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come evitare processi a più nodi che fanno cose ripetitive?

Un modo per farlo è assegnare un ID numerico univoco a ciascuno dei tuoi documenti MongoDB e assegnare un identificatore numerico univoco a ciascuno dei tuoi nodi di lavoro node.js.

Ad esempio, avere una env var chiamata NUM_WORKERS e quindi nel modulo node.js:

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

È quindi necessario assegnare un ID numero di istanza univoco e contiguo (nell'intervallo da 0 a NumWorkers-1) a ciascuno dei propri worker (ad es. tramite un parametro della riga di comando letto dal processo node.js durante l'inizializzazione). Puoi memorizzarlo in una variabile chiamata MyWorkerInstanceNum.

Quando scegli un documento da MongoDB, chiama la seguente funzione (passando il documentId univoco del documento come parametro):

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

Continua a elaborare effettivamente il documento solo se isMine() restituisce true. Quindi, più lavoratori possono "scegliere" un documento, ma solo un lavoratore lo elaborerà effettivamente.