后台任务阻止线程

时间:2015-09-02 18:45:03

标签: node.js mongodb asynchronous q polling

我希望在我的后端 Node.js 应用程序(提供金融市场数据)中收集后台任务(最多可能需要几分钟)将数据导入MongoDB数据库。稍后,我还想在每次轮询更新时提供推送通知。因此,我希望将投票保留在服务中。

问题是后台任务阻止了单个线程。在praxis中,该服务的其他功能被阻止。我目前正在考虑不同的解决方案,需要帮助选择正确的方法或不同的方法。

  • 将服务扩展到多个实例
  • 使用Q或其他承诺框架
  • 使用process.nextTick
  • 使用async框架进行循环
  • 将轮询拖到其他服务
  • 使用与Node.js不同的内容

如果不是完全不同的话,哪种方法是首选方法?

这是起点(我还没有进行任何优化)

我尝试了repeat模块,该模块采用一个简单的函数来执行计划任务。

require('repeat')(require('./lib/tasks/PollerTask.js')).every(1, 'm').start.now();

下面你看到我正在执行的实际任务。

//...
// PollerTask.js
var providers = require('fs').readdirSync('./lib/providers').map(function (provider) {
    return require('../providers/' + provider);
});

module.exports = function() {

    // For all data providers
    _.each(providers, function (provider, done) {

        // Find all financial assets that use the data provider 
        Asset.find({ provider: provider.name }, function (err, assets) {
            // ... handle error

            // For all the assets, perform a request against the provider
            provider.getQuotes(assets, function (err, quotes) {
                // ... handle error

                // For each new quote (1 quote =^ 1 asset) 
                _.each(quotes, function (quote, done) {

                    // Append the new quote to the asset document
                    Asset.findOneAndUpdate(quote.asset,
                        { $push : { quotes : quote.quote }},
                        { safe: true, upsert: true },
                        function (err, asset) {

                            // done, notify any subscribers
                        });
                });
            });
        });
    });
}

0 个答案:

没有答案