我正在构建一个部署到 Heroku 的应用程序,它使用 Websockets。
当我只使用 1 个测功机时,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, '[URI]', {detect_buffers: true, auth_pass:"[PASS]"} );
io.adapter( redisAdapter({pubClient: pub, subClient: sub}) );
这是在 localhost 上运行的(我使用 foreman 来运行,就像 Heroku 一样,我正在启动 2 个 Web 进程,与 Heroku 上的相同)。
在我实现 redis 适配器之前,我遇到了一个 web-sockets 握手错误,所以适配器有一些效果。它现在偶尔也可以工作,我假设当套接字匹配相同的网络测功机时。
我也尝试过启用粘性 session ,但它始终不起作用。
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 在 Heroku 上跨多个 dyno 开箱即用; socket.io(和其他实时库)使用回退到无状态进程,如 xhr 轮询,在没有 session 关联的情况下中断。
要扩展 socket.io 应用程序,请首先遵循 socket.io 中的所有说明:
然后,在您的应用上启用 session 关联(这是一项免费功能):
关于node.js - Heroku Node.js 应用程序上的 Socket.io 和多个 Dyno。 WebSocket 在连接建立之前关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26217312/