2016-04-28 74 views
1

我在这里有一段时间。我已经阅读了大量文档以及其他人关于同一主题的问题,并且无法找到如何阻止这种情况发生的答案。我故意关闭redis服务器,以确保应用程序在生产中不会完全走向核心,但我所做的任何事情都似乎阻止了这种情况的发生。这里是我的代码是正确的什么现在一个很简单的例子...redis-server离线崩溃节点

var cluster = require('cluster'); 
var express = require('express'); 
var http = require('http'); 
var redis = require('redis'); 
var redisAdapter = require('socket.io-redis'); 
var sticky = require('sticky-session'); 
var port = process.env.PORT || 3333; 
var workers = 3; 
var app = express(); 
var server = http.createServer(app); 
var io = require('socket.io')(server); 

if(!sticky.listen(server, 3333, {workers: workers})) { 
    server.once('listening',() => { 
     console.log('server started on port ' + port); 
     process.on('exit',() => { 
      io.emit('error', {errorType: 'SERVER_SHUTDOWN'}); 
     }); 
     process.on('uncaughtException', (err) => { 
      console.log('uncaught exception occurred'); 
      console.log(err); 
     }); 
    }); 
} else { 
    addRedisAdapter(io); 
    addIOEventHandler(io); 
} 

function addRedisAdapter(io) { 
    var redisUrl = process.env.REDISTOGO_URL || 'redis://127.0.0.1:6379'; 
    var redisOptions = require('parse-redis-url')(redis).parse(redisUrl); 
    var pub = redis.createClient(redisOptions.port, redisOptions.host, { returnBuffers: true}); 
    var sub = redis.createClient(redisOptions.port, redisOptions.host, {returnBuffers: true}); 
    io.on('error', (err) => { 
     console.log(err); 
    }); 
    io.on('uncaughtException', (err) => { 
     console.log(err); 
    }); 
    io.adapter(redisAdapter({pubClient: pub, subClient: sub})); 
    console.log('redis adapter started'); 
} 
function addIOEventHandler(io) { 
    //all the events for io 
} 

现在,我开始Redis的服务器,然后我开始与这个服务器的nod​​e.js。然后我弹出一个终端窗口并输入“redis-cli shutdown”来强制redis服务器脱机。只要我这样做,node.js终端窗口就会一遍又一遍循环遍历相同的错误。

events.js:154 
    throw er; // Unhandled 'error' event 
^

Error: Redis connection to 127.0.0.1:6379 failed - connect ECONNREFUSED 127.0.0.1:6379 
    at Object.exports._errnoException (util.js:893:11) 
    at exports._exceptionWithHostPort (util.js:916:20) 
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1075:14) 
redis adapter started with url: redis://127.0.0.1:6379 

我都process.on( 'uncaughtException' ......和io.on( 'uncaughtException' ......以及一个io.on( '错误',...处理程序,但每时间服务器只是坐在那里循环说有一个“未处理的错误”事件“ 有人可以请帮助我在这里。我不明白这可能是未经处理的错误,它没有任何意义在我心中 预先感谢您提供的任何可能的帮助,我一直在尝试寻找其他可能的选项,并且他们都说同样的事情,使用io.on('error',或者io.on('uncaughtException'或process.on('uncaughtException',我拥有它们,它仍然错误并且崩溃节点。

+1

尝试在客户端添加错误处理,即pub.on(“error”,(err)=> {console.log(err)}); – SadiRubaiyet

+0

@SadiRubaiyet当我添加pub.on('错误'...但是我仍然得到一个循环和一个错误...我得到一个控制台日志... events.js:154 throw er; // Unhandled'error “事件 ^ 错误:Redis的连接127.0.0.1:6379失败 - 连接ECONNREFUSED 127.0.0.1:6379 在Object.exports._errnoException(util.js中:893:11)在exports._exceptionWithHostPort (util.js中:916:20) at TCPConnectWrap.afterConnect [as oncomplete](net.js:1075:14) –

+0

非常棒的人,很乐意帮忙,另外你可以使用client.end或客户端.quit出错,甚至设置一个重试战略描述在驱动程序的[github页面](https://github.com/NodeRedis/node_redis) – SadiRubaiyet

回答

3

感谢@SadiRubaiyet指引我朝着正确的方向前进。我不得不将错误事件添加到pub和sub。一旦我这样做了,当redis出现故障时不会再有节点崩溃。这里是编辑的代码...

var cluster = require('cluster'); 
var express = require('express'); 
var http = require('http'); 
var redis = require('redis'); 
var redisAdapter = require('socket.io-redis'); 
var sticky = require('sticky-session'); 
var port = process.env.PORT || 3333; 
var workers = 3; 
var app = express(); 
var server = http.createServer(app); 
var io = require('socket.io')(server); 

if(!sticky.listen(server, 3333, {workers: workers})) { 
    server.once('listening',() => { 
     console.log('server started on port ' + port); 
     process.on('exit',() => { 
      io.emit('error', {errorType: 'SERVER_SHUTDOWN'}); 
     }); 
     process.on('uncaughtException', (err) => { 
      console.log('uncaught exception occurred'); 
      console.log(err); 
     }); 
    }); 
} else { 
    addRedisAdapter(io); 
    addIOEventHandler(io); 
} 

function addRedisAdapter(io) { 
    var redisUrl = process.env.REDISTOGO_URL || 'redis://127.0.0.1:6379'; 
    var redisOptions = require('parse-redis-url')(redis).parse(redisUrl); 
    var pub = redis.createClient(redisOptions.port, redisOptions.host, { returnBuffers: true}); 
    var sub = redis.createClient(redisOptions.port, redisOptions.host, {returnBuffers: true}); 
    io.on('error', (err) => { 
     console.log(err); 
    }); 
    io.on('uncaughtException', (err) => { 
     console.log(err); 
    }); 
    /*HERE IS THE NEW CODE THAT MADE IT WORK*/ 
    pub.on('error', (err) => { 
     console.log('error from pub'); 
     console.log(err); 
    }); 
    sub.on('error', (err) => { 
     console.log('error from sub); 
     console.log(err); 
    }); 
    /*END*/ 
    io.adapter(redisAdapter({pubClient: pub, subClient: sub})); 
    console.log('redis adapter started'); 
} 
function addIOEventHandler(io) { 
    //all the events for io 
}