Używasz MongoDB do przechowywania identyfikatora. To stan. Generowanie identyfikatora to funkcja. Mongodb służy do generowania identyfikatora, gdy proces mongodb pobiera argumenty funkcji i zwraca wygenerowany identyfikator. Nie chodzi o to, co robisz. Używasz nodejs do generowania identyfikatora.
Liczba wątków, a raczej pętli zdarzeń jest krytyczna, ponieważ definiuje architekturę, ale w żadnym wypadku nie potrzebujesz transakcji. Transakcje w mongodb nazywane są „transakcjami wielodokumentowymi” właśnie po to, by podkreślić, że są one przeznaczone do spójnej aktualizacji kilku dokumentów jednocześnie. Pierwszy akapit https://docs.mongodb.com/manual/core/transactions / ostrzega, że jeśli zaktualizujesz pojedynczy dokument, nie będzie miejsca na transakcje.
Aplikacja jednowątkowa nie wymaga synchronizacji. Możesz niezawodnie odczytać najnowszy wygenerowany identyfikator na początku i zagwarantować, że identyfikator jest unikalny w ramach procesu nodejs. Jeśli wykluczysz mongodb i inne I/O z funkcji generowania, sprawisz, że będą one synchroniczne, dzięki czemu będziesz mógł zachować stan identyfikatora w procesie nodejs i zagwarantować jego unikalność. Po wygenerowaniu możesz trwać w bazie danych asynchronicznie. W najgorszym przypadku możesz mieć lukę w numerach sekwencyjnych, ale nie ma duplikatów.
Jeśli istnieje najmniejsza szansa, że będziesz musiał przeskalować do więcej niż 1 procesu nodejs, aby obsłużyć więcej jednoczesnych żądań lub dodać kolejnego hosta dla nadmiarowości w przyszłości, będziesz musiał zsynchronizować generowanie identyfikatora i możesz użyć unikalnych indeksów Mongodb dla że. Sama funkcja nie zmienia się zbytnio, nadal generujesz identyfikator, jak w architekturze jednowątkowej, ale dodajesz dodatkowy krok, aby zapisać identyfikator w mongo. Dokument powinien mieć unikalny indeks w polu ID, więc w przypadku jednoczesnych aktualizacji jedno z zapytań pomyślnie doda dokument, a drugie zakończy się niepowodzeniem z "Błądem duplikatu klucza E11000". Łapiesz takie błędy po stronie nodejs i powtarzasz funkcję ponownie, wybierając kolejną liczbę: