Session管理----分流技術

1,高併發的分流技術
tomcat的併發瓶頸:很難突破1000
測試場景:
硬件資源:如CPU的核數,內存
2,WEB層面使用NGINX分流,輕量級的WEB服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器。
特色:佔用內存少,併發能力強,穩定
穩定的緣由:由於每次開啓的時候都會建立兩個進程,一個主進程和一個守護進程
若是主進程宕機,守護進程檢測到之後,會將主進程重新開啓。
配置文件是學習nginx的基礎,conf目錄 upstream(上游) 接收請求處理和轉發,咱們主要用的就是轉發,
基於負載均衡+反向代理----也就是分流技術
默認的策略:輪詢策略
實現橫向擴展
問題:帶來session丟失的問題。
3,session管理,解決session丟失的問題有三大解決方案
一,粘性session
實現思路:利用nginx自身提供的負載均衡策略實現;
優勢:實現簡單,對應用無侵入性,無額外開銷;
缺點:一旦某個web服務器重啓或者宕機,相對應的session數據丟失。對nginx負載均衡的能力進行了弱化;
使用場景:對穩定性要求不是很高的業務場景nginx

nginx能夠實現熱加載:nginx -s reload
IP_HASH:根據客戶端IP地址進行hash計算,取模,而後路由到指定的web服務器,若是服務器掛了,nginx會從新計算,路由到新的web服務器上。
弱化了nginx的負載均衡的能力:由於可能web服務器的流量高,有的流量低。web


二,服務器session複製
實現思路:在支持session複製的web服務器上,經過配置能夠實現session同步到其餘web服務器上,達到每一個web服務器上都保存一致的session全量;
優勢:對應用無侵入性,服務器重啓或宕機不會形成session丟失;
缺點:須要依賴支持的web服務器,在數據量很大的狀況下不只佔用網絡資源,並且會致使延遲;
使用場景:只適用於web服務器比較少,且在線用戶量比較少的狀況下(session數據量少的場景)。
經驗:5臺服務器之內redis

首先找到支持session複製的服務器
1,在全部工程的web.xml配置文件里加一行配置:<distributable/>分佈式部署;
2,tomcat的server.xml的配置文件也須要配置:Cluster標籤;
3,重啓tomcat。
佔用內存資源(若是請求用戶量比較大的狀況下,須要開闢一個空間用於保存session);
經過TCP協議長鏈接的方式,主播網絡協議,使用同步非阻塞的NIO的數據傳遞和分享spring


三,session共享機制
實現思路:使用緩存技術,集中管理全部的session,全部的web服務器都從這個存儲介質中存取對應的session,實現session共享;
優勢:可靠性高,減小web服務器的資源開銷;服務器重啓或宕機不會形成session丟失;
缺點:實現上有些複雜,配置較多;增長一次網絡開銷;
使用場景:web服務器較多,要求高可用的狀況。
對應用的侵入性體如今:
1,引入jedis,spring對redis操做的jar包
2,web.xml加入filter,
<filter>
<filter-name>springSessionRepositoryFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSessionRepositoryFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3,在spring配置文件中配置redis的鏈接
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="100"/>
<property name="maxIdle" value="10"/>
</bean>數據庫

<bean id="jedisPoolConfigFactory" class="org.springframework.data.redis.connection.jedis.JedisPoolConfigFactory" destory-method="destory">
<property name="hostName" value="localhost"/>
<property name="port" value="6379"/>
<property name="timeout" value="3000"/>
<property name="usePool" value="true"/>
<property name="poolConfig" value="jedisPoolConfig"/>
</bean>緩存

<bean id="redisHttpSessionConfiguration" class="org.springframework.session.data.redis.config.annotation.web.http.redisHttpSessionConfiguration">
<property name="maxInactiveIntervalInSession" value="600"/>
</bean>tomcat

tomcat對一次http是一個標準的接口,有具體的servlet容器實現
一次http請求--Tomcat--Container--Engine--Host--Context--Wrapper--Servlet--SessionManger--sessions--session服務器

目前互聯網的架構圖:
頁面層
|
網絡層
|
應用層--nginx負載均衡---靜態資源服務器集羣和應用服務器集羣---分佈式單點登錄服務器
|
服務層--分佈式服務器集羣--搜索中間件/配置註冊中心/分佈式存儲/分佈式消息中間件
| 分佈式數據庫中間件(mycat)
數據層--文件服務器集羣 MySQL數據庫集羣(讀寫分離/分庫分表)網絡

相關文章
相關標籤/搜索