2014-07-14 58 views
5

我需要一個大型動態任務集合的日程安排程序。目前我正在尋找resque-scheduler,rufus-schedulerclockwork。對於選擇使用哪一個(或哪種替代方法)的建議,我將不勝感激。Ruby中的大規模日程安排

一些細節:

  • 有一個大的採集任務(最多100K)要定期執行。
  • 最短執行時間爲1小時。
  • 新任務可能會不時出現。現有任務可能會更改或刪除。
  • 調度延遲最小化在這裏不是任務關鍵(可擴展性和可持續性是最重要的)。
  • 任務執行不是一項繁重的操作,而且可以很容易地並行。

彙總,我需要的東西比如cron對於Ruby項目,可處理的任務大,動態變化的集合。

更新:我花了一天的時間安排庫實驗,現在我想簡要總結一下新獲得的經驗。

我已經停止了我的注意,在發條和resque調度庫,因爲這些都是更詳細的文檔更成熟的項目。 Resque-scheduler基於rufus-scheduler,而Clockwork則受其啓發,兩者都可用於我正在尋找的解決方案。

兩者都是獨立的服務,應該在單獨的進程中運行,它可以處理幾乎無限量的計劃用於單個或循環執行的任務。任務在線程內執行。

發條優點:

  • 它從數據庫中加載預定任務的能力(通過ActiveRecord的或任意的源)。
  • 此外,它可以通過輪詢來自數據庫的數據更新來動態更新計劃任務。

發條缺點:

  • DB查詢是這裏一個潛在的瓶頸。
  • 輪詢間隔爲1分鐘(加上重新計劃所有任務的時間),這有點太慢了。
  • 計劃任務尋址(未計劃或更改)沒有記錄,這就是爲什麼使用此功能看起來像一個黑客。

我已經爲Clockwork(這是控制調度的gem的核心部分)實現了一個替代Manager類,允許通過ZeroMQ消息進行調度控制。因此,我的項目中的主要服務可以向調度程序發送命令,例如「每天運行此任務」或「取消調度任務#10」,並且調度程序立即執行每個請求。

我對resque-scheduler的經驗不多,但在這一點上它看起來像是一個更好的解決方案。

resque調度優點:

  • Redis的基於持久性。該手冊聲稱,服務重新啓動後可以挽救計劃任務。
  • 使用乾淨的API進行動態調度。您只需致電Resque.remove_schedule(name)即可放棄特定任務。
  • Web UI。不太重要,但很高興有。

resque調度:

  • 它需要安裝Redis的。

在仔細觀察後可能會出現其他的東西,但目前沒有別的東西。

這就是我現在擁有的。順便說一句,我已經發布了一些鏈接到計劃相關的Ruby寶石on GitHub

+0

嘿,有什麼像Resque.list_all_schedule? –

回答

4

在某種程度上純調度器。無論何時由Crond支持,所以它是穩定的(但作業將在不同的進程中執行)。在Ruby過程中,Rufus調度程序和Clockwork類似,調度程序(Clockwork受Rufus調度程序啓發)。

Resque-scheduler(https://github.com/resque/resque-scheduler)建立在Resque(任務管理)和rufus-scheduler(調度管理)之上。

你也應該看看Sidekiq(http://sidekiq.org/)。看看https://www.google.com/?q=sidekiq%20scheduler#q=sidekiq+scheduler

因此,瞭解Resque和Sidekiq,然後查看可用的調度程序。如果沒有適合你的東西,看看調度器(每當rufus-scheduler,Clockwork,...)自己,也許你可以在它們之上構建它們。

+0

[RabbitMQ](http://www.rabbitmq.com/)也值得一試。 – tadman