我希望在我的后端 Node.js 应用程序(提供金融市场数据)中收集后台任务(最多可能需要几分钟)将数据导入MongoDB数据库。稍后,我还想在每次轮询更新时提供推送通知。因此,我希望将投票保留在服务中。
问题是后台任务阻止了单个线程。在praxis中,该服务的其他功能被阻止。我目前正在考虑不同的解决方案,需要帮助选择正确的方法或不同的方法。
Q
或其他承诺框架process.nextTick
async
框架进行循环如果不是完全不同的话,哪种方法是首选方法?
这是起点(我还没有进行任何优化)
我尝试了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
});
});
});
});
});
}