我什至不知道這個應該怎麼問,但這裏是我的方案:後臺服務來處理隊列中的請求與node.js的延遲
我對這些不時更新或刷新記錄列表時間。對於其中一些記錄,我想調用API來獲取某個日期。問題是API有一些限制,比如說每小時只有100個電話。
我需要一個機制來:
在後臺運行,並檢查是否有新的記錄處理
,如果有新的記錄它們分割成100塊,然後在每個1小時呼叫每100個記錄
在下次檢查API,如果有新的記錄,它們附加等
在node.js中實現這一點的最佳方法是什麼?
我什至不知道這個應該怎麼問,但這裏是我的方案:後臺服務來處理隊列中的請求與node.js的延遲
我對這些不時更新或刷新記錄列表時間。對於其中一些記錄,我想調用API來獲取某個日期。問題是API有一些限制,比如說每小時只有100個電話。
我需要一個機制來:
在後臺運行,並檢查是否有新的記錄處理
,如果有新的記錄它們分割成100塊,然後在每個1小時呼叫每100個記錄
在下次檢查API,如果有新的記錄,它們附加等
在node.js中實現這一點的最佳方法是什麼?
前提
在內存中保存記錄,特別是當有一個未知量要註冊,是不好的做法。爲了使這個僞示例起作用,您需要這些記錄的所有當前值的集合/表格+它需要有一個字段.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;
})()
希望你會發現這個例子時有用。
謝謝您的詳細解答 – Alin