我已經看到這個問題的點點滴滴,但沒有直接回答它。羣集環境中JMS主題的HTTP使用者
這裏是假設的環境:
- 20的Java中心的服務器(即Tomcat的/ Glassfish的/ Jboss的/其他) 經由HTTP與客戶說話
- 中的服務器前的HTTP負載平衡器是不是保證到 帶你回到同一個服務器與每個客戶端連接。
- 其他任何技術都是明智的。 (JMS /駱駝/ 的Memcached/Hazelcast /不管)
我們希望喬和他的瀏覽器(可能使用Flash或HTML5或任何客戶端技術)來接收發布到可用的JMS主題的所有20的所有消息服務器。
下面是一個例子:
- 喬的第一個HTTP連接命中服務器A
- 服務器A現在有喬HTTP會話(通過cookie等)
- 服務器A訂閱他的話題(基於他的會話ID等)
- Joe的HTTP連接結束。
- 消息發佈到主題。
- 喬使得另一個連接,但這次它是由服務器F.
這就是事情對我來說有點模糊處理。
- 我們知道他退回時Joe的會話ID(也許會話在所有服務器之間共享),但JMS訂閱又如何?如果服務器F必須再次向該主題訂閱Joe,他是否錯過了一條消息?是Joe可以從中檢索這條消息的唯一服務器,或者當他在F上訂閱時它可能會發生某種魔法,並且它只知道他沒有收到該消息(可能在A上等待他)。
我想我有點不清楚什麼「訂閱」(處理方式)以及它與集羣服務器的關係。我正在使用長輪詢(cometd)和websockets來幫助客戶端在接收主題消息時的響應能力,但是當有許多服務器可以處理連接和訂閱時,必須考慮這將如何工作。我想避免服務器鎖定。
感謝您的指點。
編輯1:希望澄清一些。 BlazeDS框架中提供了一些特定的內容。它允許HTTP客戶端訂閱JMS主題並使用長輪詢實現近實時的客戶端更新,但它要求客戶端訪問服務器後,所有請求都必須返回到該服務器。所以它必須(以某種方式)保持該服務器上該客戶端的主題訂閱處於活動狀態。我想擺脫這一要求(使用任何技術/框架)。
感謝您的回覆。我熟悉EIPs/Camel以及如何查詢JMS以過濾或路由特定消息(即ActiveMQ/RabbitMQ)。我的問題更多地涉及訂閱在系統A上發生時發生的情況,然後我們在不同的系統上創建新的訂閱。如果我在不同的系統上有多個訂閱(使用相同的過濾器),我會丟失消息嗎? (或者JMS足夠聰明,知道當我切換機器時我還沒有使用主題消息)。 – h1d3m3
@ h1h3m3現在我已經改變了我的答案,我更瞭解你的問題,希望我的回答是你正在尋找的。 – ams
再次感謝您的更新,但仍然不是我所需要的。我需要更好地描述我的問題。這不一定是關於耐用性,而是關於訂閱。如果我訂購了服務器A(並且它在該服務器的內存中處於活動狀態),那麼將失去與服務器A的連接,並連接到服務器B(該服務器尚未與我的主題建立連接),B會收到正在等待的消息或者已經消耗了它?我有點不清楚「有效訂閱」實際上意味着什麼時候沒有活動http連接(即已訂閱,但不能接收) – h1d3m3