Robimy odczytać plik XML (przy użyciu xml-stream
) z około 500k elementów i wkładać je do MongoDB tak:Jak buforować wstawki MongoDB podczas rozłączania w pliku node.js?
xml.on(`endElement: product`, writeDataToDb.bind(this, "product"));
Insert w writeDataToDb(type, obj)
wygląda następująco:
collection.insertOne(obj, {w: 1, wtimeout: 15000}).catch((e) => { });
Teraz gdy Mongo połączenie zostanie rozłączone, strumień xml będzie nadal czytany, a konsola zostanie zalana komunikatami o błędach (nie można wstawić, rozłączyć, uszkodzić EPIPE ...).
W docs mówi:
Podczas zamykania procesu mongod, kierowca zatrzymuje operacje przetwarzania i utrzymuje je buforowanie powodu bufferMaxEntries będących -1 domyślnie oznaczającego bufor wszystkie operacje.
Co właściwie robi ten bufor?
Zauważamy kiedy wstawiamy dane i zamykamy serwer mongo, rzeczy się buforują, to przywracamy serwer mongo, macierzysty sterownik z powodzeniem ponownie łączy się i węzeł wznawia wstawianie danych, ale buforowane dokumenty (podczas mongo w trybie offline) nie wstawiaj ponownie.
Więc kwestionuję ten bufor i jego użycie.
Cel:
Szukamy najlepszego sposobu, aby utrzymać wkładki w buforze aż Mongo wraca (w 15000milliseconds według wtimeout
) i niech następnie włóż buforowane dokumentów lub wykorzystanie xml.pause();
i xml.resume()
który próbowaliśmy bez powodzenia.
Zasadniczo potrzebujemy niewielkiej pomocy w zakresie obsługi rozłączeń bez utraty danych lub przerwania.
nie może replikować to zarówno przykład w docs i testów z użyciem 'xml-stream' włóż buforowane obiekty kiedyś mon Serwer go wraca. Może napiszesz więcej kodu/podasz więcej informacji o swojej konfiguracji? – cviejo
@cviejo Nie mogę udostępnić moich skryptów, ponieważ są związane z firmą, ale czy mógłbyś przesłać mi skrypt, który próbowałeś powielić? Gist/pastebin byłoby w porządku. – DanFromGermany