2015-06-04 34 views
1

我有以下任務Rails應用程序中要做到:如何正確使用Resque工人?

  • 下載視頻
  • 修剪與FFMPEG視頻給定的持續時間之間(如:00:02 - 00:09)
  • 將視頻轉換到一個給定的格式
  • 將轉換後的視頻到一個文件夾

因爲我想做到這一點在後臺工作,我用1名resque工人,其處理隊列。

對於第一份工作,我創建了這樣 @queue = :download_video,做它的任務,並在我致電Resque.enqueue(ConvertVideo, name, itemId)前進到下一個任務的任務結束的隊列。通過這種方式,我創建了一個隊列,當一個任務完成時隊列就會排隊。

這是非常錯誤的,因爲如果第一份工作開始排隊的其他工作(一個來自另一個),直到排隊作業的第一清單完成了,那麼一切得到的用1名工人。

如何來優化?我試圖增加更多的工人來排隊工作,但結果是錯誤的和不可預測的。

另一個方面,每個作業保存在數據庫中的狀態,我需要的就業機會以正確的順序進行處理。

如果每個工人從上面做的一個作業,並至少有4名工人?如果我把這個數量翻倍到8個工人,這是否會有所改進?

回答

0

你有沒有考慮過使用sidekiq

如Sidekiq文檔中所述:

resque使用redis的用於存儲和在單線程處理處理消息。 Redis的要求,使得它更有點難以成立,相比delayed_job的,但Redis的是要好得多隊列不是一個SQL數據庫。單線程意味着並行處理20個作業需要20個進程,這會佔用大量內存。

sidekiq使用redis在多線程進程中存儲和處理作業。在原始處理速度方面,設置爲resque更容易,但效率更高。你的工人代碼確實需要線程安全。

所以你應該有兩種工作:下載視頻和轉換視頻和任何下載視頻作業應該並行完成(你可以限制,如果你想)然後每個存儲在一個隊列中(「in之間的隊列「),然後由多個轉換作業並行轉換。

我希望幫助,這個鏈接解釋頗佳Sidekiq最佳做法:https://github.com/mperham/sidekiq/wiki/Best-Practices

0

由於@Ghislaindj指出Sidekiq可能是一個選擇 - 主要是因爲它提供了控制執行順序插件。

看到這份名單:

https://github.com/mperham/sidekiq/wiki/Related-Projects#execution-ordering

但是,是的,你應該使用不同的隊列,更多的工人所特有的隊列中。所以,你有一組工人都在:download_video隊列的工作,然後你連接到:convert_video隊列其他工人等

如果你想繼續使用Resque另一種方法是使用延遲執行,所以當你排隊您指定延遲參數的後續作業。

Resque.enqueue_in(10.seconds, ConvertVideo, name, itemId)

的下側,使用在Resque延遲執行的是它需要resque-scheduler包,所以你引入一個新的依賴:

https://github.com/resque/resque-scheduler

爲了比較Sidekiq推遲執行本地可用。

0

您是否考慮過將所有四項任務合併爲一個?在這種情況下,你可以擁有任何數量的工人,一個人可以完成這項工作。它的工作非常可預測,你甚至可以知道完成任務需要多少時間。當其中一個子任務比其他子任務耗時更長時,您也不會遇到任何問題,並且它會堆積在隊列中。