2010-08-17 90 views
2

我有一個模塊,它在JVM(無容器)中獨立運行,並通過JMS與其他模塊通信。 我的模塊既是一個隊列中的生產者又是另一個隊列中的消費者。 因此,我需要將這個模塊集羣化,既出於HA原因,又出於工作負載的原因,我可能會使用Terracotta + Hibernate來集成我的實體。 目前,當我的應用程序啓動時,它啓動一個線程(通過Executors.newSingleThreadExecutor())作爲消費者(我可以附上實際的代碼示例,如果相關和必要的話)。模塊集羣和JMS

我從這裏閱讀理解的問題是什麼,如果我剛開始我的模塊上N不同JVMs然後N不同的用戶將被創建隊列中的每個消息將到達N用戶。 我想要做的是隻有其中一個(讓我們現在說哪一個不重要)處理該消息,因此實際上使我能夠一次處理N消息。

該怎麼做/應該這樣做?我離開賽道嗎?

順便說一句,我使用OpenMQ作爲我的實現,但我不知道這是否相關。

感謝您的任何幫助

回答

1

羣集環境中的消息處理的經典案例。這是我會做的。

使用廣播消息(基於通道)代替隊列。隊列對於點對點通信是非常有用的。設置消息的有效性,直到其消費者消費的時間。這樣,其他消費者甚至不會看到消息,只有一個消費者會消費它。

+0

嗨Tushar,謝謝你的幫助。 什麼是廣播消息?它是在JMS隊列上發送的不同類型的消息嗎?另外你的意思是:「隊列對點對點通信有用」不是很有效「? 謝謝 – Ittai 2010-08-17 10:41:05

+0

我的意思是使用基於主題的通信來代替基於隊列的通信,您必須在傳遞消息時指定目的地,或者必須實現某種路由器邏輯,以根據某些特定消費者將消息路由給特定的消費者標準。 – 2010-08-17 10:54:16

+0

Hi Tushar,我讀了一些關於Topic vs. Queue的內容,你的解決方案聽起來很棒。 我不明白的唯一事情就是關於「設置消息的有效性......」爲什麼我需要設置其有效性?主題機制的定義是不是會被一個消費者消費? Ittai – Ittai 2010-08-18 11:08:42

0

看看JGroups。您可以考慮實施您的模塊/訂戶以使用jgroups來進行所需的同步。 JGroups提供可靠的多播通信。