我們有一個異步JMS消息傳遞系統的同步HTTP請求 - 響應前端。如何從JMS中讀取和收集響應消息,並使它們可用於正確的servlet線程?
每個HTTPRequest的HTTP查詢servlet在查詢隊列中創建相應的JMS消息。該查詢由後端處理,併爲此查詢創建一對應答消息。在JMS中組織接收響應消息並確保他們到達正確的servlet線程以便能夠制定HTTPResponse的好方法是什麼?
查詢和響應是非事務性的,不需要持久化。他們大多數是閱讀查詢。如果在45秒內沒有讀取響應,則servlet會生成超時響應。吞吐量很重要,但是。我們需要處理越來越多的查詢。這個系統已經有十年的歷史了,而且還需要再維持兩年左右的時間。
我們正在使用SonicMQ。我們爲所有回覆創建了一個隊列。 servlet容器有一個連接到它用於讀寫的代理。我們爲每個登錄用戶生成一個監聽器線程(大約1500個併發)此線程有一個接收器和一個消息選擇器,該選擇器僅爲該特定用戶選擇響應消息。一旦servlet線程發送了它的查詢消息,它就會等待用戶的偵聽器線程通知它它已經讀取了一個響應。
我們曾經有一個由所有發送者和所有接收者共享的QueueSession。這實際上工作(!),雖然會議正式不是線程安全的。每個線程(servlet線程和偵聽器線程)創建一個QueueSession可以在一定程度上提高性能,但事情仍然不太穩定,我們希望更好地組織。
我試過每個用戶會話創建一個臨時隊列,而不是使用消息選擇器的單個隊列,但這會顯着減慢事物的速度。
什麼會更好/正確的方式來組織這個?
將JMS從等式中移除選項,還是您必須與此後端系統交互的「途徑」? – 2013-03-03 22:47:24
@RyanStewart後端當前由單獨的JVM組成,這些JVM從查詢隊列中讀取,執行查詢並將響應消息發佈到客戶端隊列。這確實有一定的優勢,這是一個微型巴士。系統需要運行2年左右。所以極端的改變是不可能的。將查詢執行移入tomcat(servlet容器)是我們已經討論過的,但並不是非常有信心。你認爲我們應該? – flup 2013-03-03 23:31:10