2013-05-08 92 views
0

說我有一個鏈接聚合應用程序,用戶在鏈接上投票。我使用每次鏈接投票時運行的算法生成的熱度分數對鏈接進行排序。然而,在每次投票中運行它似乎過度。我如何限制它,使其運行時間不超過5分鐘。如何執行一段代碼不超過每X分鐘?

回答

1

一)使用cron作業

B)時保留的程序上次運行的時間戳的軌跡,並且在當前的時間戳 - 時間戳已存儲> 5分鐘,然後運行程序和更新的時間戳。

+0

爲什麼要使用cron?讓PHP等其他語言的cron。 node.js不間斷地運行你的進程,所以你可以使用setTimeout。 – coma 2013-05-08 20:50:19

+0

@coma如果你想要執行多次代碼,你可能想使用'setInterval'而不是'setTimeout' ... – War10ck 2013-05-08 20:53:06

+0

不,請觀看http://www.youtube.com/watch?feature= player_detailpage&v = i_qE1iAmjFg#t = 462s – coma 2013-05-08 21:02:08

1
var yourVoteStuff = function() { 

    ... 

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

yourVoteStuff(); 

在問爲什麼不使用setTimeinterval之前,請閱讀下面的註釋。

爲什麼「爲什麼setTimeinterval」,而不是「爲什麼cron工作?」?我是那麼錯?

+0

爲什麼不使用'setinterval'? – 2013-05-08 21:05:42

+1

如果你的VoteStuff裏面有東西超過5分鐘,你會遇到麻煩,因爲setTimeinterval會再次調用它,請觀看http://www.youtube.com/watch?feature=player_detailpage&v=i_qE1iAmjFg#t=462s,所以,這個確保這將在最後完成的東西后5分鐘運行。 – coma 2013-05-08 21:08:02

+0

我明白了。很公平! – 2013-05-08 21:36:26

1
  • 首先你建立一個接收器,接收你所有的鏈接提交。
  • 其次,接收推()ES的各個環節(已接收),以 隊列(我強烈建議redis
  • 而且你必須與你的願望的時間間隔循環的聚合。在這個循環中,每個排隊的鏈接應該輪詢()並繼續到您的業務邏輯。

我已將此解決方案用於生產級別,我可以告訴您,縮放比例也很好,因爲它也可以執行。

使用示例;

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); 
} 

乾杯!

+0

看媽媽! setTimeout!,感謝兄弟。 – coma 2013-05-08 22:11:32

+1

讓我們做一個setTimeout運動「setTimeout FTW!」呵呵.. – 2013-05-09 08:20:27