Heroku上的粘滞会话

jjhzyzn0  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(123)

我们有一个NodeJS应用程序,在heroku上运行SocketIO和集群。为了让SocketIO工作,我们使用redis-adapter,如下所述:https://socket.io/docs/using-multiple-nodes/
然后我们实现了粘性会话,如粘性会话文档所示:https://github.com/elad/node-cluster-socket.io
事实证明,当我们部署到Heroku时,connection.remoteAddress在:

// 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,但是当我们以这种方式暂停连接时,我们甚至还没有头?

toe95027

toe950271#

我们到处寻找解决办法,但显然没有好的解决办法。
以下是一些更好的建议:
https://github.com/indutny/sticky-session/issues/6
https://github.com/indutny/sticky-session/pull/45
它们似乎都没有很好的性能,因此我们最终将SocketIO通信改为Websockets。这消除了对所有粘性会话的需要。

eqoofvh9

eqoofvh92#

这个问题现在似乎可以通过Heroku的session affinity解决了https://socket.io/docs/v4/using-multiple-nodes/#passing-events-between-nodes
至少#worksforme on Heroku + Next.js(静态服务)+socket.io(服务器之间的+ redis)

相关问题