2011-06-05 168 views
1

我正在構建一個將從遠程網站獲取並重新驗證信息的工作。我實際上已經實現了一個隊列,它的工作原理是這樣的: 讀取文本文件,然後切片成5k的增量並交給線程處理器,然後退出並生成新的工作器。Rails隊列管理

我正在研究resque,但有一個類似這樣的問題的一般設計問題。因此,如果我有一份可能需要5-20M單位工作的工作,那麼存儲隊列的最佳做法是什麼?例如,我理論上可以將工作分解並存儲起來,然後爲該大塊創建工作,或者我可以在隊列中擁有5-20M個別訂單項。看起來好像在獲取/重新生成的工作中有很多開銷。但是,也有體面的開銷和更多的編碼,試圖分塊工作。

+0

請問這個遠程網站對你的感覺讓20M的要求? – 2011-06-05 21:30:35

+0

它在技術上是一個API,所以有堅持的限制。 – 2011-06-05 21:46:11

回答

1

根據我們所做的和看到的,一個好方法是在運行時分塊工作,而不是之前。換句話說,主/從模式是事件或時間驅動的,主模塊在隊列和運行時將工作/數據空間分割成細粒度的任務/塊。

這樣做的原因是,在粗糧級別完成時,查看計劃中的作業要容易得多。在此級別,作業對應於您正在跟蹤的單元(例如網頁,用戶配置文件或來自傳感器的流式傳輸數據)。

我們經常看到在精細粒度級別切片,但接着看到每個工作人員都在合理收集任務。我們發現,有每個工作進程多個任務(20-1000取決於任務的類型/長度?)提供之間的良好平衡:

  • 優化設置(建立例如數據庫連接)
  • 提供了良好的自省到工作
  • 使重試和異常處理更易於管理

你會想爲每個工人的處理時間在幾分鐘而不是長時間運行的任務,只是讓你有更多的可視性工人表現等等重試隻影響有限的工作空間。使用NoSQL解決方案(尤其是像MongoHQ或MongoLabs這樣的數據庫即服務的解決方案)可以讓您輕鬆跟蹤和管理分塊和正在進行的工作。

另一個建議是創建獨立於您的應用程序環境的工作人員。這意味着要將每個工作人員編寫爲合理自包含的,以及使用回調函數,數據庫標誌和其他異步方法。它可能稍微有點多,但就像MVC應用程序設計一樣,它可以提供更大的靈活性,並允許將工作分佈在彈性工作系統上。

(全面披露:我對球隊在Iron.io,IronMQ,聯合衝剪機,並IronCache的製造商)