将一段代码分离为后台进程的正确方法
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。
我有一个 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。