Redis соединение теряется после нескольких вызовов функции - PullRequest
0 голосов
/ 05 октября 2018

Программа, которую я пишу, представляет собой экран отображения состояния аварийных сигналов, каждый из которых представлен каналом.

Когда сервер запущен (запущен на бродячей виртуальной машине), осуществляется доступ к базе данных 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

1 Ответ

0 голосов
/ 19 октября 2018

Теперь я переместил все «получение» данных (из redis) в файл channel.controller на стороне сервера.

Итак, где раньше у меня было бы:

renderPage: async (req, res) => {
    res.render('page')
},

У меня теперь есть такой метод:

renderPage: async (req, res) => {
        const data1 = getData1()
        const data2 = getData2()
        res.render('page',  {data1, data2})
}, 

(Не волнуйтесь, это не моифактические имена переменных)

Где две переменные 'data' были предварительно получены с использованием метода 'fetch'.

I export данные, как только они загружены в redis, и import itв файле контроллера, где у меня есть геттеры, чтобы объединить все это в один массив return.

Теперь страницы обновляются за миллисекунды, и у меня не было сбоев

...