多次调用函数后,Redis连接丢失

时间:2018-10-05 08:41:11

标签: javascript node.js redis promise vagrant

我正在编写的程序是警报的状态显示屏幕,每个警报均由一个通道表示。

启动服务器(在无所事事的虚拟机上运行)时,将访问Influx数据库,将处理数据(包含1574个“通道”)并将其放入Redis数据库。这样可以很好地运行,并且刷新网页时GUI可以正常显示,尽管加载时间很长(最多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(/vagrant/node_modules/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”,参数:[   'vista:hash:Result:44f59707-c873-11e8-93b9-7f551d0bdd1f'],起源:   {错误:Redis与127.0.0.1:6379的连接失败-写入EPIPE       在WriteWrap.afterWrite(net.js:868:14)上errno:'EPIPE',代码:'EPIPE',系统调用:'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 :(得分:0)

我现在已经将所有“获取”的数据(从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})
}, 

(不用担心,这些不是我的实际变量名)

以前使用“提取”方法检索了两个“数据”变量。

我将数据export加载到Redis中后,import放入控制器文件中,在那里我有吸气剂将其全部组合成一个return数组。

现在页面刷新需要毫秒,而且我没有发生任何崩溃