公牛JS和Heroku上运行不同的工人

bvn4nwqk  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(135)

在NodeJS、Heroku应用程序上实现不同的工作者时,我正在寻找关于如何构建我的应用程序的建议。
我的路由器打开了两个端点。一个接收GET请求,另一个接收带有一些正文内容的POST请求。

const Queue = require("bull");

// Create / Connect to a naned worked queue
let workQueue = new Queue("work", client);

router.post("/job/get-data/:id", ensureAuth, async (req, res) => {
  let job = await workQueue.add({
    filename: req.params.id,
    arguments: req.body.data,
  });
  // Does not redirect if the POST request is made using Javascript
  res.json({ id: job.id });
});

router.post("/job/perform-action/:id", ensureAuth, async (req, res) => {
  let job = await workQueue.add({ id: req.params.id, type: req.body.type });
  res.json({ id: job.id });
});

现在,我对这两个请求使用相同的Queue。

const client = require("../config/redis");
let throng = require("throng");
let Queue = require("bull");

let workers = process.env.WEB_CONCURRENCY || 1;
let maxJobsPerWorker = 50;

let workQueue = new Queue("work", client);

function start() {
  workQueue.process(maxJobsPerWorker, __dirname + "/processor.js");
}

throng({ workers, start })

最后是processor.js文件:

const db = require("../config/db");
const scrapperController = require("../controller/scrapperController");
const awsController = require("../controller/awsController");

module.exports = async function (job) {
  // We need to restart the Mongoose process here so it knows what database to search
  db();
  try {
    let scrappedData = null;
    if (job.data.arguments) {
      // With argument, wants to get data
      scrappedData = await scrapperController.getData(
        job.data.filename,
        job.data.arguments
      );

      await awsController.uploadFile(job.data.filename, scrappedData);
      return { value: "Success" };
    } else {
      // With no arguments, whats to perform action
      scrappedData = await scrapperController.performAction(job.data.id);
      return { value: csvFileName };
    }
  } catch (error) {
    return Promise.reject("Unable to scrape data", error);
  }
};

有人知道如何将两个端点分别分配给不同的工作者吗?也许一个工作者被称为“获取信息”,另一个被称为“执行操作”。
我的想法是创建不同的文件,这些文件将引用不同的工作者并链接到不同的处理器文件。
我的另一个想法是完全丢失processor.js文件,并创建做不同事情的sperate worker文件。
我是相当新的工人和他们如何“工作”,所以有一些困难 Package 我的思想围绕他们。
我们非常欢迎对上述代码进行任何其他改进。
谢谢你,谢谢你

ffscu2ro

ffscu2ro1#

我将创建不同的工作队列,因此,

let workQueue = new Queue("work", client);

app.js中,您将拥有

let getInfoQueue = new Queue("getInfo", client);
let doActionQueue = new Queue("doAction", client);

然后按名称调用每个队列,

let getInfoQueue = new Queue("getInfo", client);
let doActionQueue = new Queue("doAction", client);

function start() {
  getInfoQueue.process(maxJobsPerWorker, __dirname + "/getInfo.js");
  doActionQueue.process(maxJobsPerWorker, __dirname + "/doAction.js");
}

或者,您可以直接在.process()方法中运行代码

相关问题