2017-07-31 91 views
0

我什至不知道这个应该怎么问,但这里是我的方案:后台服务来处理队列中的请求与node.js的延迟

我对这些不时更新或刷新记录列表时间。对于其中一些记录,我想调用API来获取某个日期。问题是API有一些限制,比如说每小时只有100个电话。

我需要一个机制来:

  • 在后台运行,并检查是否有新的记录处理

  • ,如果有新的记录它们分割成100块,然后在每个1小时呼叫每100个记录

  • 在下次检查API,如果有新的记录,它们附加等

在node.js中实现这一点的最佳方法是什么?

回答

0

前提

在内存中保存记录,特别是当有一个未知量要注册,是不好的做法。为了使这个伪示例起作用,您需要这些记录的所有当前值的集合/表格+它需要有一个字段.isChecked=false。这样数据库查询将返回前100个未经检查的记录,我们不需要在应用程序级别进行管理。


首先,我们需要一个调度程序,以便每隔1小时完全触发一次任务。为此,我们将利用时钟守护作业npm install cron文档可以发现here

创建3个文件:API.js,checker.js,cron.js

cron.js - 调度程序文件(最好触发后应用程序启动)

let CronJob = require('cron').CronJob; 
let DB = require('some-DB'); 

let APIChecker = require('./checker.js'); 
let APICheckerInstance = APIChecker({url: "http://my-api.com"}); 

var job = new CronJob('00 00 * * * *', function() { 
    //exeute script for every hour (00 secod mark, 0 minute mark, every hour) 
    let records = DB.get("records which have isChecked=false").toArray(); //pseudo code 
    APIChecker.check(records, function (err, result=null) { 
     // handle callback/ can return results or error 
     // DB.massUpdate(result) 
    }) 
}, function() { 
    console.log("Job has finished"); 
}); 

chcker.js - 逻辑,用于检查/修改数据

'use strict'; 

const 
    util = require('util'), 
    API = require('./api.js'); 

module.exports = function (options) { 

    function MyAPIChecker (options) { 
     this.result = []; 
     API.call(this, options); 
    } 

    util.inherits(MyAPIChecker, API); 

    MyAPIChecker.prototype.check = function (records, callback) { 
     this.result = []; 
     let temp = records.length; 

     for(let i = 0; i < records.length; i++) { 
      this.makeRequest(records[i]) 
       .then(result => { 
        records[i].isChecked = true; 
        // add stuff from result 
        // or return stuff with callback for processing 
        if (!--temp) return callback(null, records) 
       }) 
     } 
    } 
    return new MyAPIChecker(options); 
} 

api.js - API保留HTTP请求

'use strict'; 

const 
    request = require('your-request-lib'); 

module.exports = (function() { 

    function API (options) { 
     this.options = options; 
    } 

    API.prototype.prepareRequest = function (record) { 
     // prepare http(s) options; 
     // get URL and such from this.options (pass it to the constructor) 
     // use record data 
     return options 
    } 

    API.prototype.makeRequest = function (record) { 
     let opts = this.prepareRequest(record); 
     // or any other verb 
     return request.get(opts); 
    } 

    return API; 
})() 

希望你会发现这个例子时有用。

+0

谢谢您的详细解答 – Alin