2016-08-09 70 views
0

我一直在閱讀關於該主題的文章和文檔,並且仍然無法找到易於理解和信任的內容。WildFly 10 HA部署:不會丟失會話

我目前已將我的webapp部署在WildFly 10上,作爲一個簡單的war文件。

這是一個電子商務網站,生產了幾個星期,每次我們需要部署一個新版本時,那麼......這非常煩人,因爲有些客戶現在可能正在購物,而且部署會很明顯使他們失去他們的會議,這是非常糟糕的。

我需要一個解決方案來部署新的戰爭而無需重新啓動應用程序服務器。起初,我閱讀關於羣集的文檔(域獨立配置的配置),但我不確定這對我來說是否足夠...

想象一下購物車(http會話) ,訪問集羣的第一個節點。 然後我放下了,因爲我正在部署。 好的,客戶將被重定向到羣集的第二個節點,但......會話數據仍然可用嗎?他會失去購物車的物品嗎?

我閱讀了關於粘性會話,但沒有在WildFly中配置它們。我在Amazon AWS上,所以我也可以使用ELB(負載均衡器)。 你能幫我理解我需要學習和使用什麼嗎?

回答

1

每個WildFly實例都會有它自己的會話ID,它保存在cookie中。此ID將僅恢復其來自的特定節點上的會話。

粘滯會話意味着ELB將始終將用戶重定向到羣集中的同一節點,因此不會很好地解決您的問題。

有些事情要考慮:

聚類

聚類可以幫助(不需要是域模式)。啓用HA後,會話將在節點之間自動傳輸,以便客戶端瀏覽器上的cookie將能夠恢復任一節點上的會話。這當然有問題,如果您首先升級其中一個war文件,則可能有一個對象不能再反序列化,因爲它已更改。

AWS上的WF集羣也有點棘手,因爲您不能使用UDP廣播來發現彼此。我們使用數據庫連接來跟蹤節點並進行聚類。

推出自己的

一種選擇,你可以做的是推出自己的解決方案,必須保持公正的最少量信息在客戶端上。例如:

  1. 用GUID在數據庫中創建記錄。
  2. 設置GUID到一個cookie
  3. 保存根據該GUID
  4. 在其車中的項目在數據庫中有一個過濾器會檢查GUID的cookie和每一他們擊中的部位時可以恢復他們的車。

我以前在電子商務應用中使用過這種方法。它還有一個副作用,就是您現在已將該人的購物車保存在數據庫中,並且很容易看到人們有興趣購買什麼。

使用Tomcat並行部署

您的應用程序需要一個完整的應用程序服務器?如果它只是基於servlet的,你可以嘗試使用Tomcat和它的並行部署功能。它允許您將新的.war文件部署在舊的.war文件的頂部。然後,它將繼續爲舊戰爭服務,但新的會議將轉到新戰爭文件。

如果您的應用程序足夠簡單以便能夠使用tomcat,並行部署非常酷。

+0

很好的回答。謝謝。讓我問你關於你說的一件事: '我們使用數據庫連接來跟蹤節點並進行聚類' 您能否給我更多關於您如何做到這一點的細節? –

+0

我一直在寫關於它的博客文章。基本上你必須創建一個使用JDBC_PING的jgroups堆棧。我有一個WF9的standalone.xml變體,它可以在這裏執行:https://github.com/teacurran/java-experiments/blob/master/server-configs/server_01_wf9_jdbcping.xml查看從336行開始的塊。你可以在WF10中做相同的配置。每個服務器都不會使用UDP來發現彼此,而是將自己註冊到JGROUPSPING表中的數據庫中。 – teacurran