2011-11-02 148 views
1

我目前正在處理一個需要處理大量重複作業的項目。基本上,當一項工作完成後,我想在15分鐘後再次開始工作。可擴展的動態作業隊列處理

作業集隨着時間的推移而動態變化,因此我需要監視新的和刪除的作業。 每個工作都需要一些時間來處理,因此我需要能夠擴展。我將有一個網站作爲管理這些工作的前端。

我正在考慮使用MongoDB(與分片)來存儲作業。 然後,我可以創建一個「作業代理」來經常查詢數據庫,以查看是否有任何作業已準備好並使用,例如, RabbitMQ開始對一組工作者開展工作。

有與設置雖然一些非常明顯的問題:

  • 「作業代理」是一個非常頻繁的基礎上的瓶頸和單點故障
  • 查詢的MongoDB潛在的巨大收集似乎是一個不好的解

我不受這項技術的限制,但我根本不知道如何爲此設計架構。有任何想法嗎?

回答

0

使用AMQP。對於每種類型的工作人員,都有一個通過消息向該工作人員提供作業的隊列。但是添加另一個工人類型,延遲器。

每位工作人員都會收到一條消息,完成工作,確認其消息並向延遲器發送消息。

延遲器有點不同,因爲它會得到一條消息,延遲15分鐘,然後將消息發送回源工作者,然後確認消息。因爲延遲本質上是阻塞的,所以你應該有很多延遲進程,這樣消息就不會在隊列中延遲,但只有當它們在延遲器的手中時纔會延遲。

+0

謝謝邁克爾。我有一個使用AMQP實現的原型,分佈式鎖定和包含作業的共享數據庫。 每個工人都充當入場者和處理者。當工作人員獲得分佈式鎖時,它會在數據庫中找到準備處理的作業,在作業上設置處理標誌,並通過AMQP發送消息。當工作人員完成一項工作的處理時,它會用新的時間戳修改數據庫。 因此,我沒有單點失敗。 – kfuglsang

1

您可能會考慮的一個選項是beanstalkd。它是一個支持優先級和延遲執行的工作隊列。後者功能可能對您所需要的功能非常有用。它允許您將作業提交到隊列中,該隊列將不會被工作人員用於指定的秒數。您可以使用此功能重新提交將在15分鐘後使用的作業。

這裏有幾乎所有語言的客戶端庫。請參閱list。該協議簡單易用。

我們在工作中使用它,並在幾百個工作中填充排隊,沒有問題。事實上,我不記得在使用超過2年的時間裏有過穩定性問題。