Подтвердить что ты не робот

Fs.writeFileSync дает ошибку: UNKNOWN, правильный способ записи синхронного файла в nodejs

У меня есть серверное приложение NodeJS. У меня есть эта строка кода для моего ведения журнала:

fs.writeFileSync(__dirname + "/../../logs/download.html.xml", doc.toString());

Иногда он работает правильно, но при большой нагрузке он дает это исключение:

Error: UNKNOWN, unknown error 'download.html.xml'

PS: Я нашел ссылку здесь: http://www.daveeddy.com/2013/03/26/synchronous-file-io-in-nodejs/ Blogger описывает, что writeFileSync на самом деле не заканчивает запись при возврате. Есть ли правильный способ сделать это синхронно, т.е. Без обратных вызовов?

4b9b3361

Ответ 1

Для OP, казалось, был оценен комментарий, я положил его в ответ в надежде, что он поможет другим пользователям.

Мне кажется, что проблема связана с тем, что многие дескрипторы используются, вызывая writeFileSync. Ссылка, помещенная в вопросе, также подтверждает эту идею.

На самом деле, я все еще пытаюсь выяснить, существует ли способ узнать, когда запись действительно завершена под капотом, а не только с точки зрения nodejs. Может быть, этот параметр может помочь, но я предполагаю, что он страдает от одной и той же проблемы.

Во всяком случае, можно обойти эту проблему, внедряя пул писателей с очередью, на которую следует отправлять свои запросы на запись.

Про является то, что количество открытых дескрипторов может находиться под контролем. Действительно, из-за проблемы, упомянутой в ссылке, размещенной OP, но, конечно, можно избежать использования всех ресурсов системы.

С другой стороны, к сожалению, существует проблема, заключающаяся в том, что это решение имеет тенденцию занимать гораздо больший объем памяти (поскольку на самом деле там стоят его документы, пока они ждут доступного рабочего).

Конечно, это может быть подходящее решение для пакетных запросов, разделенных во времени, но, возможно, оно не подходит с постоянными постоянными нагрузками во времени.

Ответ 2

Когда вы выполните writeFileSync, вы получите файловый дескриптор файла. ОС ограничивает количество дескрипторов файлов, которые могут быть открыты в данный момент времени. Таким образом, при интенсивном использовании вы действительно можете достичь предела. Один из способов узнать это - это использовать ulimit и установить его неограниченно.

Другая возможность - ошибки ввода-вывода. Например, закрытие дескриптора файла завершится неудачно, если произойдет ошибка ввода-вывода.