2012-04-16 66 views
12

我正在尋找一個可擴展的「at」替代,具有高可用性。它必須支持在運行時添加和刪除作業。尋找一個可擴展的「在」實施

一些背景: 我有一個應用程序,我觸發數百萬事件,每個事件只發生一次。我不需要機制(本月的第一個星期日等),只需日期,時間和上下文。

目前我使用的是Quartz scheduler,雖然它是一個非常好的項目,但它仍然很難處理我們拋出的事件數量,即使經過大量調整(分片,增加輪詢間隔等)。 )由於它在下劃線數據庫上執行的基本鎖定。而且,對我們來說這有點矯枉過正,因爲基本上我們有數百萬次的一次觸發器,而且工作量相對較少。

我會很感激任何建議

+0

什麼是圍繞失敗你的要求?例如,如果一臺機器出現故障,您是否希望在更換時出現「錯過」事件? – 2012-04-16 06:26:41

+0

是的,類似於石英。另外,我在一個集羣中運行Quartz,所以總是有一個熱機等待(在Quartz中,每次需要輪詢數據庫以查找作業時,所有節點都會競爭) – 2012-04-16 06:29:10

+0

我只是想知道,如果不使用Quartz,我們可以做些簡單的事情。如果每項工作都必須得到承認,那就更加棘手。如果一份工作運行兩次,懲罰是多少? (例如,您是否承認所有在最後一分鐘執行的作業,每分鐘一次? – 2012-04-16 06:33:44

回答

0

也許只是使用JGroupsshared tree與執行時間排序的任務。節點將採取第一個任務和計劃計時器,該計時器將在給定時間執行。在任務刪除計時器可以取消。因此基本上你只能使用JGroups和簡單的java定時器/執行器。

我也沒有看過完整的,但這裏是一些proof of concept or maybe even solution

0

如何有關Java定時器?

import java.util.*; 

public class MyTask extends TimerTask{ 
    public void run(){ 
     System.out.println("do it!"); 
    } 
} 

然後

Timer timer = new Timer(); 

MyTask job1 = new MyTask(); 
// once after 2 seconds 
timer.schedule(job1, 2000); 

job1.cancel(); 

MyTask job2 = new MyTask(); 
// nach each 5 seconds after 1 second 
timer.schedule (job2, 1000, 5000); 
+0

1.它不會在重啓過程中存活; 2.你如何擴展到數百萬個工作崗位?這就是Quartz想要解決的問題 – 2012-06-06 10:00:29

+0

1.你沒有提到持久性是一個需求;你說有相對較少的工作。 – kromit 2012-06-13 13:09:02

+0

我很抱歉,但我確實提到了「高可用性」和「數以百萬計的活動/數百萬次的一次性觸發器」...... – 2012-06-13 18:41:15

1

如果我面臨同樣的情況,我會做以下...

安裝使用隊列複製的JMS隊列集羣(如RabbitMQ的ActiveMQ的或)安裝在幾個盒子上。

在我的高度可用的JMS隊列中激發所有事件。

那我就代碼,彈出JMS隊列的事件需要一個代理應用程序,我可以在多個盒子運行多個代理商,並與正確的JMS故障轉移的URL等結合

您也可以使用同種型號,如果你的工作被解僱的事件......

據透露,在覈心調度的更好的方式Java是如下:

ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(sensibleThreadCount); 
    threadPool.scheduleAtFixedRate(new Runnable() { 

    @Override 
    public void run() { 
     //Pop events from event queue. 
     //Do some stuff with them. 
    } 

    }, initialDelay, period, TimeUnit.X);