<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          微服務服務器集群Session管理演進史

          共 2264字,需瀏覽 5分鐘

           ·

          2021-01-17 11:38


          ? 點擊上方“JavaEdge”,關(guān)注公眾號

          設為“星標”,好文章不錯過!


          應用服務器的高可用設計主要基于服務無狀態(tài)這一特性,但事實上,業(yè)務總
          是有狀態(tài):

          • 在電商網(wǎng)站,需要有購物車記錄用戶的購買信息,用戶每次購買請求都是向購物車中增加商品

          • 在社交類網(wǎng)站,需要記錄用戶的當前登錄狀態(tài)、最新發(fā)布的消息及好友狀態(tài)等,用戶每次刷新頁面都需要更新這些信息

          Web 應用中將這些多次請求修改使用的上下文對象稱作會話(Session)。單機情況下,Session 可由部署在服務器上的Web 容器( 如Tomcat) 管理。
          在使用負載均衡的集群環(huán)境中,由于負載均衡服務器可能會將請求分發(fā)到集群中的任何一臺應用服務器上,所以保證每次請求依然能夠獲得正確的Session比單機時要復雜很多。

          集群環(huán)境下,Session 管理主要有以下幾種手段:


          1 Session 復制



          早期系統(tǒng)使用的一種服務器集群Session管理機制。應用服務器開啟Web 容器的Session復制功能,在集群中的幾臺服務器之間同步Session對象,使得每臺服務器上都保存所有用戶的Session信息,這樣任何一臺機器宕機都不會導致 Session 數(shù)據(jù)丟失,而服務器使用Session時,也只需在本機獲取。




          1.1 優(yōu)點



          雖然簡單,從本機讀取Session信息也很快速,但只能使用在集群規(guī)模比較小的情況下




          1.2 缺點



          • 當集群規(guī)模較大時,集群服務器間需要大量的通信進行Session復制,占用服務器和網(wǎng)絡的大量資源,系統(tǒng)不堪負擔

          • 而且由于所有用戶的Session信息在每臺服務器上都有備份,在大量用戶訪問的情況下,甚至會出現(xiàn)服務器內(nèi)存不夠Session使用的情況

          • 而大型網(wǎng)站的核心應用集群就是數(shù)千臺服務器,同時在線用戶可達千萬,因此并不適用這種方案


          2 Session綁定(黏滯sticky)



          可利用負載均衡的源地址Hash算法實現(xiàn)。

          負載均衡服務器(比如 nginx)總是將來源于同一IP的請求分發(fā)到同一臺服務器上(也可以根據(jù)Cookie信息將同一個戶的請求總是分發(fā)到同一臺服務器上,當然這時負載均衡服務器必須工作在HTTP 協(xié)議層)。這樣在整個會話期間,用戶所有的請求都在同一臺服務器上處理,即Session綁定在某臺特定服務器上,保證Session總能在這臺服務器上獲取

          利用負載均衡的會話黏滯機制將請求綁定到特定服務器

          但是Session綁定的方案顯然不符合我們對系統(tǒng)高可用的需求。




          缺點



          一旦某臺服務器宕機,那么該機器上的Session也就不復存在了,用戶請求切換到其他機器后因為沒有Session而無法完成業(yè)務處理

          因此雖然大部分負載均衡服務器都提供源地址負載均衡算法,但很少有網(wǎng)站利用這個算法進行Session管理。


          3 利用Cookie 記錄Session



          早期系統(tǒng)使用C/S架構(gòu),一種管理Session的方式是將Session記錄在客戶端,每次請求服務器的時候,將Session放在請求中發(fā)送給服務器,服務器處理完請求后再將修改過的Session響應給客戶端
          如今的B/S架構(gòu),網(wǎng)站沒有客戶端,但是可以利用劉覽器支持的Cookie記錄Session




          3.1 缺點


          • 受Cookie大小限制,能記錄的信息有限

          • 每次請求響應都需要傳輸Cookie,影響性能

          • 如果用戶關(guān)閉Cookie,訪問就會不正常




          3.2 優(yōu)點



          由于Cookie的

          • 簡單易用

          • 可用性高

          • 支持應用服務器的線性伸縮

          • 而大部分應用需要記錄的Session 信息又比較小

          • 因此事實上,許多網(wǎng)站都或多或少地使用Cookie記錄Session。


          4 Session服務器



          那么有沒有可用性高、伸縮性好、性能也不錯,對信息大小又沒有限制的服務器集群Session管理方案呢?

          答案就是Session服務器!利用獨立部署的Session服務器(集群)統(tǒng)一管理Session,應用服務器每次讀寫Session時,都訪問Session服務器

          這種方案事實上是將應服務器的狀態(tài)分離,分為

          • 無狀態(tài)的應用服務器

          • 有狀態(tài)的Session服務器

          然后針對這兩種服務器的不同特性分別設計其架構(gòu)

          對于有狀態(tài)的Session服務器,一種比較簡單的方法是利用




          分布式緩存


          即使用cacheDB存取session信息,應用服務器接受新請求將session信息保存在redis中,當應用服務器發(fā)生故障時,web服務器會遍歷尋找可用節(jié)點,分發(fā)請求,當應用服務器發(fā)現(xiàn)session不在本機內(nèi)存時,則去redis中查找,如果找到則復制到本機,這樣實現(xiàn)session共享和高可用。



          • 數(shù)據(jù)庫等

          在這些產(chǎn)品的基礎上進行包裝,使其符合Session 的存儲和訪問要求。如果業(yè)務場景對Session 管理有比較高的要求,比如利用Session 服務集成單點登錄(SSO)、用戶服務等功能,則需要開發(fā)專門的Session服務管理平臺。


          往期推薦


          大廠如何解決數(shù)值精度/舍入/溢出問題

          硬核干貨:HTTP超時、重復請求必見坑點及解決方案

          由于不知線程池的bug,某Java程序員叕被祭天

          程序員因重復記錄日志撐爆ELK被辭退!

          擁抱Kubernetes,再見了Spring Cloud




          目前交流群已有?800+人,旨在促進技術(shù)交流,可關(guān)注公眾號添加筆者微信邀請進群


          喜歡文章,點個“在看、點贊、分享”素質(zhì)三連支持一下~

          瀏覽 79
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产乱子伦精品久久 | 无码有码一区 | 免费黄色成人视频 | 伊人久久大香线蕉综合色狠狠 | 亚洲蜜臀AV乱码久久精品蜜桃图片 |