2011-10-12 57 views
5

我正在使用RabbitMQ讓工作進程編碼視頻文件。我想知道所有文件何時完成 - 即所有工作進程何時完成。如何知道一組RabbitMQ任務何時完成?

我能想到的唯一方法就是使用數據庫。當視頻編碼完成:

UPDATE videos SET status = 'complete' WHERE filename = 'foo.wmv' 
-- etc etc etc as each worker finishes -- 

然後檢查是否所有的影片已編碼:

SELECT count(*) FROM videos WHERE status != 'complete' 

但是如果我要做到這一點,那麼我覺得我我失去了RabbitMQ作爲多個分佈式工作進程機制的好處,因爲我仍然需要手動維護一個數據庫隊列。

有沒有RabbitMQ依賴關係的標準機制?也就是說,「等待這5項任務完成,一旦完成,然後開始一項新任務?」

我不希望有一個父進程將這些任務添加到隊列,然後「等待」每個人返回一個「完成」的狀態。然後,我必須爲每組視頻保留一個單獨的流程,此時與獨立的ThreadPool概念相比,我已經失去了解耦的工作流程的優勢。

我在問一些不可能的事嗎?或者,是否有標準的廣泛採用的解決方案來管理我錯過的隊列中的任務總體狀態?

編輯:搜索之後,我發現這個類似的問題:Getting result of a long running task with RabbitMQ

有什麼特別的想法,人們對這個?

回答

5

使用「響應」隊列。我不知道RabbitMQ的任何細節,所以這是一般:

  • 有你的父進程發送請求和跟蹤它發送多少
  • 讓父進程也等待一個特定的響應隊列(孩子們知道)
  • 每當孩子完成的東西(或不能完成出於某種原因),將消息發送到響應隊列
  • 每當numSent == numResponded,大功告成

需要記住的是超時 - 如果子進程死亡會發生什麼?你必須做更多的工作,但基本上:

  • 隨着每個發送的消息,包括某種類型的ID,並將該ID和當前時間添加到散列表。
  • 對於每一個反應,從哈希表中刪除ID
  • 定期走哈希表,並刪除任何已超時

這就是所謂的Request Reply Pattern

+0

贊成引用模式名稱。 –

1

我已經實現了一個工作流程狀態機作爲一系列隊列實現的工作流程。工作人員在一個隊列上接收消息,處理該工作,然後將相同的消息發佈到另一個隊列中。然後另一種類型的工作進程接收該消息等。

就你而言,聽起來像你需要實現Enterprise Integration Patterns(這是一本免費的在線書籍)中的一種模式,並且有一個簡單的工作人員收集消息直到完成一組工作,然後將單個消息處理爲代表工作流中下一步的隊列。

相關問題