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

标签 node.js heroku websocket redis socket.io

我正在构建一个部署到 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/

相关文章:

javascript - Express.js - 使用嵌套请求从备份 URL 获取 JSON

sql-server - 在 Node.js 中防止 SQL 注入(inject)的最佳方法

php - 有没有办法在 Heroku 中使用 PHP WebSocket?,默认情况下似乎只支持其他技术

php - PHP Websockets服务器在256个用户后停止接受连接

javascript - 在不复制的情况下通过 WebSocket 发送 ArrayBuffer 的子段

node.js - 将 dgram (UDP) 与 Socket.IO 一起使用时,数据报的发送速度是多少? ( Node )

node.js - 如何用nodejs和mongoose查找文档,为什么没有结果?

node.js - 当 Node.js Express 应用程序作为由 serverless-http 包装的 Lambda 函数运行时出现路由问题?

ruby-on-rails - 如何在不使用 Heroku 工具的情况下使用 pg_dump?

java - Playframework 2.3.9 sbt 在 heroku 上构建导入失败