2013-04-09 110 views
1

我在heroku上有一個簡單的節點程序,定期向其所有客戶端發送消息。但我不斷收到下面的警告,導致重新連接。這是我應該擔心的嗎?我每2-3次都會得到這個結果。heroku上的socket io

請注意,本地主機上沒有任何警告或重新連接。我爲local和heroku實例使用長輪詢配置。另外,我越高,我在Heroku上的PS就越多,這些警告就越多。

錯誤

warn: client not handshaken client should reconnect 

app.js

io.configure(function() { 
    io.set("transports", ["xhr-polling"]); 
    io.set("polling duration", 10); 
}); 

io.sockets.on('connection', function (socket) { 
    socket.emit('news', 'reconnect'); 
}); 

setInterval(function(){ 
    io.sockets.emit('news', {time: new Date()}) 
},3000); 

client.js

var socket = io.connect('/'); 
socket.on('news', function (data) { 
    console.log(data); 
}); 
+0

我知道這可能聽起來有點奇怪,但你有沒有試過聯繫他們的支持? – 2013-04-09 21:28:00

回答

2

此外,較高的I擴展我在Heroku上PS,而以上的這些警告我得到。

是關鍵。

Socket.io被設計爲在單個進程中運行。它將它的會話存儲在內存中。你需要你的代理是粘性的,總是把同一個用戶發送到同一個進程,或者你需要共享會話(這會更好,因爲你共享房間);

的信息是@

​​

短期的是,你需要使用Redis的

var RedisStore = require('socket.io/lib/stores/redis') 
    , redis = require('socket.io/node_modules/redis') 
    , pub = redis.createClient() 
    , sub = redis.createClient() 
    , client = redis.createClient(); 

io.set('store', new RedisStore({ 
    redisPub : pub 
, redisSub : sub 
, redisClient : client 
})); 

幸運的Heroku有五個不同的Redis插件三,其中有免費的層次。