0

假设我有一个链接聚合应用程序,用户可以在其中对链接进行投票。我使用算法生成的热度分数对链接进行排序,该算法在对链接进行投票时运行。然而,每次投票都运行它似乎过分了。我如何限制它,使其运行不超过每 5 分钟一次。

4

3 回答 3

1

a) 使用 cron 作业

b) 跟踪上次运行程序时的时间戳,以及当当前时间戳 - 您存储的时间戳 > 5 分钟时,然后运行程序并更新时间戳。

于 2013-05-08T20:11:19.923 回答
1
  • 首先,您构建一个接收器来接收您提交的所有链接。
  • 其次,接收者将每个链接(已接收)推送()到队列(我强烈推荐redis
  • 此外,您有一个聚合器,它以您想要的时间间隔循环。在这个循环中,每个排队的链接都应该被 poll()ed 并继续你的业务逻辑。

我已将此解决方案用于生产级别,我可以告诉您,它的扩展性和性能都很好。

使用示例;

var MIN = 5; // don't run aggregation for short queue, saves resources
var THROTTLE = 10; // aggregation/sec
var queue = [];
var bucket = [];
var interval = 1000; // 1sec

flow.on("submission", function(link) {
    queue.push(link);
});

___aggregationLoop(interval);
function ___aggregationLoop(interval) {
    setTimeout(function() {
        bucket = [];
        if(queue.length<=MIN) {
            ___aggregationLoop(100); // intensive
            return;
        }
        for(var i=0; i<THROTTLE; ++i) {
            (function(index) {
                bucket.push(this);
            }).call(queue.pop(), i);
        }
        ___aggregationLoop(interval);
    }, interval);
}

干杯!

于 2013-05-08T21:53:31.280 回答
1
var yourVoteStuff = function() { 

    ...

    setTimeout(yourVoteStuff, 5 * 60 * 1000);
};

yourVoteStuff();

在问为什么不使用 setTimeinterval 之前,请阅读下面的评论。

为什么“为什么要设置时间间隔”而不是“为什么要 cron 工作?”?,我错了吗?

于 2013-05-08T20:46:46.363 回答