问题/如何遇到它
我正在使用Node.JS编写批处理Lambda函数,涉及两个不同地方的Redis调用。一些批处理项可能永远无法到达第二个Redis调用。由于所有操作都是异步执行的,所以如果在批处理队列为空时关闭连接,任何未来的Redis调用都会失败。该怎么关闭连接?
我的尝试
process.on('beforeExit', callback) -- 因为事件循环仍包含Redis连接,所以不会被调用
client.unref() -- 如果没有待处理的命令,则关闭连接。无法处理未来的调用。
- client.on('idle', callback) -- 虽然有效但已被弃用,并且仍可能错过未来的调用
目前我正在做什么
一旦批处理队列为空,我就会调用:
intervalId = setInterval(closeRedis, 1000);
在超时后的回调函数中,我关闭了Redis连接并清除了间隔:
function closeRedis() {
redis.client('list', (err, result) => {
var idle = parseClientList(result, 'idle');
if (idle > timeout) {
redis.quit();
clearInterval(intervalId);
}
});
}
这种方法大多数情况下是有效的,但如果只是检查超时,仍然有可能存在其他进程正在运行并且将来可能会进行Redis调用的情况。我希望在事件循环中仅剩下空闲连接时关闭连接。是否有一种方法可以实现这一点?
context.callbackwaitsforemptyeventloop = false
来结束函数执行而不必等待连接关闭。 - demian85