1

我在 heroku 上有一个简单的节点程序,它会定期向所有客户端发送消息。但我不断收到以下警告,导致重新连接。这是我应该担心的事情吗?我大约每 2-3 次发射就得到这个。

需要注意的是,我在 localhost 上没有收到任何警告或重新连接。我正在为本地和 heroku 实例使用长轮询配置。此外,我在 heroku 上的 PS 规模越高,我得到的这些警告就越多。

错误

warn: client not handshaken client should reconnect

应用程序.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);

客户端.js

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

1 回答 1

2

此外,我在 heroku 上的 PS 规模越高,我得到的这些警告就越多。

是关键。

Socket.io 设计为在单个进程中运行。它将会话存储在内存中。您需要您的代理具有粘性,始终将同一个用户发送到同一个进程,或者您需要共享会话(从那时起您共享房间会更好);

信息是@

https://github.com/LearnBoost/Socket.IO/wiki/Configuring-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 插件,其中三个有免费层。

于 2013-04-10T03:58:22.203 回答