2010-06-29 66 views
1

我有一個Java類Processor正在監聽的JMS主題,並正在努力跟上消息所到達的,所以我們已經決定走併發速度:如何設計非EJB負載平衡應用程序?

單一類聽的話題誰的工作就是將消息傳遞給工作線程池,實際上成爲負載平衡器。它還必須防止2名工作人員爲同一客戶處理消息。

我期望在互聯網上有相當多的關於這方面的信息,但是似乎一切似乎都建議在應用服務器管理池並進行平衡的情況下使用EJB。我相信這肯定是一個非常常見的問題,但似乎無法找到任何圖書館或設計模式來協助。我是否比自己做得更多,應該鑽研並編寫自己的代碼?

+0

處理器是否作爲任何應用程序服務器之外的獨立客戶端運行? – JoseK 2010-06-29 11:21:07

+0

是的,現在是。它運行服務器端,填充Web應用程序以後可以查詢的數據庫。 – James 2010-06-29 11:48:40

回答

0

這是一個很容易解決的問題,聽衆羣體。這就是應用服務器會爲你做的。

我會得到一個很好的應用程序服務器,並使用它的MDB來快速解決這個問題。調整游泳池的大小以保持良好狀態。

如果你堅持編寫自己的代碼,可以獲得一個好的開源池實現並使用它。

如果它必須是非EJB,請考慮Spring。它具有消息驅動的POJO,可能正是您所需要的。

1

爲什麼不使用一個隊列而不是一個主題,並且有多個來自該隊列的應用程序處理消息的實例?

+0

我們現在有一個話題的原因是我們有多個運行的應用程序過濾出消息,而不是接收100 msg/s,只有幾個應用程序。不過,你有一個好點,如果我們能跟上,一個話題是不必要的。但是,爲了防止兩個實例處理同一個客戶,還需要中間放置一些東西? – James 2010-06-29 11:51:59

+0

@詹姆斯:不知道你的意思是「客戶」,你有每個客戶的消息?您可以使用「消息選擇器」來過濾每個消費者的消息... – pgras 2010-06-29 13:04:44

+0

消息具有customerId。由於許多實例正在處理消息,因此會處理許多customerId。我想解釋的是,同一個客戶ID在任何時候都不會被兩個實例處理是非常重要的,因此我需要設置一些鎖定和消息優先級,因此我必須「坐在中間」像我說的那樣? – James 2010-06-29 16:09:19