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

Umgang mit Rennbedingungen und Hunger beim Generieren eindeutiger IDs mit MongoDB + NodeJS

Sie verwenden MongoDB, um die ID zu speichern. Es ist ein Staat. Die Generierung der ID ist eine Funktion. Sie verwenden Mongodb, um die ID zu generieren, wenn der Mongodb-Prozess Argumente der Funktion entgegennimmt und die generierte ID zurückgibt. Es ist nicht das, was du tust. Sie verwenden nodejs, um die ID zu generieren.

Die Anzahl der Threads bzw. Ereignisschleifen ist entscheidend, da sie die Architektur definieren, aber in beiden Fällen benötigen Sie keine Transaktionen. Transaktionen in mongodb werden „Multi-Dokument-Transaktionen“ genannt, genau um hervorzuheben, dass sie für die konsistente Aktualisierung mehrerer Dokumente auf einmal gedacht sind. Der allererste Absatz von https://docs.mongodb.com/manual/core/transactions / warnt Sie, dass beim Aktualisieren eines einzelnen Dokuments kein Platz für Transaktionen vorhanden ist.

Eine Single-Thread-Anwendung erfordert keine Synchronisierung. Sie können die zuletzt generierte ID beim Start zuverlässig lesen und garantieren, dass die ID innerhalb des nodejs-Prozesses eindeutig ist. Wenn Sie mongodb und andere E/A von der Generierungsfunktion ausschließen, machen Sie sie synchron, sodass Sie den Status der ID innerhalb des nodejs-Prozesses beibehalten und ihre Eindeutigkeit garantieren können. Nach der Generierung können Sie asynchron in der Datenbank bleiben. Im schlimmsten Fall haben Sie möglicherweise eine Lücke in den fortlaufenden Nummern, aber keine Duplikate.

Wenn die geringste Chance besteht, dass Sie möglicherweise auf mehr als 1 nodejs-Prozess skalieren müssen, um mehr gleichzeitige Anforderungen zu verarbeiten, oder in Zukunft einen weiteren Host für Redundanz hinzufügen müssen, müssen Sie die Generierung der ID synchronisieren, und Sie können dafür eindeutige Mongodb-Indizes verwenden das. Die Funktion selbst ändert sich nicht viel, Sie generieren die ID immer noch wie in einer Singlethread-Architektur, fügen aber einen zusätzlichen Schritt hinzu, um die ID in Mongo zu speichern. Das Dokument sollte einen eindeutigen Index im ID-Feld haben, sodass bei gleichzeitigen Aktualisierungen eine der Abfragen das Dokument erfolgreich hinzufügt und eine andere mit „E11000 Fehler bei doppeltem Schlüssel“ fehlschlägt. Sie fangen solche Fehler auf nodejs-Seite ab und wiederholen die Funktion erneut, indem Sie die nächste Zahl auswählen: