将一段代码分离为后台进程的正确方法

Proper way to seperate piece of code as a background process

我有一个 bullCollections,我在其中保存了有关某些消息示例的一些信息

try {
    let bullPayload = {
        type: 'message',
        payload: {
            messsages: messagesForPreProcessingData,
            sessionID: this.data['sessionID'],
            socketID: parseInt(this.data['socketID']),
        },

        await bullConnections[accumulatorQueue].add(bullPayload, {
            removeOnComplete: true,
        });
    };

代码工作正常,但我被要求更改这里的逻辑,根据一些统计信息,消息花费太多时间显示给某些用户(来自糟糕的 wifi),我想出了一个解决方案前端将计算从服务器到客户端所用的时间,如果花费的时间超过 400 毫秒,将发送一个新请求,以便后端知道消息加载时间很长。

我做了这样的超时

saveBullPayloadWithTimeout(key, timeDuration, bullPayLoad, messages, events) {
    let redis = this.data.dbRedisConfigur.dataRedis;
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            redisConnections[redis].get(key, (err, result) => {
                if (err) {
                    reject(err);
                } else {
                    if (result) {
                        redisConnections[redis].del(key, (err, result) => {
                            if (result == 1) {
                            } else {
                                logErrors({ message: 'CANNOT DELETE KEY' });
                            }
                        });
                    } else {
                        bullConnections[accumulator].add(bullPayLoad, {
                            removeOnComplete: true,
                        });
                        console.log('AFTER');
                        this.updateCurrentMessages(messages, events);
                    }
                }
            });
        }, timeDuration);
    });
}

所以这段代码应该等待5秒,这样它才能知道是否插入消息。 在这 5 秒内,后端等待第二个请求,如果已经发出第二个请求,它将数据保存到 Redis,5 秒后它将检查数据是否存在,然后它不会保存消息,否则它会保存它。

超时是否会影响性能,因为后端将处理数百万用户?

有没有更好的方法将其分离为后台进程?

Does timeout affect the performance, because the backend will handle millions of users?

超时本身可能不会对性能产生太大影响。但是你对它们的具体使用会,因为它所做的只是将进程延迟 timeDuration 然后 运行 它 在主线程上 ,而你没有如果后续请求取代它,那里有任何东西(据我所知)取消前一个。

Is there any better way to separate this as a background process?

setTimeout 不会 作为后台进程进行工作。它甚至不在后台线程上执行。它是在安排计时器的同一个主线程上完成的。使用 setTimeout 只是延迟开始工作,不会使工作在不同的线程上进行。

如果您想在不同的 进程 中完成某些事情,您需要生成 child process.

如果你想在不同的线程上完成一些事情,你需要生成一个 worker thread