首页 > 解决方案 > 如何使用 Bull 在 Node.js 中将我的函数作为后台进程执行?

问题描述

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

但是我真的无法判断这是否有效......我怎样才能让它运行起来?

标签: javascriptnode.jsasynchronousredisworker

解决方案


我不认为启动功能是必要的。您可以像这样定义您的函数async function myFunction(){ //Logic goes here },然后当您需要该调用时,您只需使用它们执行它们,await myFunction()或者它返回一些您可以将它放在变量中的东西。但是您要执行的功能需要包含async单词 for awaitto work。

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


推荐阅读