Heroku 上的粘性会话

Sticky Session on Heroku

我们有一个 NodeJS 应用程序 运行 Heroku 上的 SocketIO 和集群。为了使 SocketIO 正常工作,我们使用这里讨论的 redis-adapter:https://socket.io/docs/using-multiple-nodes/

然后我们实现了粘性会话,如粘性会话文档所示:https://github.com/elad/node-cluster-socket.io

事实证明,当我们部署到 Heroku 时,connection.remoteAddress in:

// Create the outside facing server listening on our port.
var server = net.createServer({ pauseOnConnect: true }, function(connection) {
    // We received a connection and need to pass it to the appropriate
    // worker. Get the worker for this connection's source IP and pass
    // it the connection.
    var index = worker_index(connection.remoteAddress, num_processes);
    var worker = workers[index];
    worker.send('sticky-session:connection', connection);
}).listen(port);

实际上是一些 heroku 路由服务器的 IP 地址,而不是客户端 IP。我看到请求头"x-forwarded-for"可以用来获取客户端IP,但是当我们这样暂停连接时,我们连头都没有吗?

我们四处寻找解决方案,但显然没有好的解决方案。

以下是一些更好的建议:

https://github.com/indutny/sticky-session/issues/6

https://github.com/indutny/sticky-session/pull/45

None 其中的性能似乎不错,因此我们最终将 SocketIO 通信更改为仅 Websockets。这消除了粘性会话的需要。