【问题标题】:Trigger function with a delay longer than an hour in a Node/Express app在 Node/Express 应用程序中延迟超过一小时的触发功能
【发布时间】:2019-04-21 20:16:15
【问题描述】:

我想在调用特定端点后延迟 1 小时或 5 小时触发我的 express 应用中的函数。

我尝试在我的 enpoint 的 then 链中使用一个简单的 setTimeout,并在我的控制器中使用类似这样的东西:

function(req, res, next) {

  return mailer.sendEmail(req.user, 'firstEmail') // returns a promise
  .then(function(emailResult) {
    if (emailResult == 'ok') {
       res.sendStatus(200).json({ message: 'You will receive an email in 1 hour' }) // set positive API json response
    } else {
       res.sendStatus(200).json({ message: 'You will receive an email in 5 hour' }) // set negative API json response
    }
    return emailResult
  })
  .then(function(emailResult){
    return new Promise((resolve, reject) => {
        setTimeout(function(){
            return return mailer.sendEmail(req.user, 'secondEmail')
        }, emailResult == 'ok' ? 60 * 60 * 1000 : 5 * 60 * 60 * 1000) // 1 hour or 5 hours
    })
  }) 
})

而且似乎有效,但我有两个主要问题:

  • 如果我使用 (pm2 startOrReload prod.json) 重新启动我的应用程序的 pm2 进程,所有超时都会取消吗?
  • 如果我为此系统安排了类似 600 次超时,我会遇到任何性能问题吗?

有类似的经验吗?

【问题讨论】:

  • 您可能应该为此考虑某种专用队列,例如kue
  • 似乎是个不错的选择,谢谢建议
  • 最后我决定用 kue 来管理作业并延迟它们

标签: node.js express promise settimeout


【解决方案1】:

我已经遇到过这个问题了。

我找到的解决方案是使用我的数据库作为时间寄存器。 基本上,如果您使用的是 SQL 或面向文档的数据库:

  1. 将计划操作插入数据库。
  2. 每隔 x 秒检查一次(取决于您需要的精度)是否有需要弹出的条目。如果是这样,请删除该项目,获取它,执行它。

你也可以使用cron包来做检查,但是……因为这很容易实现,你应该自己做。

编辑:为什么是这个解决方案?

首先,这是服务器的 RAM 保护程序,当您有 5000 个条目时,您不必将其存储在内存中。

【讨论】:

    【解决方案2】:
    • 是的,您的所有超时都将被取消,因为它们已存储在内存中
    • 我认为 600 超时可能不是问题,但您可能会找到更合适的方法,例如将所有超时排序的数组和一个 setInterval 来检查是否需要执行某些操作。

    【讨论】:

      【解决方案3】:

      这样的超时可能是一种解决方案,但不是最好的。

      如果超时会立即添加到您的内存中,例如每小时,当您重新启动 Node.js 进程时,尚未触发的计时器会丢失,这意味着即使您尝试更新新的应用程序也无法重新启动您的应用程序如果您不想丢失其中任何一个,请输入代码。丢失电子邮件或永远不会重新启动,有点混乱,对吧?

      对于这种情况,最常实施的方法是消息队列。 您可以将 Message Queue 作为在数据库中存储和使用的计时器,因此您不必担心计时器是否会在您不希望发生时被取消或多次调用。

      RabbitMQ 是一个独立的 MQ,对 Node.js 很友好。

      Kue 是一个类似 MQ 的 NPM 包,它依赖于 Redis。

      希望你喜欢。 ;)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-01
        • 2012-03-01
        相关资源
        最近更新 更多