微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Heroku Node.js应用程序上的Socket.io和多个Dyno WebSocket在连接建立之前关闭

我正在构建部署到使用Websockets的Heroku的应用程序。

当我只使用1个dyno时,websockets连接正常工作,但当我缩放到> 1时,我收到以下错误

POST
http://****.herokuapp.com/socket.io/?EIO=2&transport=polling&t=1412600135378-1&sid=zQzJJ8oPo5p3yiwIAAAC
400 (Bad Request) socket.io-1.0.4.js:2

WebSocket connection to
‘ws://****.herokuapp.com/socket.io/?EIO=2&transport=websocket&sid=zQzJJ8oPo5p3yiwIAAAC’
Failed: WebSocket is closed before the connection is established.
socket.io-1.0.4.js:2

我正在使用Redis适配器来启用多个Web进程

var io = socket.listen(server);
var redisAdapter = require('socket.io-redis');
var redis = require('redis');

var pub = redis.createClient(18049,'[URI]',{auth_pass:"[PASS]"});
var sub = redis.createClient(18049,{detect_buffers: true,auth_pass:"[PASS]"} );

io.adapter( redisAdapter({pubClient: pub,subClient: sub}) );

这是在本地主机(我正在使用工头运行,如Heroku,我启动2个Web过程,与Heroku相同)上工作。

在我实现了redis适配器之前,我遇到了一个Web-sockets握手错误,所以适配器有一些效果。此外,它现在偶尔工作,我假设当插座匹配相同的网页动态。

我也试图启用粘性会话,但是它从来没有工作。

var sticky = require('sticky-session');
sticky(1,server).listen(port,function (err) {
  if (err) {
    console.error(err);
    return process.exit(1);
  }
  console.log('Worker listening on %s',port);
});

解决方法

我是Heroku的Node.js平台所有者。

WebSockets在多个dynos上在Heroku开箱即用; socket.io(和其他实时库)使用回退到无状态进程,如xhr轮询,没有会话关联。

要扩展socket.io应用程序,请先按照socket.io中的所有说明进行操作:

> http://socket.io/docs/using-multiple-nodes/

然后,启用您的应用程序的会话兴趣(这是一个免费的功能):

> https://devcenter.heroku.com/articles/session-affinity

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐