Я новичок в разработке в node.js(хотя и относительно опытный на клиентском javascript), и у меня много вопросов о хороших практиках при работе с асинхронными операциями в node.js.
Моя конкретная проблема (хотя я думаю, что это довольно общая тема) заключается в том, что у меня есть приложение node.js(работает на малине Pi), которое записывает показания от нескольких датчиков температуры каждые 10 секунд до в структуре данных памяти. Это прекрасно работает. Данные накапливаются с течением времени в памяти и, поскольку они накапливаются и достигают определенного порога размера, данные регулярно стареют (сохраняя только последние N дней данных), чтобы он не превышал определенный размер. Эти данные температуры используются для управления некоторыми другими устройствами.
Затем у меня есть отдельный таймер с интервалом, который так часто записывает эти данные на диск (чтобы сохранить его, если процесс выходит из строя). Я использую async node.js(fs.open()
, fs.write()
и fs.close()
) disk IO для записи данных на диск.
И, из-за асинхронного характера дискового ввода-вывода, мне приходит в голову, что сама структура данных, которую я пытаюсь записать на диск, может быть модифицирована прямо посреди меня, записывая ее на диск. Возможно, это будет плохо. Если данные добавляются только к структуре данных при записи на диск, это фактически не вызовет проблемы с тем, как я пишу данные, но есть некоторые обстоятельства, когда более ранние данные могут быть изменены при записи новых данных и это действительно будет бесполезно с целостностью того, что я нахожусь в середине записи на диск.
Я могу придумать всевозможные несколько уродливых гарантий, которые я мог бы добавить в свой код, например:
- Переключитесь на синхронный ввод-вывод, чтобы записать данные на диск (на самом деле не хотите делать это для ответа на сервер).
- Установите флаг, когда я начал записывать данные и не записывал никаких новых данных, пока этот флаг установлен (заставляет меня потерять запись данных во время записи).
- Более сложные версии опции 2, где я устанавливаю флаг, и когда установлен флаг, новые данные поступают в отдельную временную структуру данных, которая, когда файл IO выполняется, затем объединяется с реальными данными (выполнимо, но кажется некрасиво).
- Сделайте копию моментальных копий исходных данных и не спешите писать эту копию на диск, зная, что никто не будет изменять копию. Я не хочу этого делать, потому что набор данных относительно велик, и я в ограниченной среде памяти (малиновый PI).
Итак, мой вопрос заключается в том, какие шаблоны проектирования для записи большого набора данных с асинхронным IO, когда другие операции могут захотеть изменить эти данные во время асинхронного ввода-вывода? Существуют ли более общие способы решения моей проблемы, чем конкретные описанные выше работы?