Программа, которую я пишу, представляет собой экран отображения состояния аварийных сигналов, каждый из которых представлен каналом.
Когда сервер запущен (запущен на бродячей виртуальной машине), осуществляется доступ к базе данных Influx, данные (состоящие из 1574 «каналов») обрабатываются и помещаются в базу данных Redis.Это работает нормально, и графический интерфейс отображается без проблем при обновлении веб-страницы, хотя загрузка занимает много времени (до 20 с), и почти все это время уходит на приведенный ниже метод.
Однако после нескольких обновлений / перемещений по сайту часто происходит сбой со следующей ошибкой:
{AbortError: Redis соединение потеряно и команда прервана.Это могло быть обработано.на RedisClient.flush_and_error (/vagrant/node_modules/redis/index.js:362:23) на RedisClient.connection_gone (/vagrant/node_modules/redis/index.js:664:14) на сайте RedisClient.on_error /mogra_ (/ vagra)redis / index.js: 410: 10) в сокете.(/vagrant/node_modules/redis/index.js:279:14) в emitOne (events.js: 116: 13) в Socket.emit (events.js: 211: 7) в onwriteError (_stream_writable.js: 417: 12) в onwrite (_stream_writable.js: 439: 5) в _destroy (internal / streams / destroy.js: 39: 7) в Socket._destroy (net.js: 568: 3) код: 'UNCERTAIN_STATE', команда: 'HGETALL', args: [' vista: hash: Результат: 44f59707-c873-11e8-93b9-7f551d0bdd1f '], origin: {Ошибка: сбой повторного подключения к 127.0.0.1:6379 - запись EPIPE в WriteWrap.afterWrite (net.js:868: 14) errno: 'EPIPE', код: 'EPIPE', syscall: 'write'}}
Эта ошибка отображается 1574 раза (один раз для каждого канала) и возникает, когда программадостигает этой функции:
Result.getFormattedResults = async function (cycle) {
const channels = await Channel.findAndLoad()
const formattedResults = await mapAsyncParallel(channels, async channel => {
const result = await this.findAndLoadByChannel(channel, cycle)
const formattedResult = await result.format(channel)
return formattedResult
})
return formattedResults
}
mapAsyncParallel()
выглядит следующим образом:
export const mapAsyncParallel = (arr, fn, thisArg) => {
return Promise.all(arr.map(fn, thisArg))
}
findAndLoadByChannel()
находит канал и загружает его по этой строке:
const resultModel = await this.load(resultId)
И format()
берет модель и выводит данные в формате JSON
Есть две команды 'fetch (...)' (которые необходимы и не могут быть объединены) во внешнем интерфейсе, ирпроблема редко возникает, когда я закомментирую один из них (любой).Это заставляет меня думать, что это может быть проблема с памятью или макс.(увеличение maxmemory в конфигурационном файле не помогло).Или проблема с использованием такого большого количества обещаний (концепция, с которой я довольно новичок).
Это только начало происходить, так как я добавил больше функциональности, и я предполагаю, что функция нуждается в оптимизации, но я взял на себя этот проектот кого-то еще, и я все еще новичок в node.js и redis.
Версии:
- Бродяга: 2.0.1
- Ubuntu: 16.04.5
- Redis: 4.0.9
- Узел: 8.12.0
- npm: 5.7.1