javascript Nodejs SetTimeOut [关闭]

8yparm6h  于 2023-06-04  发布在  Java
关注(0)|答案(1)|浏览(389)

已关闭,此问题需要details or clarity。目前不接受答复。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

2天前关闭。
Improve this question
我必须开发一个Node.js API,在收到请求后,我需要在5分钟延迟后向该人发送消息。但是,如果这个人在5分钟标记之前发送另一条消息,我需要重新设置计时器。为了实现这一点,当客户发送请求时,我使用setTimeout函数。如果客户发送另一条消息,我将清除现有的超时并设置一个新的超时。
我担心这个解决方案的可行性,因为可能会有成千上万的请求进来。如果这种方法不适合,我将感谢您的建议,一个替代的解决方案。

app.post('/incomingMessage', express.json(), async function (req, res) {
var timeouts = {}

const id = req.body.from;

clearTimeout(timeouts[id]);
timeouts[id] = setTimeout(functionToSendMessage, 20000, id);
}

function functionToSendMessage(id) {
console.log(`message sent to ${id}`); \\ take it as message sent
delete queue[id]
}
bgtovc5b

bgtovc5b1#

你的方法是可行的,但它可能不是最有效的。如果有成千上万的请求进入,您可能需要考虑使用队列来存储请求。这将使您能够按顺序处理请求,并避免必须清除现有超时。
在本地,我们可以这样做:

const queue = [];

function sendMessage(id, message) {
  queue.push({ id, message });
}

function processQueue() {
  while (queue.length > 0) {
    const { id, message } = queue.shift();

    // Send the message after a 5-minute delay.
    setTimeout(() => {
      sendMessage(id, message);
    }, 300000);
  }
}

// Start processing the queue.
processQueue();

或者您可以使用RedisApache KafkaNATSRabbitMQ,它们是现成的排队解决方案

相关问题