2014-01-09 39 views
0

我是新來的Rails和多線程,並且很好奇如何以最優雅的方式實現以下功能。 我找不到任何漂亮的教程,詳細解釋了什麼是以下任務的最佳設計決策:如何創建等待作業並執行它們的工作守護進程?

我有幾個HTTP請求將在後臺爲用戶運行,例如,解析耦合網站,並獲得一些信息,如HTTP響應代碼,響應時間,然後返回結果。出於性能方面的原因,我決定拆分URL的總數來解析每批25個,然後在一個線程中執行每個批處理,加入這些批處理並將結果寫入數據庫。

我決定用下面的寶石(http://rubygems.org/gems/thread),以確保有是同時運行的線程的最大數量。到現在爲止還挺好。

問題是,如果兩個用戶並行開始分析,最大線程數是我的線程池的最大值的兩倍。

我的解決方案(imho)是創建一個自己運行並等待來自客戶端的作業的工作守護進程。

我的問題是,什麼是最好的方式來實現這個在Rails中?

也許創建一個Rake任務,並把它作爲一個守護進程(請參見:「Daemoninsing a rake task」)以及(如何?)增加就業機會呢?

非常感謝您提前!

回答

0

我會建立在數據庫中的表隊列,有點代碼,定期由cron啓動,該走該表,傳遞請求Typhoeus and Hydra

下面是筆者總結如何創業板:

像100蛇頭神獸的現代代碼版本,百頭巨怪並行運行HTTP請求,同時清晰地封裝處理邏輯。

隨着用戶添加請求,將它們添加到表中。你需要像這樣的字段:

  • 一個「已處理」字段,所以你可以告訴哪些系統處理失敗。
  • 「成功」字段,您可以知道哪些請求已成功處理,因此如果失敗,可以重試。
  • 「retry_count」字段,因此您可以重試「n」次,然後將該URL標記爲無法訪問。
  • 「next_scan_time」字段說明何時應該再次掃描URL,因此您不會通過連續點擊該網站來DOS網站。

Typhoeus和Hydra很容易使用,並且可以很容易地處理多個請求。

+0

喜田滿,這看起來很有希望。我會閱讀並明天給你反饋! P.S .:感謝您糾正/澄清我可憐的英語。 :) – madhippie

+0

我擺弄這個寶石,我很滿意。 Typhoeus和Hydra完全符合我的要求!非常感謝你。 – madhippie

+0

感謝作者的寶石。這是一個非常好的工具。 –

0

有一堆Rails庫可以爲你管理長時間運行的後臺作業隊列。這裏有幾個:

  • Sidekiq使用Redis進行作業存儲並支持多個工作線程。
  • Resque也使用Redis和單個工作線程。
  • delayed_job通過ActiveRecord(或Mongoid)管理作業隊列。

一旦你選擇了一個,我建議使用Foreman來簡化一次啓動多個守護進程。

+0

感謝您輸入有趣的內容 - 我會閱讀並明天給您反饋。 :) – madhippie

相關問題