【问题标题】:How do I execute my functions as background processes in Node.js with Bull?如何使用 Bull 在 Node.js 中将我的函数作为后台进程执行?
【发布时间】:2019-09-06 23:57:33
【问题描述】:

我有一个 Node.js Web 应用程序,我在其中进行了一些第 3 方 API 调用,创建了一些非常长的请求/响应时间。这导致我的 Heroku 大约 50% 的时间超时,并且根据 Heroku 文档,没有办法改变这个硬限制。他们建议使用后台进程来扩展,这似乎很适合这个问题(他们提供了示例并建议使用https://optimalbits.github.io/bull/)。

我正在关注 Heroku 提供的简单示例 https://github.com/heroku-examples/node-workers-example),但是对于我来说,这个示例有点太简单了。

我有一个名为worker.js 的文件,它将是我的工人。有一个函数start() 实例化队列,并告诉队列如何处理作业。我的问题是我将通过我的 API 端点将作业添加到队列中,并且我希望每个作业都执行特定的功能以完成它们的任务。

这里是start() 函数:

function start(){
 let workQueue = new Queue('work', REDIS_URL);
  workQueue.process(maxJobsPerWorker, async (job,data) => {
    return {message: "Finished"};
  });

我想做的是在逻辑块中执行不同的功能,而不是返回完成的消息。例如,我想做这样的事情:

function start(){
 let workQueue = new Queue('work', REDIS_URL);
  workQueue.process(maxJobsPerWorker, async (job,data) => {
    return someFunction();
  });

同样,如果我每次都需要运行相同的函数,这将是非常简单的,但我将运行几个使用不同输入的不同函数。所以someFunction 是一个变量而不是一个常量。

我正在考虑将要执行的函数的名称直接传递给作业,如下所示: let job = await workQueue.add({ callback: functionName });

但是我无法确定这是否有效...我怎样才能启动并运行它?

【问题讨论】:

    标签: javascript node.js asynchronous redis worker


    【解决方案1】:

    我不认为启动功能是必要的。您可以像async function myFunction(){ //Logic goes here } 这样定义您的函数,然后当您需要该调用时,您只需使用await myFunction() 执行它们,或者它返回一些您可以将其放入变量的内容。但是您要执行的函数需要包含async 字样,await 才能工作。

    return 的工作方式也与 await 相同。所以你可以假设你有一个 getter 方法,你可以说类似async function findWorker(){ return database.find({ workerId }); };

    【讨论】:

    • 我正在使用 throng 进行集群,我调用 start 函数开始另一个进程。我按照您的描述定义了我的业务逻辑,通常我在我的请求中执行它们 - 这就是我试图摆脱的。问题是我不确定何时/何处在我的工作文件中执行该函数。
    • 不应该在队列不为空的时候执行吗?因为那时我会说,当调用完成时,它应该立即开始执行。也许我真的不明白你想要达到的目标。
    • 是的,队列将执行process 方法调用中的任何逻辑。事情是在 process 调用中,我想告诉我的队列根据我点击的 API 端点执行特定的函数。因此,如果我发出一个发布请求让我们说“/job/user”,我希望我的队列知道为了处理刚刚创建的作业,它需要像addUser() 函数或其他东西一样运行(即@ 987654329@。我只是不确定如何让我的队列表现得像那样。我可能只是解释得很糟糕,哈哈
    • 我对你想要做什么有点困惑,哈哈。我想我不能帮你解决你的问题,对不起。祝你好运找到你的问题的答案!
    猜你喜欢
    • 1970-01-01
    • 2012-11-02
    • 2014-05-29
    • 1970-01-01
    • 2013-05-21
    • 2011-06-15
    • 2011-04-30
    相关资源
    最近更新 更多