Мы читаем XML файл (используя xml-stream
) с примерно 500k элементами и вставляем их в MongoDB следующим образом:
xml.on(`endElement: product`, writeDataToDb.bind(this, "product"));
Вставить в writeDataToDb(type, obj)
выглядит следующим образом:
collection.insertOne(obj, {w: 1, wtimeout: 15000}).catch((e) => { });
Теперь, когда соединение Mongo отключилось, поток xml все еще читает, и консоль заливается сообщениями об ошибках (невозможно вставить, отключить, отключить EPIPE,...).
В docs говорится:
Когда вы завершаете процесс mongod, драйвер останавливает операции обработки и сохраняет их буферизацию из-за того, что bufferMaxEntries равен -1 по умолчанию, что означает буферизацию всех операций.
Что делает этот буфер действительно?
Мы замечаем, когда мы вставляем данные и закрываем сервер mongo, вещи буферизуются, затем мы возвращаем сервер mongo, собственный драйвер успешно восстанавливается и node возобновляет вставку данных, но буферизованные документы (во время mongo beeing offline ) не вставлены снова.
Поэтому я задаю этот буфер и его использование.
Цель:
Мы ищем лучший способ сохранить вставки в буфер до тех пор, пока mongo не вернется (в 15000 миллисекунд в соответствии с wtimeout
), а затем вставьте буферизованные документы или используйте xml.pause();
и xml.resume()
, которые мы пробовали без успех.
В основном нам нужна небольшая помощь в том, как обрабатывать разъединения без потери данных или прерываний.