【问题标题】:Queue System for NodeJS API CallsNodeJS API 调用的队列系统
【发布时间】:2020-12-06 21:36:39
【问题描述】:

我正在构建一个 NodeJS 应用程序。应用程序会收到 API 调用,然后根据收到的消息,它会做一些事情。

我需要一些可以在几分钟内处理 1000 个 API 调用而不会使我的 NodeJS 崩溃的东西。它必须对 API 调用进行排队,然后执行它必须执行的操作。如果服务器崩溃,当它重新启动时,队列必须继续工作。

很抱歉,我是编程新手,我不知道还有哪些其他可用的替代方案。我已经阅读了有关 RabbitMQ 的信息,但我的雇主想要一些可以免费实施的东西,并且拒绝为我提供这方面的任何专业知识。

【问题讨论】:

  • 我不清楚您的用例是什么意思。传入的 API 调用是设置批处理作业还是其他一些耗时的操作?您的系统能否在几分钟内处理 1000 个 api 调用取决于这些调用触发了什么。因此,要获得这个问题的答案,您将不得不详细说明您的用例。

标签: node.js


【解决方案1】:

查看Bull。这是一个基于Redis 的作业队列,几乎可以完成您提到的工作 - 它允许您将作业添加到队列并继续您的控制流。作业队列然后一项一项地处理项目。对于某些上下文,我在下面附上了一个简短的 sn-p。

const Bull = require('bull');

// This looks for a Redis server running at port 6379 on your local machine by default

const jobQueue = new Bull("my_job_queue")

app.post("/doSomething", (req, res) => {
    const { taskObj } = req.body;

    // This is non blocking
    jobQueue.add(taskObj);

    // Then, just return
    res.status(200).json({
        "message": "We're on it!",
        "something else": "We'll get back to you soon :)"
    });

});

jobQueue.process((job, done) => {

    // This runs per job

    const doSomething = (jobData) => {
        return new Promise((resolve, reject) => {
            console.log(JSON.stringify(jobData));
            resolve(true);
        })
    }

    const { data } = job;
    await doSomething(data);
    // Wait to finish doing something with the data, and then move on
    done();
    
});

【讨论】:

    猜你喜欢
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 2011-06-24
    • 2012-02-16
    • 2011-01-18
    • 1970-01-01
    相关资源
    最近更新 更多