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

问题描述 投票:0回答:1

我有一个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 });

但是我无法确定这是否有效......我怎样才能让它运行起来?

javascript node.js asynchronous redis worker
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.