【问题标题】:How to push new request into the queue and send success message that it is done after it pushed to the queue如何将新请求推送到队列中并发送成功消息,在推送到队列后完成
【发布时间】:2019-09-10 12:03:15
【问题描述】:

我有一个处理媒体的微服务,我需要提供我的微服务一次只处理一个请求。所以,我需要使用 Kue 库创建一个队列,如果有新请求,我需要一一推送。一旦第一个请求完成,然后转到下一个请求,但问题是我从未使用过基于队列的处理。请建议我怎么做?

exports['v1'] = (request, response) => {
  /** Image processing and send to s3 */

  const urls = request.body;

  urls.forEach(async url => {
    await bufferConvertUtil
      .buffer(url)
      .then(buffer => {
        return processHelperApp.image(buffer, url);
      })
      .then(data => {
        console.log(data);
      })
      .catch(error => {
        console.log('errr ' + error);
        fs.appendFile('log.txt', `"${url}",\n`, (err, data) => {
          if (err) console.log(err);

        });
      });
  });

  responseUtil.success(response, 'done');
};

我需要使用 kue 或 rabbitmq 库将新请求添加到队列中。一旦一个队列完成,然后处理,然后处理下一个请求。

【问题讨论】:

    标签: javascript node.js express rabbitmq kue


    【解决方案1】:

    执行此操作的最佳方法是使用本机 for 循环并等待所有进程。像这样:

    function addErrorToLog(url) {
        return new Promise((resolve, reject) => {
            fs.appendFile('log.txt', `"${url}",\n`, (err, data) => {
                if (err) console.log(err);
    
                resolve(err || data);
            });
        });
    }
    
    exports['v1'] = async (request, response) => {
        /** Image processing and send to s3 */
    
        const urls = request.body;
        for (let i = 0; i < urls.length; i++) {
    
            try {
                const url = urls[i];
                const buffer = await bufferConvertUtil
                    .buffer(url)
                const data = await processHelperApp.image(buffer, url);
                console.log(data);
            } catch (error) {
                console.log('errr ' + error);
                await addErrorToLog(url);
            }
        }
    
        responseUtil.success(response, 'done');
    };
    

    这样你可以等到一个操作完成后再处理下一个,我把错误日志放到一个单独的函数中,这样你就可以更容易地在不改变结构的情况下更改代码。

    希望有所帮助!

    【讨论】:

    • 对不起,我不同意,因为在我的情况下,200/秒的请求即将到来,我无法通过这种方式处理。但感谢您的重播
    【解决方案2】:

    最后我通过 kue 库完成了这项工作。很简单,反正看我的代码

    `
    
    
     const kue = require('kue')
        const queue = kue.createQueue();
    
        exports['v1'] = (request, response) => {
        // This is to push the data
        queue.create('key_name', {
          your_key: your_val
        })
    
        // do the stuff the queue data
        queue.process('key_name', (job, done())=>{
          your_task_funtion(job.data, cb)  // job.data will fetch your data witch you have stored into the queue
        })
        }
    

    `

    【讨论】:

      猜你喜欢
      • 2016-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 2022-06-16
      • 1970-01-01
      • 2016-05-02
      相关资源
      最近更新 更多