【问题标题】:Background jobs that run on every request on Heroku and node.js在 Heroku 和 node.js 上的每个请求上运行的后台作业
【发布时间】:2020-09-30 22:10:29
【问题描述】:

我有一个应用程序需要运行一个很长的进程(每个请求需要 30-60 秒)。处理后,结果作为响应返回给请求。这在本地运行良好,但它使我的 Heroku 实例崩溃。

我希望发生的事情是:

  • 用户来到现场,请求发送到后端
  • 后端立即返回,并启动另一个进行处理的进程/任务/作业
  • 处理结束时,将响应返回给正确的用户。

我不确定我需要什么。根据长达一小时的研究,我似乎可以将 Redis 用作队列,并且工作人员可以每 x 分钟轮询一次。但是我不明白的是如何确定在处理结束后将响应发送到哪个请求。

是否有用于此的示例 Express/node.js?任何指针都有帮助。

【问题讨论】:

    标签: node.js heroku express web-worker


    【解决方案1】:

    就像您在研究中发现的那样,使用 Redis 设置工作队列是长时间运行进程的好方法。一个不错的库是kue (https://github.com/learnboost/kue)

    当涉及到使用作业结果响应请求时,有一个悬而未决的请求挂起等待响应并不是一个好方法(并且可能不起作用,heroku 会杀死已经空闲的请求一定时期)。

    您可以做的是在发出请求时启动后台作业并立即使用作业 ID 响应请求。然后,客户端可以轮询服务器以获取作业的状态,当作业完成时,它可以获取所需的结果。

    【讨论】:

    • kue 不好。 nodejs我还没有找到好的解决方案,所以最好自己写个队列管理器。
    • @happy_marmoset 为什么 kue 不好?
    【解决方案2】:

    Kue(来自@mattetre 的回答)不再维护。 Kue 的 GitHub 页面建议 Bull 作为一个不错的选择。它是一个快速可靠的基于 Redis 的 Node.js 队列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-05
      • 2023-03-26
      • 2012-09-14
      • 2023-02-01
      • 2012-01-13
      • 1970-01-01
      • 2013-05-28
      相关资源
      最近更新 更多