MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie kann man vermeiden, dass mehrere Knotenprozesse sich wiederholende Dinge tun?

Eine Möglichkeit besteht darin, jedem Ihrer MongoDB-Dokumente eine eindeutige numerische ID zuzuweisen und jedem Ihrer node.js-Worker eine eindeutige numerische ID zuzuweisen.

Haben Sie beispielsweise eine env-Variable namens NUM_WORKERS und dann in Ihrem node.js-Modul:

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

Anschließend müssen Sie jedem Ihrer Worker eine eindeutige, fortlaufende Instanznummer-ID (im Bereich von 0 bis NumWorkers-1) zuweisen (z. B. über einen Befehlszeilenparameter, der von Ihrem node.js-Prozess bei der Initialisierung gelesen wird). Sie können das in einer Variablen namens MyWorkerInstanceNum speichern.

Wenn Sie ein Dokument aus MongoDB auswählen, rufen Sie die folgende Funktion auf (übergeben Sie die eindeutige documentId des Dokuments als Parameter):

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

Fahren Sie mit der tatsächlichen Verarbeitung des Dokuments nur fort, wenn isMine() true zurückgibt. Mehrere Worker können also ein Dokument „aussuchen“, aber nur ein Worker wird es tatsächlich verarbeiten.