2013-02-20 79 views
0

我的目標是讓系統每隔10分鐘爲37,500個城市廣播一個廣告。大約需要5分鐘爲所有城市進行數據庫查詢,計算和AMQP IO。使用EventMachine定期計時器的可靠計時

代碼大致結構類似:

EventMachine.add_periodic_timer(10 minutes) do 
    the_task_that_takes_five_minutes 
end 

什麼我的發現是,即使計時器設置爲每隔10分鐘並且即使任務需要不到十分鐘的命令火災15分鐘間隔(完成任務所需的時間+ EM週期)。

如果我們假設任務永遠不會超過10分鐘,那麼我將如何確保定時器的週期是無論任務處理時間如何,始終與上次運行完全相距10分鐘?

EM基本上似乎設置了下一個定時器任務運行,而不是之前。

我試過圍繞任務批處理本身的一個簡單的EM.defer。我認爲這將打開設置下一個計時器的線程,但這並不能解決問題。

我可以拿走以下嗎?

def do_stuff 
    EventMachine.add_timer(10 minutes) do 
    do_stuff 
    end 

    the_task_that_takes_five_minutes 
end 

do_stuff 

我知道我可以在Javascript中做這樣的事情,因爲定時器不會在do_stuff調用堆棧內執行。 EventMachine是否屬實?

回答

1

這只是一個想法,但也許計時器可能會觸發該功能只是爲了廣播廣告,而不是做所有的計算。

EventMachine.add_periodic_timer(10 minutes) do 
    ad_broadcasting calculations 
    EM.defer 
    calculations = Calc.new 
    end 
end 

我不知道是否推遲計算會避免EM等待它。

+0

這並不能真正解決問題,因爲我仍然需要每10分鐘進行一次新的計算才能進行廣播,而且我寧願將它安排在Ruby上,而不是像cron工作一樣。 – onyxrev 2013-02-20 09:17:29

+0

據我所知,如果計算時間少於10分鐘,新的*計算*將被廣播。 – Sikian 2013-02-20 13:57:41