sql >> Database >  >> NoSQL >> MongoDB

Omgaan met race-omstandigheden en honger bij het genereren van unieke ID's met MongoDB + NodeJS

U gebruikt MongoDB om de ID op te slaan. Het is een staat. Het genereren van de ID is een functie. U gebruikt Mongodb om de ID te genereren wanneer het mongodb-proces argumenten van de functie opneemt en de gegenereerde ID retourneert. Het is niet wat je doet. U gebruikt nodejs om de ID te genereren.

Het aantal threads, of liever event-loops, is van cruciaal belang omdat het de architectuur definieert, maar in beide gevallen heb je geen transacties nodig. Transacties in mongodb worden "transacties met meerdere documenten" genoemd, precies om te benadrukken dat ze bedoeld zijn voor een consistente update van meerdere documenten tegelijk. De allereerste alinea van https://docs.mongodb.com/manual/core/transactions / waarschuwt u dat als u een enkel document bijwerkt, er geen ruimte is voor transacties.

Een single-threaded applicatie vereist geen synchronisatie. U kunt bij het opstarten betrouwbaar de laatst gegenereerde ID lezen en garanderen dat de ID uniek is binnen het nodejs-proces. Als u mongodb en andere I/O uitsluit van de generatiefunctie, maakt u deze synchroon, zodat u de status van de ID binnen het nodejs-proces kunt behouden en de uniciteit ervan kunt garanderen. Eenmaal gegenereerd, kunt u asynchroon in de db blijven. In het ergste geval heb je misschien een gat in de volgnummers, maar geen dubbele.

Als er een kleine kans is dat u moet opschalen naar meer dan 1 nodejs-proces om meer gelijktijdige verzoeken af ​​te handelen of in de toekomst een andere host voor redundantie toe te voegen, moet u het genereren van de ID synchroniseren en kunt u Mongodb-unieke indexen gebruiken voor Dat. De functie zelf verandert niet veel, je genereert nog steeds de ID zoals in een architectuur met één thread, maar voegt een extra stap toe om de ID op te slaan in mongo. Het document moet een unieke index hebben in het ID-veld, dus in het geval van gelijktijdige updates zal een van de query's het document met succes toevoegen en een andere mislukt met "E11000 dubbele sleutelfout". U vangt dergelijke fouten op aan de kant van de nodejs en herhaalt de functie opnieuw en kiest het volgende nummer:



  1. Mijn $push-methode in Mongoose werkt niet goed

  2. MongoDB $isoWeekYear

  3. MongoDB-queryresultaten exporteren naar een CSV-bestand

  4. SQL versus NoSQL voor een voorraadbeheersysteem