Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 从已完成的作业中检索结果的推荐方法是什么?_Node.js_Express_Bullmq - Fatal编程技术网

Node.js 从已完成的作业中检索结果的推荐方法是什么?

Node.js 从已完成的作业中检索结果的推荐方法是什么?,node.js,express,bullmq,Node.js,Express,Bullmq,我使用BullMQ和express server异步处理作业,但对如何从已完成的作业中检索结果感到困惑 我目前正在做的是侦听作业完成状态事件,并将这些结果存储在以作业Id为键的对象中,并在需要时从该对象检索结果。有推荐的方法吗 我查看了,但找不到有关如何检索结果的任何信息 以下是示例代码: server.js // Kick off a new job by adding it to the work queue app.post("/api/submitjob", asyn

我使用BullMQ和express server异步处理作业,但对如何从已完成的作业中检索结果感到困惑

我目前正在做的是侦听作业完成状态事件,并将这些结果存储在以作业Id为键的对象中,并在需要时从该对象检索结果。有推荐的方法吗

我查看了,但找不到有关如何检索结果的任何信息

以下是示例代码:

server.js

// Kick off a new job by adding it to the work queue
app.post("/api/submitjob", async (req, res) => {
  let job = await workQueue.add();
  res.json({ id: job.id });
});

app.get("/api/jobstatus/:id", async (req, res) => {
  let id = req.params.id;
  let job = await workQueue.getJob(id);

  if (job === null) {
    res.status(404).end();
  } else {
    let state = await job.getState();
    let reason = job.failedReason;
    res.json({ id, state, progress, reason, result: jobIdResultMap[id] });
  }
});

// You can listen to global events to get notified when jobs are processed
workQueue.on('global:completed', (jobId, result) => {
  logger.log('info', `${jobId} succesfully completed`);
  jobIdResultMap[jobId] = JSON.parse(result);
});

app.listen(PORT, () => console.log(`✅  API Server started: http://${HOST}:${PORT}/api/v1/endpoint`));
worker.js:

let throng = require("throng");
let Queue = require("bull");

// Connect to a local redis instance locally, and the Heroku-provided URL in production
let REDIS_URL = process.env.REDIS_URL || "redis://127.0.0.1:6379";

// Spin up multiple processes to handle jobs to take advantage of more CPU cores
// See: https://devcenter.heroku.com/articles/node-concurrency for more info
let workers = process.env.WEB_CONCURRENCY || 2;

// The maximum number of jobs each worker should process at once. This will need
// to be tuned for your application. If each job is mostly waiting on network
// responses it can be much higher. If each job is CPU-intensive, it might need
// to be much lower.
let maxJobsPerWorker = 50;

function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

function start() {
  // Connect to the named work queue
  let workQueue = new Queue("work", REDIS_URL);

  workQueue.process(maxJobsPerWorker, async (job) => {
    // This is an example job that just slowly reports on progress
    // while doing no work. Replace this with your own job logic.
    let progress = 0;

    await sleep(50);

    // A job can return values that will be stored in Redis as JSON
    // This return value is unused in this demo application.
    return { value: "This will be stored" };
  });
}

// Initialize the clustered worker process
// See: https://devcenter.heroku.com/articles/node-concurrency for more info
throng({ workers, start });

推荐的方法是使用作业队列和消息队列

在编写BullMQ的文档时,它是不完整的,因此您应该 看看Bull的文档

从文件中-

返回作业完成情况

// Kick off a new job by adding it to the work queue
app.post("/api/submitjob", async (req, res) => {
  let job = await workQueue.add();
  res.json({ id: job.id });
});

app.get("/api/jobstatus/:id", async (req, res) => {
  let id = req.params.id;
  let job = await workQueue.getJob(id);

  if (job === null) {
    res.status(404).end();
  } else {
    let state = await job.getState();
    let reason = job.failedReason;
    res.json({ id, state, progress, reason, result: jobIdResultMap[id] });
  }
});

// You can listen to global events to get notified when jobs are processed
workQueue.on('global:completed', (jobId, result) => {
  logger.log('info', `${jobId} succesfully completed`);
  jobIdResultMap[jobId] = JSON.parse(result);
});

app.listen(PORT, () => console.log(`✅  API Server started: http://${HOST}:${PORT}/api/v1/endpoint`));
一种常见的模式是,您有一个队列处理器集群,它们以尽可能快的速度处理作业,还有一些其他服务需要获取这些处理器的结果并对其进行处理,可能将结果存储在数据库中

实现这一点的最健壮和可扩展的方法是将标准作业队列与消息队列模式相结合:服务只需打开作业队列并向其中添加作业,即可将作业发送到集群,集群将以尽可能快的速度开始处理。每次集群中的作业完成时,都会向结果消息队列发送一条消息,其中包含结果数据,并且其他一些将结果存储在数据库中的服务会侦听该队列