問題:我有一個進程請求開始,分解成多個級別的隊列/ 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方面擁有豐富經驗的人員可以在縮放/確定流程完成時給予我一些指導。
我認爲JMS總線是一個必然的可擴展性。只是爲了解決MQ的tcp/ip連接限制。唯一的解決辦法是我需要爲每個子級別的處理設置一個主題。還有如何解決相同的問題知道...什麼時候該過程實際完成? mdb不會知道最後一條消息。我想我可以添加標題信息,以便跟蹤它完成的消息數量,就像它正在輪詢一樣。不過,我認爲同樣的問題可能會導致打破這一過程的「丟失信息」情景。但它確實解決了一些問題,是一個有效的選擇。 – haju 2014-09-08 12:53:49
無論如何,必須爲正向路徑處理丟失的消息問題。同樣的解決方案也可以用於此目的。而且,這不僅僅適用於「任務完成」消息。您可以將JMS總線用於子任務的「生命符號」消息,以瞭解它們是否存在。 – 2014-09-08 15:45:16
我想給人們一些時間來看看我的問題。不過,我認爲最好的解決方案是在流程中使用分散的經理。像Spring Integration或Camel一樣。這允許連續過程獨立工作,但允許您根據整個過程允許自定義執行。像電線水龍頭,計數器和狀態。 – haju 2014-09-15 18:55:34