2014-09-05 87 views
0

問題:我有一個進程請求開始,分解成多個級別的隊列/ MDB以加速並行處理。問題是,什麼是最好的方式知道什麼時候每個處理級別完成了一個關閉過程?請記住,我正在處理大量的消息,因此必須考慮性能。JMS - 異步處理 - 處理父/子進程依賴關係

技術堆棧:

  • EJB 3.0 MDB的
  • 休眠4.2.11()
  • 春4.0.1
  • 的WebSphere MQ的
  • 的Oracle 11g數據庫。

解決方案1嘗試:父進程輪詢子進程,直到它在每個子級完成爲止。這意味着一個開放的MDB會話將持續輪詢每個級別的消息的響應隊列,以完成其子進程。

優點:您可以避免不斷地對數據庫進行調用以確定「我是否已完成」。

缺點:

  • 該解決方案保持一致的開放輸入連接到MQ在等待和過程投票來完成。在縮放時,連接數量會增加。
  • 如果有任何消息丟失,它將拋出輪詢機制的計數。不是很可靠。
  • 如果您打開了持久性(您應該最多次),它將重新處理初始請求,因爲它仍然會打開,重新執行整個請求。

解決方案2的提案:

  • 代替使用輪詢機制,使用更多的MDB的每個處理級綁定到響應隊列。一切工作都是孤立的。

如何確定過程是否完成?由於每條消息都會響應MDB,因此可以檢查數據庫狀態表以確定其是否完整。

優勢:

  • 列表項

  • 所有消息孤立地起作用。

  • 更適合支持高可用性和持久性消息。
  • 防止針對MQ的任何長時間運行的打開進程。

缺點:這可能意味着很多調用數據庫來確定完整性。隨着消息數量的增加,我認爲這將是一個主要的可擴展性問題。

我沒有使用Spring批處理和Spring集成很多,但也許這是我應該尋找解決方案。希望在消息流的MDB和MQ方面擁有豐富經驗的人員可以在縮放/確定流程完成時給予我一些指導。

回答

0

一個不同的解決方案是使用JMS總線爲孩子們通知父進程,當他們的子任務完成。架構看起來像這樣。

  • 家長有一個需要完成的子任務(帶有ID)列表。
  • MQ中兒童可以發佈完成狀態的新主題。
  • 綁定到更新父級的完成狀態主題的新MDB(例如,從列表中刪除已完成的任務)。
  • 當收到所有子任務的完成狀態時,父項完成。

這樣一來,由於對子項(解決方案1)或數據庫(解決方案2)進行輪詢,沒有額外的負載。

這也可以讓你擴展架構來引入更復雜的控制機制。對於例如您可以監視任務的進度/確保其中沒有一個通過從兒童向狀態主題發佈定期進度消息而崩潰。

+0

我認爲JMS總線是一個必然的可擴展性。只是爲了解決MQ的tcp/ip連接限制。唯一的解決辦法是我需要爲每個子級別的處理設置一個主題。還有如何解決相同的問題知道...什麼時候該過程實際完成? mdb不會知道最後一條消息。我想我可以添加標題信息,以便跟蹤它完成的消息數量,就像它正在輪詢一樣。不過,我認爲同樣的問題可能會導致打破這一過程的「丟失信息」情景。但它確實解決了一些問題,是一個有效的選擇。 – haju 2014-09-08 12:53:49

+0

無論如何,必須爲正向路徑處理丟失的消息問題。同樣的解決方案也可以用於此目的。而且,這不僅僅適用於「任務完成」消息。您可以將JMS總線用於子任務的「生命符號」消息,以瞭解它們是否存在。 – 2014-09-08 15:45:16

+0

我想給人們一些時間來看看我的問題。不過,我認爲最好的解決方案是在流程中使用分散的經理。像Spring Integration或Camel一樣。這允許連續過程獨立工作,但允許您根據整個過程允許自定義執行。像電線水龍頭,計數器和狀態。 – haju 2014-09-15 18:55:34