2017-07-31 87 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