gpt4 book ai didi

node.js - 生产环境中的 NodeJS 和 Socket.io : Dealing with state

转载 作者:搜寻专家 更新时间:2023-10-31 23:50:48 25 4
gpt4 key购买 nike

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

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

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

我如何将此场景构建为单个 nodejs 入口点,它可以使用 Nginx、PM2 和/或 Nodejs 集群来 fork 进程并相应地路由套接字连接。换句话说,在这种情况下,哪种架构最适合生产?

关于状态问题:

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

最佳答案

我可能会将进程的 pids 暴露给路由脚本并使用 session 和 cookie,将它们保存到 Redis DB 中。以及分配给用户的 pid。

因此在连接时,您设置一个 cookie 和一个 session ,可能使用用户 ID 的日期时间哈希(取决于您是否有与您的客户关联的用户帐户),将其保存在用户 cookie 中并将 pid 保存在你的 session 。

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

编辑

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

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
});

对于您的读取流,您可以在相应的 worker 中执行它们。1 个 Worker 等于 1 个 socket.io 进程

关于node.js - 生产环境中的 NodeJS 和 Socket.io : Dealing with state,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49777439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com