我正在编写的程序是警报的状态显示屏幕,每个警报均由一个通道表示。
启动服务器(在无所事事的虚拟机上运行)时,将访问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还是很陌生。
版本:
答案 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
数组。
现在页面刷新需要毫秒,而且我没有发生任何崩溃