如何使用Bull在Node.js中执行作为后台进程的功能?

时间:2019-04-16 19:50:20

标签: javascript node.js asynchronous redis worker

我有一个Node.js Web应用程序,在其中我进行了一些第三方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 });

但是我真的无法确定它是否有效...如何启动并运行它?

1 个答案:

答案 0 :(得分:0)

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

返回也与等待相同。因此,可以说您有一个getter方法,可以说类似async function findWorker(){ return database.find({ workerId }); };之类的东西。