Node.js 生产中的NodeJS和Socket.io:处理状态

Node.js 生产中的NodeJS和Socket.io:处理状态,node.js,socket.io,Node.js,Socket.io,在开发环境中,我有一个单一的nodejs进程,其中socket.io监听给定的端口。客户端连接后,需要维护一个状态。nodejs脚本对文件进行一些处理,并通过套接字发送处理状态。这就像一批永远不会结束的东西 如果客户端关闭浏览器,然后再次打开(在开发环境中),则网页只需再次连接到套接字并获取进程的当前状态,该进程将在后台为特定用户处理文件 为了每个用户都有一个进程,并确保用户总是在同一端口上重新连接到他们启动的同一进程,我需要管理这些进程,每个用户一个进程作为服务器上的服务,并为每个用户预订端口

在开发环境中,我有一个单一的nodejs进程,其中socket.io监听给定的端口。客户端连接后,需要维护一个状态。nodejs脚本对文件进行一些处理,并通过套接字发送处理状态。这就像一批永远不会结束的东西

如果客户端关闭浏览器,然后再次打开(在开发环境中),则网页只需再次连接到套接字并获取进程的当前状态,该进程将在后台为特定用户处理文件

为了每个用户都有一个进程,并确保用户总是在同一端口上重新连接到他们启动的同一进程,我需要管理这些进程,每个用户一个进程作为服务器上的服务,并为每个用户预订端口

我如何将此场景构建为单个nodejs入口点,使用Nginx、PM2和/或nodejs集群来分叉进程并相应地路由套接字连接。换句话说,在这样的场景中,哪种体系结构最适合生产

关于国家问题:


我持有的状态不仅仅是变量,可以存储在数据库中。我有连续的文件读取流,它们按照用户通过使用套接字连接到该进程的网页配置的顺序一个接一个地处理。此进程还连接到另一个套接字服务器到服务器,并且必须保持连接。

我可能会将进程的pid公开给路由脚本,并使用会话和cookie,将它们与分配给用户的pid一起保存到

因此,在连接上,您可以设置一个cookie和一个会话,可能会为用户ID设置一个datetime哈希(取决于您是否有与客户端关联的用户帐户),将其保存在用户cookie中,并将pid保存在会话中

然后,您可以将用户重定向到路由器中相应的进程分支

编辑

我会使用nodescript作为代理。我找到了答案,因为您没有发布代码,我不知道您是如何创建流程的,所以我将使用它作为参考:

const socketio = require('socket.io');
const redis = require('redis');

on.connect((req, res) => {
    let uid,
        pid,
        port;

    // if user does not have the cookie yet
    if (!req.cookies.uid) {
        uid = getNewUserID(req); // create uid from information from the request, set a cookie later
        pid = createWorker(uid); // generate new socket.io worker in cluster and return pid
        port = getSocketPort(pid); // get socket port from worker

        // save acquired variables to database
        redis.set(uid, [pid, port], function(err, reply) {
            if (err) throw err;
            console.log(reply);
        });
    };

    uid = req.cookies.uid; // get uid from request
    pid = getPid(uid); // get pid from redis

    socketio(getSocketPort(pid)); // connect client to port of correct worker
});
对于readstreams,您可以在相应的worker中执行它们。
1个Worker等于1个socket.io进程

不要在内存中保存您的状态。保存在一个数据库中(redis是一个很好的数据库,因为它基于内存,速度非常快),然后您就不必担心套接字是否重新连接到同一个进程,甚至是同一个服务器(如果您有多个具有负载平衡的服务器).

我需要连接到同一进程,因为我需要能够播放/暂停/修改将在该特定进程上为该用户运行的批处理进程。这是否可以使用Nginx反向代理完成?这个路由脚本将如何执行?这是一个nodejs脚本,就像Nginx revese proxy?@Valdir据我所知,Nginx反向代理将客户端重定向到不同的服务和服务器。在这种情况下,您只需重定向到集群中的forks。我用一个示例脚本更新了我的答案,以便您更好地理解我的答案。是的,它似乎是路径。