2012-06-01 19 views
2

我在我的MySQL數據庫中有一個包含200K記錄的表。每條記錄都包含一個應以某種方式處理的URL。在我的情況下,URL處理並不是一項簡單的任務,所以我選擇使用Gearman隊列將它們作爲後臺作業運行。如何使用Gearman實現循環任務列表?

所以,在我的表中的每一條記錄(URL)我打算創建單獨的任務,並將其提供給Gearman的。

此外,我的表格中的數據不是靜態的,通常會在那裏添加新的URL。

根據我的業務邏輯,我需要不斷處理這個網址列表。當我完成數據庫表中最後一條記錄的處理時,我應該移動到第一條記錄,並且應該重複所有記錄的過程。

所以我的問題:

  • 如何更好的供應任務的Gearman在這種情況下?
  • 我應該使用cron還是可以組織邏輯,Gearman會自動執行任務?
  • 一次可以向Gearman提交多少個任務?

所以,請你告訴我如何最好地實現這個系統?

回答

3

聽起來,你需要的是一個隊列,其中加工項目重新添加到隊列的底部。我建議組織的工作流程是這樣的:

  1. 一旦一個新的URL出現在你的系統,把它添加到Gearman的後臺作業隊列。

  2. 在Gearman的工人執行,一旦處理作業,重新將其加入到隊列中。

通過這種方式,您將會按照它們被添加到隊列中的順序不斷處理URL,並且整個隊列將被無限重申。當然,這假設你重複執行一項任務。

如果有超過1個任務(例如,首先,在所有URL上執行任務#1,然後執行任務#2等),則可以遵循類似的模式,只需將作業發送到第二個隊列)在第一個任務之後。然後,根據您要訂購工作的具體情況,您將自動發現所有事情(如果兩個工作人員都是可用的),或者您需要監控隊列#1,並且只在空的時候啓動工作人員#2 。對於這種監測的詳情,請參閱Any way to access Gearman administration?

一般情況下,使用Gearman可以方便,快捷地處理20萬個項目。現在,使用持久隊列會使事情減慢一點(它本質上是一個MySQL /其他數據庫連接),但不應該做任何可怕的事情。我沒有自己嘗試過,但成功的故事通常涉及更多的項目,並且通常也是一個持續的隊列。

,你需要知道的唯一的事情是,Gearman的不允許處理批量的工作(例如10個項目同時)。在處理網址時,這意味着您需要一次處理1個網址,代價很高,因爲您需要等待每個網址單獨下載。您可以通過使用事件驅動/非阻塞編程語言進行處理來避免它,也可以查看beanstalkd,它允許進行批處理。

+0

非常感謝您的詳細解決方案!還有一個問題 - 我是否應該使用持續排隊員排隊,並且爲他排隊等待200000個任務是一個大問題? – alexanoid

+0

@alexanoid看到我的答案編輯 - 一般來說,不應該有任何問題。 – Aurimas

+0

非常感謝你! – alexanoid