2009-07-29 36 views
16

是否有可擴展http會話管理的最佳做法?可擴展http會話管理(java,linux)

問題空間:

  • 購物車種使用情況。用戶在網站周圍購物,最終退出;會話必須保留。在每個數據中心
  • 的Java
  • 多個數據中心
  • 多個Web服務器,Linux的

我知道有這樣做噸的途徑,我可以隨時拿出自己的具體解決方案,但我想知道人羣計算器的智慧是否可以幫助我專注於最佳實踐

一般來說,似乎有幾個方法:

  • 不要保留會話;永遠運行無狀態,宗教[不適合我...]
  • 使用j2ee,ejb和該團伙的其餘部分
  • 使用數據庫來存儲會話。我想有些工具可以使這更容易,所以我不需要自己製作所有的東西
  • 使用memcached存儲會話(或其他類型的中間存儲器,半永久存儲器)
  • 使用鍵值數據庫。比memcached更「持久」
  • 使用「客戶端會話」,這意味着所有會話信息都存在於隱藏的表單字段中,並且在客戶端之間向前和向後傳遞。什麼都不存儲在服務器上。

有什麼建議? 謝謝

回答

5

我會用一些標準的分佈式緩存解決方案去。 可能是您提供的應用程序服務器,可能是memcached,可能是terracotta 只要您使用的是足夠流行的東西(因此您知道大多數錯誤已被捕獲),選擇哪一個可能無關緊要, 。

至於你的其他想法:

  • 不要讓會議 - 像你說的不可能
  • 客戶端會話 - 太不安全 - 假如有人黑客cookie來把折扣價格在購物車
  • 使用數據庫 - 數據庫通常是解決最困難的瓶頸,不要在那裏放置超過你絕對必須的數據庫。

這些都是我的2美分:)

關於多個數據中心 - 你會希望有會議,它開始對數據中心的一些親和力。我不認爲可以在不同數據中心之間使用分佈式緩存解決方案。

5

你似乎錯過了香草複製http會話從您的清單。任何值得使用的servlet容器都支持跨集羣的會話複製。只要您放入會話的項目不是很大,並且是可序列化的,那麼使其工作起來非常容易。

http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html

編輯:看來,然而,Tomcat的會話複製不能很好地擴展到大型集羣。爲此,我建議使用JBoss + Tomcat的,這給了「好友複製」的想法:

http://www.jboss.org/community/wiki/BuddyReplicationandSessionData

+0

Tomcat 6.0,對吧? – Ran 2009-07-29 08:56:26

+0

就像現在的版本一樣,是的。 JBoss附帶了Tomcat的嵌入式版本。 – skaffman 2009-07-29 09:14:00

1

我個人還沒有管理過這樣的集羣,但是當我在大學參加一個J2EE課程時,講師說會將會話存儲在數據庫中,而不是試圖緩存它。 (無論如何,你不能有意義地緩存動態頁面。)根據定義,Http會話是客戶端,因爲session-id是一個cookie。如果客戶拒絕存儲cookie(例如他對跟蹤有偏見),那麼他不能進行會話。 你可以致電HttpSession.getId()得到這個ID。

當然數據庫是一個瓶頸,所以你最終會得到兩個集羣:一個應用服務器集羣和一個數據庫集羣。

據我所知,有狀態的消息豆類和常規的servlet HTTP會話只存在於內存沒有內置的負載均衡。

順便說一句。我不會將電子郵件地址或用戶名存儲在隱藏字段中,但購物車的內容可能不是敏感數據。

1

我寧願退出在HTTP會話中存儲用戶應用程序狀態,但這需要以不同的方式思考應用程序如何工作並使用RESTful無狀態體系結構。這通常涉及到在客戶端不支持MVWW體系結構的早期版本瀏覽器的支持。

購物車是不是一個用戶應用程序狀態它是一個應用狀態這意味着它將被存儲在數據庫中,因此管理的。假設可以共享購物車,可以有一個關聯表將用戶鏈接到一個或多個購物車。

您最大的障礙可能是如何驗證用戶的每一個請求,如果它是無狀態的。 BASIC auth是不涉及會話的最簡單方法,FORM-auth無論如何都需要會話。 JASPIC實現(如HTTP Headers或OAuth)將能夠緩解您其他地方的身份驗證問題,在這種情況下,Cookie可用於管理您的身份驗證令牌(如FORM-auth)或HTTP標頭(如SiteMinder或客戶端證書)以及Apache 。

更昂貴的數據庫(如DB2)具有跨多個數據中心工作的高可用性和災難恢復功能。請注意,它並不意味着對數據庫進行負載平衡,因爲這會對網絡流量造成很大的影響。